1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894
|
% \iffalse meta-comment
%
% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX base system.
% -------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% The list of all files belonging to the LaTeX base distribution is
% given in the file `manifest.txt'. See also `legal.txt' for additional
% information.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
%
% \fi
% ^^A -*-LaTeX-*-
%
% ^^A These shouldn't come out in .ist files, hence the module
% ^^A comments, or in the printed version, hence temporary comment
% ^^A category for `<'
%\catcode`\<=14
%<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01]
%<+package> \ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
%<+package|shortvrb> [2004/02/09 v2.1b
%<+package|shortvrb> Standard LaTeX documentation package (FMi)]
%\catcode`\<=12
%
% \CheckSum{2171}
%% \CharacterTable
%% {Upper-case \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
%% Lower-case \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
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
%\iffalse This is a METACOMMENT
% Everything up to the next `\ fi' (without a blank) will
% be ignored. This is necessary because `%' may no longer
% be a comment mark when this file is read in.
%
%
%% Package `doc' to use with LaTeX 2e
%% Copyright (C) 1989-1999 Frank Mittelbach, all rights reserved.
%
%
% Version: Date: Changes:
%
% 1.0a 5.5.88 This is nothing but a collection of tests and
% hacks. It is certainly going to be greatly
% changed.
% Better not to use it!
% 1.5a and earlier... are not longer recorded
% 1.5b and higher... are documented with the (undocumented) \changes
% feature.
%\fi
% \changes{v1.5f}{1989/4/29}{Thanks to Brian who documented the
% \cs{changes} macro feature.}
% \changes{v1.5g}{1989/5/07}{MacroTopsep now called MacrocodeTopsep and
% new MacroTopsep added}
% \changes{v1.5h}{1989/05/17}{All lines shortened to <72 characters}
% \changes{v1.5j}{1989/06/09}{Corrections by Ron Whitney added}
% \changes{v1.5q}{1989/11/03}{`\ldots{}Listing macros renamed to
% `\ldots{}Input. Suggested by R. Wonneberger}
% \changes{v1.5w}{1990/02/05}{Counter codelineno renamed to CodelineNo}
% \changes{v1.9a}{1993/12/02}{Upgrade for LaTeX2e}
% \changes{v1.9d}{1993/12/20}{Protected changes entry.}
% \changes{v1.0p}{1994/05/21}{Use new error commands}
%
%
% \hyphenation{make-index}
%
% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
% \DoNotIndex{\@flushglue,\@gobble,\@input}
% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
% \DoNotIndex{\mathcal,\csname,\def,\documentstyle,\dospecials,\edef}
% \DoNotIndex{\egroup}
% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
% \DoNotIndex{\ifcase}
% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
% \DoNotIndex{\strutbox}
% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary}
% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
% \DoNotIndex{\nopagebreak}
% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
% \DoNotIndex{\[,\{,\},\]}
% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
% \DoNotIndex{\baselineskip,\begin,\tw@}
% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
% \DoNotIndex{\bfdefault}
%
% \MakeShortVerb{\"}
% \setcounter{StandardModuleDepth}{1}
%
% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print
% \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign
%
% \newcommand{\DOC}{\texttt{doc}}
%
% \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}}
% \GetFileInfo{doc.sty}
%
% \title{The \DOC{} and \texttt{shortvrb} Packages\thanks
% {This file has version number \fileversion{} dated \filedate{}.}}
% \author{Frank Mittelbach\thanks{Further commentary added at Royal
% Military College of Science by B. Hamilton Kelly; English
% translation of parts of the original German commentary
% provided by Andrew Mills; fairly substantial additions,
% particularly from \texttt{newdoc}, and
% documentation of post-v1.5q features added at v1.7a by Dave
% Love (SERC Daresbury Lab). Extraction of \texttt{shortvrb}
% package added by Joachim Schrod (TU~Darmstadt).}\\
% Gutenberg Universit\"at Mainz}
%
% \maketitle
%
% \begin{abstract}
% This package contains the definitions that are necessary to
% format the documentation of package files. The package was
% developed in Mainz in cooperation with the Royal Military College
% of Science. This is an update which documents various changes
% and new features in \DOC{} and integrates the features of
% \textsf{newdoc}.
% \end{abstract}
%
% \newif\ifmulticols
% \IfFileExists{multicol.sty}{\multicolstrue}{}
%
% \ifmulticols
% \addtocontents{toc}{\protect\begin{multicols}{2}}
% \fi
%
% {\parskip 0pt ^^A We have to reset \parskip
% ^^A (bug in \LaTeX)
% \tableofcontents
% }
%
% \changes{v1.7a}{1992/02/25}{Miscellaneous small changes to the text}
%
% \ifmulticols
% \begin{multicols}{2}[\section*{Preface to version 1.7}]
% \else \section*{Preface to version 1.7} \fi
%
% This version of \texttt{doc.dtx} documents changes which have occurred
% since the last published version \cite{art:doc} but which have been
% present in distributed versions of \texttt{doc.sty} for some time. It
% also integrates the (undocumented) features of the distributed
% \texttt{newdoc.sty}.
%
% The following changes and additions have been made to the user
% interface since the published version~\cite{art:doc}. See
% \S\ref{sec:interface} for more details.
% \begin{description}
% \item[Driver mechanism] "\DocInput" is now used in the driver file
% to input possibly multiple independent \DOC{} files and \DOC{} no
% longer has to be the last package. "\IndexListing" is replaced
% by "\IndexInput";
% \item[Indexing] is controlled by "\PageIndex" and "\CodelineIndex",
% one of which must be specified to produce an index---there is no
% longer a "\makeindex" in the default "\DocstyleParms";
% \item[The \texttt{macro} environment] now takes as argument the
% macro name {\em with\/} the backslash;
% \item[Verbatim text] Newlines are now forbidden inside "\verb" and
% commands "\MakeShortVerb" and "\DeleteShortVerb" are provided for
% verbatim shorthand;
% \item[\texttt{\bslash par}] can now be used in "\DoNotIndex";
% \item[Checksum/character table support] for ensuring the integrity
% of distributions is added;
% \item[\texttt{\bslash printindex}] becomes "\PrintIndex";
% \item[\texttt{multicol.sty}] is no longer necessary to use \DOC{} or
% print the documentation (although it is recommended);
% \item[`Docstrip' modules] are recognised and formatted specially.
% \end{description}
%
% As well as adding some completely new stuff,
% the opportunity has been taken to add some commentary to the code
% formerly in \texttt{newdoc.sty} and that added after version 1.5k of
% \texttt{doc.sty}. Since (as noted in the sections concerned) this
% commentary wasn't written by Frank Mittelbach but the code was, it is
% probably {\em not\/} true in this case that ``if the code and
% comments disagree both are probably wrong''!
%
% \subsection*{Bugs}
%
% There are some known bugs in this version:
% \begin{itemize}
% \item The "\DoNotIndex" command doesn't work for some single
% character commands most noticeable "\%".
% \item The `General changes' glossary entry would come out after
% macro names with a leading "!" and possibly a leading |"|;
% \item If you have an old version of \textsf{makeindex} long "\changes"
% entries will come out strangely and you may find the section
% header amalgamated with the first changes entry. Try to get an
% up-to-date one (see p.~\pageref{makeindex:version});
% \item Because the accompanying \textsf{makeindex} style files support
% the inconsistent attribute specifications of older and newer
% versions \textsf{makeindex} always complains about three `unknown
% specifier's when sorting the index and changes entries.
% \item If "\MakeShortVerb" and "\DeleteShortVerb" are used with
% single character arguments, e.g., "{|}" instead of "{\|}" chaos
% may happen.
% \end{itemize}
% (Some `features' are documented below.)
%
% \subsection*{Wish list}
%
% \begin{itemize}
% \item Hooks to allow "\DescribeMacro" and "\DescribeEnv" to write
% out to a special file information about the package's `exported'
% definitions which they describe. This could subsequently be
% included in the \texttt{docstrip}ped \texttt{.sty} file in a
% suitable form for use by smart editors in command completion,
% spelling checking etc., based on the packages used in a document.
% This would need agreement on a `suitable form'. \item Indexing of
% the modules used in \texttt{docstrip}'s "%<" directives. I'm not
% sure how to index directives containing module combinations; \item
% Writing out bibliographic information about the package; \item Allow
% turning off use of the special font for, say, the next guarded
% block.
% \end{itemize}
%
% \ifmulticols
% \end{multicols}
%
% \begin{multicols}{2}[\medskip \rule{\textwidth}{.3pt}
% \section{Introduction}]
% \else
% \section{Introduction}
% \fi
%
% The \TeX{} macros which are described here allow definitions and
% documentation to be held in one and the same file. This has the
% advantage that normally very complicated instructions are made
% simpler to understand by comments inside the definition. In addition
% to this, updates are easier and only one source file needs to be
% changed. On the other hand, because of this, the package files are
% considerably longer: thus \TeX{} takes longer to load them. If this
% is a problem, there is an easy remedy: one needs only to run the
% \texttt{docstrip.tex} program that removes nearly all lines that begin
% with a
% percent sign.
%
% The idea of integrated documentation was born with the development
% of the \TeX{} program; it was crystallized in Pascal with the \Web{}
% system. The advantages of this method are plain to see (it's easy
% to make comparisons \cite{art:Knuthliterat}). Since this
% development, systems similar to \Web{} have been developed for other
% programming languages. But for one of the most complicated
% programming languages (\TeX) the documentation has however been
% neglected. The \TeX{} world seems to be divided between:---
% \begin{itemize} \item a couple of ``wizards'', who produce many
% lines of completely unreadable code ``off the cuff'', and \item many
% users who are amazed that it works just how they want it to do. Or
% rather, who despair that certain macros refuse to do what is
% expected of them.\end{itemize}
%
% I do not think that the \Web{} system is {\em the\/} reference work;
% on the contrary, it is a prototype which suffices for the
% development of programs within the \TeX{} world. It is sufficient,
% but not totally sufficient.\footnote{I know that this will be seen
% differently by a few people, but this product should not be seen as
% the finished product, at least as far as applications concerning
% \TeX{} are concerned. The long-standing debate over `multiple
% change files' shows this well.} As a result of \Web, new programming
% perspectives have been demonstrated; unfortunately, though, they
% haven't been developed further for other programming languages.
%
% The method of documentation of \TeX{} macros which I have introduced
% here should also only be taken as a first sketch. It is designed
% explicitly to run under \LaTeX{} alone. Not because I was of the
% opinion that this was the best starting point, but because from this
% starting point it was the quickest to develop.\footnote{This
% argument is a bad one, however, it is all too often trotted out.} As
% a result of this design decision, I had to move away from the
% concept of modularization; this was certainly a step backward.
%
% I would be happy if this article could spark off discussion over
% \TeX\ documentation. I can only advise anyone who thinks that they
% can cope without documentation to ``Stop Time'' until he or she
% completely understands the \AmSTeX{} source code.
%
%
%
%
%
% \subsection{Using the \DOC{} package}
%
% Just like any other package, invoke it by requesting it with a
% |\usepackage| command in the preamble. \textsf{Doc}'s use of
% |\reversemarginpars| may make it incompatible with some classes.
% \changes{v1.7a}{1992/02/25}{Altered usage info}
%
%
% \ifmulticols\end{multicols}\fi
%
%
% \section{The User Interface}\label{sec:interface}
% \subsection{The driver file}
%
% If one is going to document a set of macros with the \DOC{}
% package one has to prepare a special driver file which produces the
% formatted document. This driver file has the following
% characteristics:
%
% \noindent |\documentclass[|\meta{options}]^^A
% |{|\meta{document-class}|}|\\[1pt]
% |\usepackage{doc}|\\[3pt]
% \hspace*{10pt}\meta{preamble}\\[3pt]
% |\begin{document}|\\[3pt]
% \hspace*{10pt}\meta{special input commands}\\[3pt]
% |\end{document}|
%
% The \meta{document-class} might be any document class, I normally
% use \texttt{article}.
%
% In the \meta{preamble} one should place declarations which
% manipulate the behavior of the \DOC{} package like
% |\DisableCrossrefs| or |\OnlyDescription|.
%
% \DescribeMacro\DocInput \DescribeMacro\IndexInput
% Finally the \meta{special input commands} part should contain one or
% more |\DocInput|\meta{file name} and/or
% |\IndexInput|\meta{file name} commands. The
% |\DocInput| command is used for files prepared for the
% \DOC{} package whereas |\IndexInput| can be used for all kinds of
% macro files. See page \pageref{..Input} for more details of
% "\IndexInput". Multiple "\DocInput"s can be used with a
% number of included files which are each self-contained
% self-documenting packages---for instance, each containing
% "\maketitle".
%
% As an example, the driver file for the \DOC{} package itself is
% the following text surrounded by "%<*driver>" and "%</driver>".
% To produce the documentation you can simply run the \texttt{.dtx}
% file through \LaTeX{} in which case this code will be executed
% (loading the document class \texttt{ltxdoc}, etc.) or you can
% extract this into a separate file by using
% the \texttt{docstrip} program.
% The line numbers below are added by
% \DOC{}'s formatting.
% Note that the class \textsf{ltxdoc} has the \DOC{} package
% preloaded.
% \changes{v1.7a}{1992/03/06}{Added
% docstrip-derivable driver file as example.}
% \changes{v1.7c}{1992/04/01}{Expurgated ltugboat.sty from driver.}
% \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\EnableCrossrefs
%\DisableCrossrefs % Say \DisableCrossrefs if index is ready
\CodelineIndex
\RecordChanges % Gather update information
%\OnlyDescription % comment out for implementation details
%\OldMakeindex % use if your MakeIndex is pre-v2.9
\setlength\hfuzz{15pt} % dont make so many
\hbadness=7000 % over and under full box warnings
\begin{document}
\DocInput{doc.dtx}
\end{document}
%</driver>
% \end{macrocode}
%
%
% \subsection{General conventions}
%
% A \TeX{} file prepared to be used with the `doc' package
% consists of `documentation parts' intermixed with `definition
% parts'.
%
% Every line of a `documentation part' starts with a percent sign
% (|%|) in column one. It may contain arbitrary \TeX{} or
% \LaTeX{} commands except that the character `|%|' cannot be
% used as a comment character.
% \SortIndex{\string^\string^A}{\string\verb\verbatimchar
% \string^\string^A\verbatimchar \encapchar usage} To allow user
% comments, the |^^A| character is defined as a comment character
% later on. Such `metacomments' may be also be included simply by
% surrounding them with "\iffalse" \ldots~"\fi".
%
% All other parts of the file are called `definition parts'. They
% contain fractions of the macros described in the `documentation
% parts'.
%
% If the file is used to define new macros (e.g.\ as a package file in
% the |\usepackage| macro), the `documentation parts' are
% bypassed at high speed and the macro definitions are pasted
% together, even if they are split into several `definition parts'.
%
% \DescribeEnv{macrocode}
% On the other hand, if the documentation of these macros is to be
% produced, the `definition parts' should be typeset verbatim. To
% achieve this, these parts are surrounded by the \textsf{macrocode}
% environment.
% More exactly: before a `definition part' there should be a line
% containing\\
% \hspace*{\MacroIndent}\verb*+% \begin{macrocode}+\\
% and after this part a line\\
% \hspace*{\MacroIndent}\verb*+% \end{macrocode}+\\
% There must be {\em exactly\/} four spaces between the |%|
% and |\end{macrocode}| --- \TeX{} is looking for this string
% and not for the macro while processing a `definition part'.
%
% Inside a `definition part' all \TeX{} commands are allowed; even the
% percent sign could be used to suppress unwanted spaces etc.
%
% \DescribeEnv{macrocode*} Instead of the \textsf{macrocode}
% environment one can also use the \textsf{macrocode$*$} environment
% which produces the same results except that spaces are printed as
% \nopagebreak\verb*+ + characters.
%
%
%
% \subsection{Describing the usage of new macros}
%
% \DescribeMacro\DescribeMacro
% When you describe a new macro you may use |\DescribeMacro| to
% indicate that at this point the usage of a specific macro is
% explained. It takes one argument which will be printed in the margin
% and also produces a special index entry. For example, I used
% |\DescribeMacro{\DescribeMacro}| to make clear that this is the
% point where the usage of |\DescribeMacro| is explained.
%
% \DescribeMacro\DescribeEnv
% An analogous macro |\DescribeEnv| should be used to indicate
% that a \LaTeX{} environment is explained. It will produce a somewhat
% different index entry. Below I used |\DescribeEnv{verbatim}|.
%
% \DescribeEnv{verbatim}
% It is often a good idea to include examples of the usage of new macros
% in the text. Because of the |%| sign in the first column of every
% row, the \textsf{verbatim} environment is slightly altered to suppress
% those
% characters.\footnote{These macros were written by Rainer
% Sch\"opf~\cite{art:verbatim}. He also
% provided a new \textsf{verbatim} environment
% which can be used inside of other macros.}
% \DescribeEnv{verbatim*}
% The \textsf{verbatim$*$} environment is changed in the same way.
% \changes{v1.7a}{1992/02/26}{Documented \cs{verb} change.}
% \DescribeMacro\verb
% The "\verb" command is re-implemented to give an error report if a
% newline appears in its argument.
% The \textsf{verbatim} and \textsf{verbatim$*$} environments set text
% in the style defined by "\MacroFont"~(\S\ref{sec:macrofont}).
%
%
%
% \subsection{Describing the definition of new macros}
%
% \DescribeEnv{macro}
% To describe the definition of a new macro we use the \textsf{macro}
% environment. It has one argument: the name of the new
% macro.\footnote{This is a change to the style design I described in
% ^^A \TUB ^^A removed in case ltugboat.sty not used
% \textsl{TUGboat\/}\ 10\#1 (Jan.~89). We finally decided
% that it would
% be better to use the macro name {\em with\/} the
% backslash as an argument.}
% This argument is also used to print the name in the margin and to
% produce an index entry.
% Actually the index entries for usage and definition are different to
% allow an easy reference.
% This environment might be nested. In this case the
% labels in the margin are placed under each other.
% \changes{v1.7a}{1992/02/26}{Note on need for some text in macro env.}
% There should be some text---even if it's just an empty
% "\mbox{}"---in this environment before "\begin{macrocode}" or the
% marginal label won't print in the right place.
%
% \DescribeMacro\MacrocodeTopsep
% \DescribeMacro\MacroTopsep
% There also exist four style parameters: |\MacrocodeTopsep| and
% |\MacroTopsep| are used to control the vertical spacing above
% and below the \textsf{macrocode} and the \textsf{macro}
% \DescribeMacro\MacroIndent
% environment, |\MacroIndent| is used to indent the lines of code
% and
% \DescribeMacro\MacroFont \label{sec:macrofont}
% |\MacroFont| holds the font and a possible size change command
% for the code lines, the "verbatim"["*"] environment and the macro
% names printed in the margin. If you want
% to change their default values in a
% class file (like \texttt{ltugboat.cls}) use the |\DocstyleParms|
% command described below. Starting with release 2.0a it can now
% be changed directly as long as the redefinition happens before
% the |\begin{document}|.
%
%
%
%
% \subsection{Formatting the margins}
%
% \DescribeMacro\PrintDescribeMacro
% \DescribeMacro\PrintDescribeEnv
% \DescribeMacro\PrintMacroName
% \DescribeMacro\PrintEnvName
% As mentioned earlier, some macros and the \textsf{macro} environment
% print their arguments in the margin. This is actually done by four
% macros which are user
% definable.\footnote{You may place the changed definitions in a
% separate package
% file or at the beginning of the documentation
% file.
% For example, if you don't like any names in the
% margin
% but want a fine index you can simply
% \texttt{\bslash let}
% these macros equal \texttt{\bslash @gobble}.
% The doc package won't redefine any existing
% definitions of these macros.}
% They are named |\PrintDescribeMacro|, |\PrintDescribeEnv|,
% |\PrintMacroName| (called by the \textsf{macro} environment) and
% |\PrintEnvName| (called by the \textsf{environment} environment).
%
%
% \subsection{Using a special escape character}
%
% \DescribeMacro\SpecialEscapechar
% If one defines complicated macros it is sometimes necessary to
% introduce a new escape character because the `|\|' has got a
% special |\catcode|. In this case one can use
% |\SpecialEscapechar| to indicate which character is actually
% used to play the r\^ole of the `|\|'. A scheme like this is
% needed because the \textsf{macrocode} environment and its counterpart
% \textsf{macrocode$*$} produce an index entry for every occurrence of a
% macro name. They would be very confused if you didn't tell them that
% you'd changed |\catcode|$\,$s. The argument to
% |\SpecialEscapechar| is a single-letter control sequence, that
% is, one has to use "\|" for example to denote that `\verb+|+'
% is used as an escape character. |\SpecialEscapechar| only
% changes the behavior of the next \textsf{macrocode} or
% \textsf{macrocode$*$} environment.
%
% The actual index entries created will all be printed with |\|
% rather than \verb+|+, but this probably reflects their usage, if not
% their definition, and anyway must be preferable to not having any
% entry at all. The entries {\em could\/} be formatted appropriately,
% but the effort is hardly worth it, and the resulting index might be
% more confusing (it would certainly be longer!).
%
%
% \subsection{Cross-referencing all macros used}
%
% \DescribeMacro\DisableCrossrefs \DescribeMacro\EnableCrossrefs As
% already mentioned, every new macro name used within a
% \textsf{macrocode} or \textsf{macrocode$*$} environment will produce
% an index entry. In this way one can easily find out where a specific
% macro is used. Since \TeX{} is considerably slower when it has to
% produce such a bulk of index entries one can turn off this feature
% by using |\DisableCrossrefs| in the driver file. To turn it on again
% just use |\EnableCrossrefs|.\footnote{Actually, \texttt{\bslash
% EnableCrossrefs} changes things more drastically; any following
% \texttt{\bslash DisableCrossrefs} which might be present in the
% source will be ignored.}
%
%
% \DescribeMacro\DoNotIndex
% But also finer control is provided. The |\DoNotIndex| macro
% takes a list of macro names separated by commas. Those names won't
% show up in the index. You might use several |\DoNotIndex|
% commands: their lists will be concatenated. In this article I used
% |\DoNotIndex| for
% all macros which are already defined in \LaTeX.
%
% All three above declarations are local to the current group.
%
% Production (or not) of the index (via the "\makeindex" commend) is
% controlled by using or omitting the following declarations in the
% driver file preamble; if neither is used, no index is produced.
% \DescribeMacro\PageIndex Using "\PageIndex" makes all index
% entries refer to their page number; with
% \DescribeMacro\CodelineIndex "\CodelineIndex", index entries
% produced by "\DescribeMacro" and "\DescribeEnv" refer to page number
% but those produced by the \textsf{macro} environment refer to the
% code lines, which will be numbered automatically.\footnote{The line
% number is actually that of the first line of the first
% \textsf{macrocode} environment in the \textsf{macro} environment.}
% \DescribeMacro\theCodelineNo
% The style of this numbering can be controlled by defining the macro
% "\theCodelineNo". Its default definition is to use scriptsize
% arabic numerals; a user-supplied definition won't be overwritten.
%
% \DescribeMacro\CodelineNumbered
% When you don't wish to get an index but want your code lines
% numbered use "\CodelineNumbered" instead of "\CodelineIndex". This
% prevents the generation of an unnecessary ".idx" file.
%
%
% \subsection{Producing the actual index entries}
%
% Several of the aforementioned macros will produce some sort of index
% entries. These entries have to be sorted by an external
% program---the current implementation assumes that the
% \textsf{makeindex} program by Chen~\cite{art:Chen} is used.
%
% But this isn't built in: one has only to redefine some of the
% following macros to be able to use any other index program. All
% macros which are installation
% dependent are defined in such a way that they won't overwrite a
% previous definition. Therefore it is safe to put the changed
% versions in a package file which might be read in before the doc
% package.
%
% To allow the user to change the specific characters recognized by
% his or her index program all characters which have special meaning
% in the \textsf{makeindex} program are given symbolic
% names.\footnote{I don't know if there exists a program which needs
% more command characters, but I hope not.}
% However, all characters used should be of |\catcode| other than
% `letter' (11).
%
% \DescribeMacro{\actualchar}
% The |\actualchar| is used to separate the `key' and the actual
% index entry.
% \DescribeMacro{\quotechar}
% The |\quotechar| is used before a special index program
% character to suppress its special meaning.
% \DescribeMacro{\encapchar}
% The |\encapchar| separates the indexing information from a
% letter string which \textsf{makeindex} uses as a \TeX{} command to
% format the page number associated with a special entry. It is used
% in this package to apply the |\main| and the |\usage|
% commands.
% \DescribeMacro{\levelchar}
% Additionally |\levelchar| is used to separate `item',
% `subitem' and `subsubitem' entries.
%
% It is a good idea to stick to these symbolic names even if you know
% which index program is used. In this way your files will be
% portable.
%
% \DescribeMacro\SpecialMainIndex
% \DescribeMacro\SpecialMainEnvIndex
% To produce a main index entry for a macro the
% |\SpecialMainIndex| macro\footnote{This macro is called by the
% \textsf{macro} environment.} may be used. It is called `special'
% because it has to print its argument verbatim.
% A similar macro, called |\SpecialMainEnvIndex| is used for indexing
% the main definition point of an
% environment.\footnote{This macro is called by the
% \textsf{environment} environment.}
% \DescribeMacro\SpecialIndex
% If you want a normal index entry for a macro name
% |\SpecialIndex| might be used.\footnote{This macro is called
% within the \textsf{macrocode} environment when encountering a macro
% name.}
% \DescribeMacro\SpecialUsageIndex
% \DescribeMacro\SpecialEnvIndex
% To index the usage of a macro or an environment
% |\SpecialUsageIndex| and |\SpecialEnvIndex| may be used.
% \DescribeMacro\SortIndex
% Additionally a |\SortIndex| command is provided. It takes two
% arguments---the sort key and the actual index entry.
%
% All these macros are normally used by other macros; you will need
% them only in an emergency.
%
% \DescribeMacro\verbatimchar
% But there is one characteristic worth mentioning: all macro names in
% the index are typeset with the |\verb*| command. Therefore one
% special character is needed to act as a delimiter for this command.
% To allow a change in this respect, again this character is
% referenced indirectly, by the macro |\verbatimchar|. It expands
% by default to \verb?+? but if your code lines contain macros with
% `\texttt{+}' characters in their names (e.g.\ when you use \verb?\+?)
% you will end up with an index entry containing \verb?\verb+\++?
% which will be typeset as `\verb+\++' and not as `\verb?\+?'. In this
% case you should redefine |\verbatimchar| globally or locally to
% overcome this problem.
%
% \DescribeMacro\*
% We also provide a |\*| macro. This is intended to be used for
% index entries like
% \begin{quote}
% index entries \\
% \hspace*{30pt} Special macros for \*
% \end{quote}
% Such an entry might be produced with the line:
%\begin{verbatim}
% \index{index entries\levelchar Special macros for \*}
%\end{verbatim}
%
% \DescribeMacro\OldMakeindex
% Versions of \textsf{makeindex} prior to 2.9 had some bugs affecting
% \DOC{}. One of these,
% pertaining to the "%" character doesn't have a work-around
% appropriate for versions with and without the
% bug.\label{makeindex:version} If
% you have an old version, invoke "\OldMakeindex" in a
% package file or the driver file to prevent problems with index entries
% such as "\%", although you'll probably normally want to turn off
% indexing of "\%" anyway. Try to get an up-to-date \textsf{makeindex}
% from one of the \TeX{} repositories.
%
%
% \subsection{Setting the index entries}
%
% \changes{v1.7a}{1992/03/11}{Usage note on gind.ist.} After the first
% formatting pass through the \texttt{.dtx} file you need to sort the
% index entries written to the \texttt{.idx} file using
% \textsf{makeindex} or your favourite alternative. You need a
% suitable style file for \textsf{makeindex} (specified by the
% \texttt{-s} switch). A suitable one is supplied with \DOC{},
% called \texttt{gind.ist}.
%
% \DescribeMacro\PrintIndex
% To read in and print the sorted index, just put the
% |\PrintIndex| command as the last (commented-out, and thus
% executed during the documentation pass through the file) command
% in your package file. Precede it by any bibliography commands
% necessary for your citations.
% Alternatively, it may be more convenient to put all such calls
% amongst the arguments of the |\StopEventually| macro, in
% which case a |\Finale| command should appear at the end of
% your file.
%
% \DescribeEnv{theindex}
% Contrary to standard \LaTeX, the index is typeset in three columns
% by default. This is controlled by the \LaTeX{} counter
% `\textsf{IndexColumns}' and can therefore be changed with a
% |\setcounter| declaration. Additionally one doesn't want to
% start a new page unnecessarily. Therefore the \textsf{theindex}
% environment is redefined.
% \DescribeMacro\IndexMin
% When the \textsf{theindex} environment starts it will measure how much
% space is left on the current page. If this is more than
% |\IndexMin| then the index will start on this page. Otherwise
% |\newpage| is called.
%
% Then a short introduction about the meaning of several index entries
% is typeset (still in onecolumn mode). Afterwards the actual index
% entries follow in multi-column mode.
% \DescribeMacro\IndexPrologue
% You can change this prologue with the help of the
% |\IndexPrologue| macro. Actually the section heading is also
% produced in this way, so you'd better write something like:
% \begin{verbatim}
% \IndexPrologue{\section*{Index} The index entries underlined ...}
%\end{verbatim}
% When the \textsf{theindex} environment is finished the last page will
% be reformatted to produce balanced columns. This improves the layout
% and allows the next article to start on the same page.
% \DescribeMacro\IndexParms
% Formatting of the index columns (values for |\columnssep|
% etc.)\ is controlled by the |\IndexParms| macro. It assigns the
% following values:
% \SpecialUsageIndex{\parindent}\SpecialUsageIndex{\columnsep}^^A
% \SpecialUsageIndex{\parskip}\SpecialUsageIndex{\rightskip}^^A
% \SpecialUsageIndex{\mathsurround}\SpecialUsageIndex{\parfillskip}
% \begin{center}
% \begin{tabular}{l@{\,=\,}ll@{\,=\,}l}
% |\parindent| & \IndexParms \the\parindent &
% |\columnsep| & \IndexParms \the\columnsep \\
% |\parskip| & \IndexParms \the\parskip &
% |\rightskip| & \IndexParms
% \expandafter\dimenvalue\the\rightskip \\
% |\mathsurround| & \IndexParms \the\mathsurround &
% |\parfillskip| & \IndexParms
% \expandafter\dimenvalue\the\parfillskip
% \end{tabular}
% \end{center}
% \DescribeMacro{\@idxitem}
% Additionally it defines |\@idxitem| (which will be used when an
% |\item| command is encountered) and selects |\small| size.
% If you want to change any of these values you have to define them
% all.
%
% \DescribeMacro\main
% \DescribeMacro\usage
% The page numbers for main index entries are encapsulated by the
% |\main| macro (underlining its argument) and the numbers
% denoting the description are encapsulated by the |\usage| macro
% (which produces {\em italics}). As usual these commands are user
% definable.
%
%
% \subsection{Changing the default values of style parameters}
%
% \DescribeMacro\DocstyleParms If you want to overwrite some default
% settings made by the \DOC{} package, you can either put your
% declarations in the driver file (that is after \texttt{doc.sty} is
% read in) or use a separate package file for doing this work. In the
% latter case you can define the macro |\DocstyleParms| to contain all
% assignments. This indirect approach is necessary if your package file
% might be read before the \texttt{doc.sty}, when some of the
% registers are not allocated. Its default definition is null.
%
% The doc package currently assigns values to the following
% registers:
% \SpecialUsageIndex{\IndexMin}\SpecialUsageIndex{\MacrocodeTopsep}^^A
% \SpecialUsageIndex{\MacroTopsep}^^A
% \SpecialUsageIndex{\MacroIndent}\SpecialUsageIndex{\marginparpush}^^A
% \SpecialUsageIndex{\marginparwidth}\SpecialUsageIndex{\tolerance}
% \begin{center}
% \begin{tabular}{l@{\,=\,}ll@{\,=\,}l}
% |\IndexMin| & \the\IndexMin &
% |\MacroTopsep| & \the\MacroTopsep \\
% |\marginparwidth|& \the\marginparwidth &
% |\MacroIndent| & \the\MacroIndent \\
% |\marginparpush| & \the\marginparpush &
% |\MacrocodeTopsep| & \the\MacrocodeTopsep \\
% |\tolerance| & \the\tolerance
% \end{tabular}
% \end{center}
%
%
% \subsection{Short input of verbatim text pieces}
%
% \DescribeMacro\MakeShortVerb
% \DescribeMacro{\MakeShortVerb*} \DescribeMacro\DeleteShortVerb It is
% awkward to have to type, say, "\verb|"\ldots"|" continually when
% quoting
% verbatim bits (like macro names) in the text, so an abbreviation
% mechanism is provided. Pick a character \meta{c}---one which
% normally has catcode `other' unless you have very good reason not
% to---which you don't envisage using in the text, or not using often.
% (I like |"|, but you may prefer "|" if you have |"| active to do
% umlauts, for instance.) Then if you say
% "\MakeShortVerb{\"\meta{c}"}" you can subsequently use
% \meta{c}\meta{text}\meta{c} as the equivalent of
% "\verb"\meta{c}\meta{text}\meta{c}; analogously, the "*"-form
% "\MakeShortVerb*{\"\meta{c}"}" gives you the equivalent of
% "\verb*"\meta{c}\meta{text}\meta{c}. Use
% "\DeleteShortVerb{\"\meta{c}"}" if you subsequently want \meta{c} to
% revert to its previous meaning---you can always turn it on again
% after the unusual section. The `short verb' commands make global
% changes. The abbreviated "\verb" may not appear in the argument of
% another command just like "\verb". However the `short verb'
% character may be used freely in the \textsf{verbatim} and
% \textsf{macrocode} environments without ill effect.
% "\DeleteShortVerb" is silently ignored if its argument does not
% currently represent a short verb character. Both commands type a
% message to tell you the meaning of the character is being changed.
%
% Please remember that the command "\verb" cannot be used in arguments
% of other commands. Therefore abbreviation characters for "\verb"
% cannot be used there either.
%
% This feature is also available as a sole package, \texttt{shortvrb}.
%
%
% \subsection{Additional bells and whistles}
%
% We provide macros for logos such as \Web, \AmSTeX, \BibTeX,
% \SliTeX{} and \PlainTeX. Just type |\Web|, |\AmSTeX|,
% |\BibTeX|, |\SliTeX| or |\PlainTeX|, respectively.
% \LaTeX{} and \TeX{} are already defined in \texttt{latex.tex}.
%
% \DescribeMacro\meta
% Another useful macro is |\meta| which has one argument and
% produces something like \meta{dimen parameter}.
%
% \DescribeMacro\OnlyDescription
% \DescribeMacro\StopEventually
% You can use the |\OnlyDescription| declaration in the driver
% file to suppress the last part of your document (which presumably
% exhibits the code). To make this work
% you have to place the command |\StopEventually| at a suitable
% point in your file. This macro has one argument in which you put
% all information you want to see printed if your document ends at
% this point (for example a bibliography which is normally printed at
% the very end). When the |\OnlyDescription| declaration is
% missing the |\StopEventually|
% \DescribeMacro\Finale
% macro saves its argument in a macro called |\Finale| which can
% afterwards be used to get things back (usually at the very end).
% Such a scheme makes changes in two places unnecessary.
%
% Thus you can use this feature to produce a local guide for the
% \TeX{} users which describes only the usage of macros (most of them
% won't be interested in your definitions anyway). For the same
% reason the |\maketitle| \DescribeMacro\maketitle command is slightly
% changed to allow multiple titles in one document. So you can make
% one driver file reading in several articles at once.
% \DescribeMacro{\ps@titlepage} To avoid an unwanted
% \textsf{pagestyle} on the title page the |\maketitle| command issues
% a |\thispagestyle{titlepage}| declaration which produces a
% \textsf{plain} page if the \textsf{titlepage} page style is
% undefined. This allows class files like \textsf{ltugboat.cls} to
% define their own page styles for title pages.
%
% \DescribeMacro\AlsoImplementation
% Typesetting the whole document is the default. However, this default
% can also be explicitly selected using the declaration
% |\AlsoImplementation|. This overwrites any previous
% |\OnlyDescription| declaration. The \LaTeXe{} distribution, for
% example, is documented using the \texttt{ltxdoc} class which allows
% for a configuration file \texttt{ltxdoc.cfg}. In such a file one
% could then add the statement
% \begin{quote}
% |\AtBeginDocument{\AlsoImplementation}|
% \end{quote}
% to make sure that all documents will show the code part.
%
% \DescribeMacro\IndexInput \label{..Input} Last but not least I
% defined an |\IndexInput| macro which takes a file name as an
% argument and produces a verbatim listing of the file, indexing every
% command as it goes along. This might be handy, if you want to learn
% something about macros without enough documentation. I used this
% feature to cross-reference \texttt{latex.tex} getting a verbatim
% copy with about 15 pages index.\footnote{It took quite a long time
% and the resulting \texttt{.idx} file was longer than the
% \texttt{.dvi} file. Actually too long to be handled by the
% \textsf{makeindex} program directly (on our MicroVAX) but the final
% result was worth the trouble.}
%
% \DescribeMacro\changes
% To maintain a change history within the file, the |\changes|
% command may be placed amongst the description part of the changed
% code. It takes three arguments, thus:
% \begin{quote}
% |\changes{|\meta{version}|}{|\meta{date}|}{|^^A
% \meta{text}|}|
% \end{quote}
% The changes may be used to produce an auxiliary file (\LaTeX's
% |\glossary| mechanism is used for this) which may be printed
% after suitable formatting. The |\changes| macro encloses the
% \meta{date} in parentheses and appends the \meta{text} to form the
% printed entry in such a change history; because old
% versions\footnote{Before 2.6.} of the \textsf{makeindex}
% program limit such fields to 64 characters, care should be taken
% not to exceed this limit when describing the change. When
% referring to macros in change descriptions it is conventional to use
% "`"\meta{macroname} rather than attempting to format it properly and
% using up valuable characters in the entry with old \textsf{makeindex}
% versions.
%
% \changes{v1.7a}{1992/02/26}{Description of \cs{RecordChanges} etc.
% added
% to interface section.} \DescribeMacro\RecordChanges To cause the
% change information to be written out, include "\RecordChanges" in
% the driver file. \DescribeMacro\PrintChanges To read in and print
% the sorted change history (in two columns), just put the
% |\PrintChanges| command as the last (commented-out, and thus
% executed during the documentation pass through the file) command in
% your package file. Alternatively, this command may form one of the
% arguments of the |\StopEventually| command, although a change
% history is probably {\em not\/} required if only the description is
% being printed. The command assumes that \textsf{makeindex} or some
% other program has processed the \texttt{.glo} file to generate a
% sorted \texttt{.gls} file. You need a special \textsf{makeindex}
% style file; a suitable one is supplied with \DOC{}, called
% \texttt{gglo.ist}. \DescribeMacro\GlossaryMin
% \DescribeMacro\GlossaryPrologue \DescribeMacro\GlossaryParms The
% "\GlossaryMin", "\GlossaryPrologue" and "\GlossaryParms" macros are
% analagous to the "\Index"\ldots\ versions. (The \LaTeX{} `glossary'
% mechanism is used for the change entries.)
%
% \label{sec:checksum}
% \DescribeMacro\CharacterTable
% \DescribeMacro\CheckSum
% To overcome some of the problems of sending files over the networks
% we developed two macros which should detect corrupted files. If one
% places the lines
% \begin{flushleft}
% \small\ttfamily ^^A \ttfamily to get the blanks between "..."s
% ^^A right
%"%%\CharacterTable"\\
%"%% {Upper-case "
%"\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"\\
%"%% Lower-case "
%"\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"\\
%"%% Digits \0\1\2\3\4\5\6\7\8\9"\\
%"%% Exclamation \! Double quote "\verb=\"=
%" Hash (number) \#"\\
%"%% Dollar \$ Percent \% Ampersand \&"\\
%"%% Acute accent \' Left paren \( Right paren \)"\\
%"%% Asterisk \* Plus \+ Comma \,"\\
%"%% Minus \- Point \. Solidus \/"\\
%"%% Colon \: Semicolon \; Less than \<"\\
%"%% Equals \= Greater than \> Question mark \?"\\
%"%% Commercial at \@ Left bracket \[ Backslash \\"\\
%"%% Right bracket \] Circumflex \^ Underscore \_"\\
%"%% Grave accent \` Left brace \{ Vertical bar \|"\\
%"%% Right brace \} Tilde \~}"\\
%"%%"
%\end{flushleft}
% at the beginning of the file then character translation failures
% will be detected, provided of course, that the used \DOC{}
% package has a correct default table. The percent
% signs\footnote{There are two percent signs in each line. This has
% the effect that these lines are not removed by the
% \texttt{docstrip.tex} program.} at the beginning of the lines should
% be typed in, since only the \DOC{} package should look at this
% command.
%
% Another problem of mailing files is possible truncation. To detect
% these sort of errors we provide a |\CheckSum| macro. The check-sum
% of a file is simply the number of backslashes in the code, i.e.\ all
% lines between the \textsf{macrocode} environments. But don't be
% afraid: you don't have count the code-lines yourself; this is done
% by the \DOC{} package for you. You simply have to use
% the |\StopEventually| (which starts looking for backslashes) and the
% |\Finale| command. The latter will inform you either that your file
% has no check-sum (telling you the right number) or that your number
% is incorrect (this time telling you both the correct and the
% incorrect one). Then you go to the top of your file inserting the
% line
% \begin{quote}
% |%% \CheckSum{|\meta{number}|}|
% \end{quote}
% and that's all. If you precede it only with one percent then the
% line will not show up in \texttt{docstrip} versions of the file.
% You should do so whenever you are using conditional code (see
% \texttt{docstrip} documentation) since then the check-sum will not
% reflect the number of backslashes in the stripped of versions.
%
% \DescribeMacro\bslash
% From time to time, it is necessary to print a |\| without
% being able to use the |\verb| command because the
% |\catcode|$\,$s of the symbols are already firmly
% established. In this instance we can use the command
% |\bslash| presupposing, of course, that the actual font in
% use at this point contains a `backslash' as a symbol. Note that
% this definition of |\bslash| is expandable; it inserts a
% $"\"_{12}$. This means that you have to |\protect|
% it if it is used in `moving arguments'.
%
% \DescribeMacro\MakePrivateLetters
% \changes{v1.7a}{1992/02/26}{Documented \cs{MakePrivateLetters} in
% interface section}^^A
% If your macros "\catcode" anything other than "@" to `letter', you
% should redefine "\MakePrivateLetters" so that it also makes the
% relevant characters `letters' for the benefit of the indexing. The
% default definition is just "\makeatletter".
%
% \DescribeMacro\DontCheckModules \DescribeMacro\CheckModules
% \DescribeMacro\Module \DescribeMacro\AltMacroFont The `module'
% directives of the \textsf{docstrip} system \cite{art:docstrip} are
% normally recognised and invoke special formatting. This can be
% turned on and off in the \texttt{.dtx} file or the driver file using
% "\CheckModules" and "\DontCheckModules". If checking for module
% directives is on (the default) then code in the scope of the
% directives is set as determined by the hook "\AltMacroFont", which
% gives {\small\ttfamily\itshape small italic type\-writer\/} by
% default in the New Font Selection Scheme but just ordinary
% {\small\ttfamily small type\-writer} in the old one, where a font
% such as italic typewriter can't be used portably (plug for NFSS);
% you will need to override this if you don't have the italic
% typewriter font available. Code is in such a scope if it's on a
% line beginning with "%<" or is between lines starting with
% "%<*"\meta{name list}">" and "%</"\meta{name list}">". The
% directive is formatted by the macro "\Module" whose single argument
% is the text of the directive between, but not including, the angle
% brackets; this macro may be re-defined in the driver or package file
% and by default produces results like \Module{+foo\string|bar} with no
% following space.
%
% \DescribeMacro{StandardModuleDepth} Sometimes (as in this file) the
% whole code is surrounded by modules to produce several files from a
% single source. In this case it is clearly not appropriate to format
% all code lines in a special "\AltMacroFont". For this reason a
% counter "StandardModuleDepth" is provided which defines the level of
% module nesting which is still supposed to be formatted in
% "\MacroFont" rather then "\AltMacroFont". The default setting is
% "0", for this documentation it was set to
%\begin{verbatim}
% \setcounter{StandardModuleDepth}{1}
%\end{verbatim}
% at the beginning of the file.
%
%
% \subsection{Basic usage summary}
% \changes{v1.7a}{1992/03/11}{Added basic usage summary to spell
% it out.}
%
% To sum up, the basic structure of a \texttt{.dtx} file without any
% refinements is like this:
% \begin{verse}\small
% "% "\meta{waffle}\ldots\\
% \quad\ldots \\
% "% \DescribeMacro{\fred}"\\
% "% "\meta{description of fred's use}\\
% \quad\ldots\\
% "% \StopEventually{"\meta{finale code}"}"\\
% \quad\ldots\\
% "% \begin{macro}{\fred}"\\
% "% "\meta{commentary on macro fred}\\
% \verb*+% \begin{macrocode}+\\
% \meta{code for macro fred}\\
% \verb*+% \end{macrocode}+\\
% "% \end{macro}"\\
% \quad\ldots\\
% "% \Finale \PrintIndex \PrintChanges"
% \end{verse}
% For examples of the use of most---if not all---of the features
% described above consult the \texttt{doc.dtx} source itself.
%
% \subsection{Acknowledgements}
%
% I would like to thank all folks at Mainz and at the Royal Military
% College of Science for their help in this project. Especially Brian
% and Rainer who pushed everything with their suggestions, bug fixes,
% etc.
%
% A big thank you to David Love who brought the documentation
% up-to-date again, after I neglected this file for more than two
% years. This was most certainly a tough job as many features added to
% \texttt{doc.dtx} after its publication in \textsl{TUGboat\/} have
% been never properly described. Beside this splendid work he kindly
% provided additional code (like ``docstrip'' module formatting) which
% I think every \textsf{doc.dtx} user will be grateful for.
%
%
% \StopEventually{
% \begin{thebibliography}{1}
% \bibitem{book:Buerger} \textsc{G. A. B\"urger}.
% \newblock Wunderbare Reisen zu Wasser und zu Lande, Feldz\"uge
% und lustige Abenteuer des Freyherrn v.\ M\"unchhausen.
% \newblock London, 1786 \& 1788.
% \bibitem{art:Knuthliterat} \textsc{D. E. Knuth}.
% \newblock Literate Programming.
% \newblock Computer Journal, Vol.~27, \textit{pp}.~97--111,
% May 1984.
% \bibitem{book:KnuthA} \textsc{D. E. Knuth}.
% \newblock Computers \& Typesetting (The \TeX book).
% \newblock Addison-Wesley, Vol. A, 1986.
% \bibitem{art:Chen} \textsc{L. Lamport}.
% \newblock MakeIndex: An Index Processor for \LaTeX.
% \newblock 17 February 1987.
% \newblock (Taken from the file \texttt{makeindex.tex} provided
% with
% the program source code.)
% \bibitem{art:doc} \textsc{Frank Mittelbach}.
% \newblock The \DOC{}-option.
% \newblock \textsl{TUGboat}, Vol.~10(2), \textit{pp}.~245--273,
% July 1989.
% \bibitem{art:docstrip} \textsc{Frank Mittelbach, Denys Duchier and
% Johannes Braams}.
% \newblock \texttt{docstrip.dtx} (to appear).
% \newblock The file is part of the DOC package.
% \bibitem{book:Raspe} \textsc{R. E. Raspe} (*1737, \dag 1797).
% \newblock Baron M\"unchhausens narrative of his marvellous
% travels and campaigns in Russia.
% \newblock Oxford, 1785.
% \bibitem{art:verbatim} \textsc{Rainer Sch\"opf}.
% \newblock A New Implementation of \LaTeX's \texttt{verbatim} and
% \texttt{verbatim*} Environments.
% \newblock File \texttt{verbatim.doc}, version 1.4i.
% \end{thebibliography}
% ^^A\PrintIndex
% ^^A\PrintChanges
%
% \ifmulticols
% \addtocontents{toc}{\protect\end{multicols}}
% \fi
%
% } ^^A end \StopEventually
%
%
% \section{The Description of Macros}
%
% Most of the following code is destined for \texttt{doc.sty} after
% processing with \texttt{docstrip} to include the module
% \textbf{style} indicated here. (All code in this file not
% appropriate to \texttt{doc.sty} has to be included explicitly by
% docstrip so that this \texttt{.dtx} file can be used as directly as
% a package file rather than the stripped version.) The usual font
% change for the conditionally-included lines between the
% \Module{*style} and \Module{/style} directives is suppressed since
% only the lines with an explicit directive are special in this file.
% \begin{macrocode}
%<*package>
% \end{macrocode}
% Under \LaTeXe{} the test to avoid reading
% \DOC{} in twice is normally unnecessary. It was kept to only to
% stay compatible with \LaTeX209 styles that |\input| \DOC{}
% directly.
% \changes{v1.5i}{1989/06/07}{Avoid reading the file twice.}
% \begin{macrocode}
\@ifundefined{macro@cnt}{}{\endinput}
% \end{macrocode}
%
% \DescribeMacro\fileversion
% \DescribeMacro\filedate
% \DescribeMacro\docdate
% As you can see I used macros like |\fileversion| to denote the
% version number and the date. They are defined at the very beginning
% of the package file (without a surrounding \textsf{macrocode}
% environment), so I don't have to search for this place here when I
% change the version number. You can see their actual outcome in a
% footnote to the title.
%
%
% The first thing that we do next is to get ourselves a new comment
% sign. Because all sensible signs are already occupied, we will
% choose one that can only be entered indirectly:
% {\DoNotIndex{\^}^^A avoid misinterpretion !!!!! VERIFY
% \begin{macrocode}
\catcode`\^^A=14
% \end{macrocode}
% We repeat this statement at the beginning of the document in case
% the \texttt{inputenc} package is used disabling it again.
% \changes{v2.0b}{1998/05/19}{Init docs private comment char at begin
% of document again (pr2581)}
% \begin{macrocode}
\AtBeginDocument{\catcode`\^^A=14\relax}
% \end{macrocode}
% \SortIndex{\string^\string^A}{\string\verb\verbatimchar
% \string^\string^A\verbatimchar
% \encapchar main}
% }
%
%
% \subsection{Options supported by \DOC{}}
%
% Not options available at the moment
%
% \begin{macrocode}
% \end{macrocode}
%
%
% \subsection{Macros surrounding the `definition parts'}
%
% \begin{macro}{\macrocode}
% Parts of the macro definition will be surrounded by the
% environment \textsf{macrocode}. Put more precisely, they will be
% enclosed by a macro whose argument (the text to be set
% `verbatim') is terminated by the string
% \verb*+% \end{macrocode}+. Carefully note the number of spaces.
% |\macrocode| is defined completely analogously to
% |\verbatim|, but because a few small changes were carried
% out, almost all internal macros have got new names. We start by
% calling the macro |\macro@code|, the macro which bears the
% brunt of most of the work, such as |\catcode| reassignments,
% etc.
% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)}
% \begin{macrocode}
\def\macrocode{\macro@code
% \end{macrocode}
% Then we take care that all spaces have the same width, and that
% they are not discarded.
% \begin{macrocode}
\frenchspacing \@vobeyspaces
% \end{macrocode}
% Before closing, we need to call |\xmacro@code|. It is this
% macro that expects an argument which is terminated by the above
% string. This way it is possible to keep the |\catcode|
% changes local.
% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)}
% \changes{v1.5t}{1989/11/07}{Common code moved to \cs{macro@code}.}
% \begin{macrocode}
\xmacro@code}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\macro@code}
% We will now begin with the macro that does the actual work:
% \begin{macrocode}
\def\macro@code{%
% \end{macrocode}
% In theory it should consist of a \textsf{trivlist} environment, but
% the empty space before and after the environment should not be
% too large.
% \begin{macrocode}
\topsep \MacrocodeTopsep
% \end{macrocode}
% The next parameter we set is |\@beginparpenalty|, in order
% to prevent a page break before such an environment.
% \begin{macrocode}
\@beginparpenalty \predisplaypenalty
% \end{macrocode}
% We then start a |\trivlist|, set |\parskip| back to
% zero and start an empty |\item|.
% \changes{v1.9b}{1993/12/03}{Forcing any label from macro env.}
% \begin{macrocode}
\if@inlabel\leavevmode\fi
\trivlist \parskip \z@ \item[]%
% \end{macrocode}
% Additionally, everything should be set in \texttt{typewriter} font.
% Some people might prefer it somewhat differently; because of this
% the font choice is
% macro-driven.\footnote{The font change has to be placed
% {\em after\/}
% the \texttt{\bslash item}. Otherwise a change to
% \texttt{\bslash baselineskip} will affect the
% paragraph above.}
% \begin{macrocode}
\macro@font
% \end{macrocode}
% Because |\item| sets various parameters, we have found it
% necessary to alter some of these retrospectively.
% \begin{macrocode}
\leftskip\@totalleftmargin \advance\leftskip\MacroIndent
\rightskip\z@ \parindent\z@ \parfillskip\@flushglue
% \end{macrocode}
% The next line consists of the \LaTeX{} definition of |\par|
% used in |\verbatim| and should result in blank lines being
% shown as blank lines.
% \changes{v1.5l}{1989/09/10}{Code line numbers supported.}
% \changes{v1.5t}{1989/11/07}{Call \cs{leavevmode} to get \cs{everypar}
% on blank lines.}
% \changes{v1.7c}{1992/3/24}{Added \cs{interlinepenalty} to
% \cs{par} from
% verbatim.sty}
% \begin{macrocode}
\blank@linefalse \def\par{\ifblank@line
\leavevmode\fi
\blank@linetrue\@@par
\penalty\interlinepenalty}
% \end{macrocode}
% What use is this definition of |\par|\,? We use the macro
% |\obeylines| of \cite{book:KnuthA} which changes all |^^M|
% to |\par| so that each can control its own indentation.
% Next we must also ensure that all special signs are normalized;
% that is, they must be given |\catcode| $12$.
% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim,
% which handles more ligatures.}
% \begin{macrocode}
\obeylines
\let\do\do@noligs \verbatim@nolig@list
\let\do\@makeother \dospecials
% \end{macrocode}
% \changes{v1.5t}{1989/11/07}{Common code added.}
% \changes{v1.5w}{1990/02/05}{Skip of \cs{@totalleftmargin} added.} If
% indexing by code lines is switched on the line number is incremented
% and set appropriately. We also check whether the start of the next
% line indicates a \texttt{docstrip} module directive and process it
% appropriately if so using "\check@module".
% \begin{macrocode}
\global\@newlistfalse
\global\@minipagefalse
\ifcodeline@index
\everypar{\global\advance\c@CodelineNo\@ne
\llap{\theCodelineNo\ \hskip\@totalleftmargin}%
\check@module}%
\else \everypar{\check@module}%
\fi
% \end{macrocode}
% We also initialize the cross-referencing feature by calling
% |\init@crossref|. This will start the scanning mechanism
% when encountering an escape character.
% \begin{macrocode}
\init@crossref}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ifblank@line}
% \begin{macro}{\blank@linetrue}
% \begin{macro}{\blank@linefalse}
% |\ifblank@line| is the switch used in the definition above.
% In the original \textsf{verbatim} environment the |\if@tempswa|
% switch is used. This is dangerous because its value may change
% while processing lines in the \textsf{macrocode} environment.
% \begin{macrocode}
\newif\ifblank@line
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\endmacrocode}
% Because we have begun a \textsf{trivlist} environment in the
% \textsf{macrocode} environment, we must also end it. We must
% also act on the value of the "pm@module" flag (see below) and
% empty "\everypar".
% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)}
% \begin{macrocode}
\def\endmacrocode{%
\ifpm@module \endgroup \pm@modulefalse \fi
\everypar{}%
\global\@inlabelfalse
\endtrivlist
% \end{macrocode}
% Additionally |\close@crossref| is used to do anything needed
% to end the cross-referencing mechanism.
% \begin{macrocode}
\close@crossref}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\MacroFont}
% Here is the default definition for the |\MacroFont| macro.
% With the new math font handling in NFSS2 it isn't any longer
% correct to suppress the math font setup since this is now handled
% differently. But to keep the font change fast we use only a
% single |\selectfont| (in |\small|) and do the rest by hand.
% \changes{v1.5x}{1990/02/17}{\cs{math@fontsfalse} added for NFSS.}
% \changes{v1.7a}{1992/03/13}{Added \cs{reset@font} for NFSS.}
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different
% math setup /pr1622}
% \begin{macrocode}
\@ifundefined{MacroFont}{%
\if@compatibility
% \end{macrocode}
% Despite the above statement we will call |\small| first if
% somebody is using a \LaTeX2.09 document with doc. I wouldn't have
% bothered since doc-sources should be up-to-date but since the
% request came from someone called David Carlisle \ldots :-)
% \changes{v1.9y}{1996/01/26}{Support compat mode}
% \begin{macrocode}
\def\MacroFont{\small
\usefont\encodingdefault
\ttdefault
\mddefault
\updefault
}%
\else
\def\MacroFont{\fontencoding\encodingdefault
\fontfamily\ttdefault
\fontseries\mddefault
\fontshape\updefault
\small}%
\fi
}{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AltMacroFont}
% \begin{macro}{\macro@font}
% \changes{v1.7a}{1992/03/12}{Added to support distinction of modules.}
% \changes{v1.7c}{1992/03/26}{Altered font change for OFSS.}
% \changes{v1.7m}{1992/10/11}{Use sltt as default.}
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different
% math setup /pr1622}
% Although most of the macro code is set in "\MacroFont" we want to be
% able to switch to indicate module code set in "\AltMacroFont".
% "\macro@font" keeps track of which one we're using. We can't do the
% same thing sensibly in OFSS as in NFSS.
% \begin{macrocode}
\@ifundefined{AltMacroFont}{%
\if@compatibility
% \end{macrocode}
% Again have |\small| first if we are in compat mode.
% \changes{v1.9y}{1996/01/26}{Support compat mode}
% \begin{macrocode}
\def\AltMacroFont{\small
\usefont\encodingdefault
\ttdefault
\mddefault
\sldefault
}%
\else
\def\AltMacroFont{\fontencoding\encodingdefault
\fontfamily\ttdefault
\fontseries\mddefault
\fontshape\sldefault
\small
}%
\fi
}{}
% \end{macrocode}
% To allow changing the "\MacroFont" in the preamble we defer
% defining the internally used "\macro@font" until after the
% preamble.
% \changes{v2.0a}{1998/05/16}{Support changing \cs{MacroFont} in
% preamble}
% \begin{macrocode}
\AtBeginDocument{\let\macro@font\MacroFont}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\check@module}
% \begin{macro}{\ifpm@module}
% \changes{v1.7a}{1992/03/12}{Added.}
% This is inserted by "\everypar" at the start of each macrocode line to
% check whether it starts with module information. (Such information is
% of the form "%<"\meta{switch}">", where the "%" must be at the
% start of the line and \meta{switch} comprises names with various
% possible separators and a possible leading "+", "-", "*" or "/"
% \cite{art:docstrip}. All that concerns us here is what the first
% character of \meta{switch} is.) First it checks the "pm@module"
% flag in case the previous line had a non-block module
% directive i.e., not "%<*" or "%</"; if it did we need to close the
% group it started and unset the flag. "\check@module" looks ahead at
% the next token and then calls "\ch@percent" to take action depending
% on whether or not it's a "%"; we don't want to expand the token at
% this stage. This is all done conditionally so it can be turned off
% if it causes problems with code that wasn't designed to be
% \texttt{docstrip}ped.
% \begin{macrocode}
\def\check@module{%
\ifcheck@modules
\ifpm@module \endgroup \pm@modulefalse \fi
\expandafter\futurelet\expandafter\next\expandafter\ch@percent
\fi}
\newif\ifpm@module
% \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\DontCheckModules}
% \begin{macro}{\CheckModules}
% \changes{v1.7a}{1992/03/12}{Added.}
% \begin{macro}{\ifcheck@modules}
% Here are two driver-file interface macros for turning the module
% checking on and off using the "check@modules" switch.
% \begin{macrocode}
\def\DontCheckModules{\check@modulesfalse}
\def\CheckModules{\check@modulestrue}
\newif\ifcheck@modules \check@modulestrue
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\ch@percent}
% \changes{v1.7a}{1992/03/12}{Added.}
% If the lookahead token in "\next" is $"%"_{12}$ we go on to check
% whether the following one is "<" and otherwise do nothing. Note the
% "\expandafter" to get past the "\fi".
% \begin{macrocode}
\def\ch@percent{%
\if \percentchar\next
\expandafter\check@angle
\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\check@angle}
% \changes{v1.7a}{1992/03/12}{Added.}
% Before looking ahead for the "<" the "%" is gobbled by the
% argument here.
% \begin{macrocode}
\def\check@angle#1{\futurelet\next\ch@angle}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\ch@angle}
% \changes{v1.7a}{1992/03/12}{Added.}
% \changes{v1.9k}{1994/02/22}{Have \texttt{<} active}
% If the current lookahead token is "<" we are defined to be
% processing a module directive can go on to look for "+" etc.;
% otherwise we must put back the gobbled "%". With \LaTeXe{}
% \texttt{<} is active so we have to be a bit careful.
% \begin{macrocode}
\begingroup
\catcode`\<\active
\gdef\ch@angle{\ifx<\next
\expandafter\ch@plus@etc
\else \percentchar \fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ch@plus@etc}
% \begin{macro}{\check@plus@etc}
% \changes{v1.7a}{1992/03/12}{Added.}
% We now have to decide what sort of a directive we're dealing with
% and do the right thing with it.
% \begin{macrocode}
\gdef\ch@plus@etc<{\futurelet\next\check@plus@etc}
\gdef\check@plus@etc{%
\if +\next
\let\next\pm@module
\else\if -\next
\let\next\pm@module
\else\if *\next
\let\next\star@module
\else\if /\next
\let\next\slash@module
% \end{macrocode}
% At some point in the past the \texttt{docstrip} program was
% partly rewritten and at that time it also got support for a very
% special directive of the form |%<<| followed by an arbitrary
% string. This is used for ``verbatim'' inclusion in case of
% certain problem. We do not really attempt to pretty print that
% case but we need at least account for it since otherwise we get
% an error message since this is the only case where we will not
% have a closing |>|.
% \changes{v2.0n}{2001/05/16}{Partly support docstrip's ``verbatim''
% directive (pr/3331)}
% \begin{macrocode}
\else\ifx <\next
\percentchar
\else
\let\next\pm@module
\fi\fi\fi\fi\fi
\next}
\endgroup
% \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\pm@module}
% If we're not dealing with a block
% directive ("*" or "/") i.e., it's a single special line, we set
% everything up to the next ">" appropriately and then change to the
% special macro font inside a group which will be ended at the start
% of the next line. If the apparent module directive is missing the
% terminating ">" this will lose, but then so will the \texttt{docstrip}
% implementation. An alternative strategy would be to have
% "\pm@module" make ">" active and clear a flag set here to indicate
% processing the directive. Appropriate action could then be taken if
% the flag was found still to be set when processing the next line.
% \changes{v1.7a}{1992/03/12}{Added.}
% \changes{v1.7i}{1992/07/11}{Support for fonts depending on nesting.}
% \begin{macrocode}
\begingroup
\catcode`\~=\active
\lccode`\~=`\>
\lowercase{\gdef\pm@module#1~}{\pm@moduletrue
\Module{#1}\begingroup
% \end{macrocode}
% We switch to a special font as soon the nesting is higher than
% the current value of "\c@StandardModuleDepth". We do a local
% update to the "\guard@level" here which will be restored after
% the current input line.
% \begin{macrocode}
\advance\guard@level\@ne
\ifnum\guard@level>\c@StandardModuleDepth\AltMacroFont\fi
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\star@module}
% \begin{macro}{\slash@module}
% \changes{v1.7a}{1992/03/12}{Added.}
% \changes{v1.7f}{1992/05/16}{Take account of nested guards.}
% \changes{v1.7i}{1992/07/11}{Add counter to determine when to switch to
% special font.}
% If the start or end of a module {\em block\/} is indicated, after
% setting the guard we have to check whether a change in the macrocode
% font should be done. This will be the case if we are already inside
% a block or are ending the outermost block. If so, we globally
% toggle the font for subsequent macrocode sections between the normal
% and special form, switching to the new one immediately.
% \changes{v1.7i}{1992/07/17}{Support for fonts depending on module
% nesting}
% \begin{macrocode}
\lowercase{\gdef\star@module#1~}{%
\Module{#1}%
\global \advance \guard@level\@ne
\ifnum \guard@level>\c@StandardModuleDepth
\global\let\macro@font=\AltMacroFont \macro@font
\fi}
\catcode`\>=\active
\gdef\slash@module#1>{%
\Module{#1}%
\global \advance \guard@level\m@ne
\ifnum \guard@level=\c@StandardModuleDepth
\global\let\macro@font\MacroFont \macro@font
\fi
}
\endgroup
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\c@StandardModuleDepth}
% \changes{v1.7i}{1992/07/11}{Counter added.}
% Counter defining up to which level modules are considered part of
% the main code. If, for example, the whole code is surrounded by
% a |%<*package>| module we better set this counter to |1| to avoid
% getting the whole code be displayed in typewriter italic.
% \begin{macrocode}
\newcounter{StandardModuleDepth}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\guard@level}
% \changes{v1.7f}{1992/05/16}{Added.}
% We need a counter to keep track of the guard nesting.
% \begin{macrocode}
\newcount \guard@level
% \end{macrocode}
% \end{macro}
% \begin{macro}{\Module}
% \changes{v1.7a}{1992/03/12}{Added.}
% \changes{v1.7d}{1992/04/25}{Use sans font for modules.}
% This provides a hook to determine the way the module directive is
% set. It gets as argument everything between the angle brackets.
% The default is to set the contents in sans serif text between
% $\langle\,\rangle$ with the special characters suitably "\mathcode"d
% by "\mod@math@codes". (You can't just set it in a sans text font
% because normally "|" will print as an em-dash.) This is done
% differently depending on whether we have the NFSS or the old one. In
% the latter case we can easily change "\fam" appropriately.
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \begin{macrocode}
\@ifundefined{Module}{%
% \end{macrocode}
% With NFSS what we probably {\em should\/} do is change to a new
% "\mathversion" but I (Dave Love) haven't spotted an easy way to
% do so correctly if the document uses a version other than
% "normal". (We need to know in what font to set the other
% groups.) This uses a new math alphabet rather than version and
% consequently has to worry about whether we're using
% \textsf{oldlfnt} or not. I expect there's a better
% way\ldots
% \begin{macrocode}
\def\Module#1{\mod@math@codes$\langle\mathsf{#1}\rangle$}
}{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\mod@math@codes}
% \changes{v1.7c}{1992/03/26}{Added.} As well as `words', the module
% directive text might contain any of the characters "*/+-,&|!()"
% for the current version of \textsf{docstrip}. We only need
% special action for two of them in the math code changing required
% above: "|" is changed to a "\mathop" (it's normally |"026A|) and
% "&" is also made a "\mathop", but in family 0. Remember that "&"
% will not have a special catcode when it's encountered.
% \begin{macrocode}
\def\mod@math@codes{\mathcode`\|="226A \mathcode`\&="2026}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\mathsf}
% \changes{v1.7c}{1992/03/26}{Added.}
% \changes{v1.7d}{1992/04/25}{Use sans font for modules.}
% \changes{v1.7n}{1993/02/21}{\cs{sfmath} Renamed to \cs{mathsf}.}
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% If NFSS is in use we need a new math alphabet which uses a sans serif
% font. To support both the release one and two of NFSS the alphabet
% was renamed to "\mathsf" which is defined in NFSS2.
% \begin{macrocode}
%\ifx\selectfont\undefined
%\else
% \ifx\mathsf\undefined
% \newmathalphabet*{\mathsf}{\sfdefault}{m}{n}\fi
%\fi
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\MacrocodeTopsep}
% \begin{macro}{\MacroIndent}
% In the code above, we have used two registers. Therefore we have
% to allocate them. The default values might be overwritten with
% the help of the |\DocstyleParms| macro.
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v1.5y}{1990/02/24}{Default changed.}
% \changes{v1.6b}{1990/06/15}{\cs{rm} moved before \cs{scriptsize} to
% avoid unnecessary fontwarning.}
% \begin{macrocode}
\newskip\MacrocodeTopsep \MacrocodeTopsep = 3pt plus 1.2pt minus 1pt
\newdimen\MacroIndent
\settowidth\MacroIndent{\rmfamily\scriptsize 00\ }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
% \begin{macro}{\macrocode*}
% \begin{macro}{\endmacrocode*}
% Just as in the \textsf{verbatim} environment, there is also a
% `star' variant of the \textsf{macrocode} environment in which a
% space is shown by the symbol \verb*+ +. Until this moment, I
% have not yet used it (it will be used in the description of the
% definition of |\xmacro@code| below) but it's exactly on this one
% occasion {\em here\/} that you can't use it (cf.\ M\"unchhausens
% Marsh problem)\footnote{Karl Friedrich Hieronymus Frhr.\ v.\
% M\"unchhausen (*1720, \dag1797). Several books were written
% about fantastic adventures supposedly told by him (see
% \cite{book:Raspe} or \cite{book:Buerger}). In one story he
% escaped from the marsh by pulling himself out by his hair.}
% directly. Because of this, on this one occasion we'll cheat
% around the problem with an additional comment character. But now
% back to |\macrocode*|. We start with the macro |\macro@code|
% which prepares everything and then call the macro |\sxmacro@code|
% whose argument is terminated by the string
%\verb*+% \end{macrocode*}+.
% \begin{macrocode}
\@namedef{macrocode*}{\macro@code\sxmacro@code}
% \end{macrocode}
% As we know, |\sxmacro@code| and then |\end{macrocode*}|
% (the macro, not the string), will be executed, so that for a
% happy ending we still need to define the macro
% |\endmacrocode*|.
% \begin{macrocode}
\expandafter\let\csname endmacrocode*\endcsname = \endmacrocode
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
%
%
%
% \begin{macro}{\xmacro@code}
\catcode`\!=\catcode`\% ^^A In this section there must not be
^^A any exclamation marks.
^^A
% As already mentioned, the macro |\xmacro@code| expects an
% argument delimited by the string \verb*+% \end{macrocode}+. At
% the moment that this macro is called, the |\catcode| of
% \TeX's special characters are 12 (`other') or 13 (`active').
% Because of this we need to utilize a different escape character
% during the definition. This happens locally.
% \begin{macrocode*}
\begingroup
\catcode`\|=\z@ \catcode`\[=\@ne \catcode`\]=\tw@
% \end{macrocode*}
% Additionally, we need to ensure that the symbols in the above
% string contain the |\catcode|$\,$s which are available
% within the \textsf{macrocode} environment.
% \begin{macrocode*}
\catcode`\{=12 \catcode`\}=12
\catcode`\%=12 \catcode`\ =\active \catcode`\\=\active
!% \end{macrocode*}
! Next follows the actual definition of |\macro@code|;
! notice the
! use of the new escape character. We manage to get the argument
! surrounded by the string |\end{macrocode}|, but at the end
! however, in spite of the actual characters used during the
! definition of
! this macro, |\end| with the argument |{macrocode}|
! will be executed, to ensure a balanced environment.
! \begin{macrocode*}
|gdef|xmacro@code#1% \end{macrocode}[#1|end[macrocode]]
!% \end{macrocode*}
! \begin{macro}{\sxmacro@code}
! The definition of |\sxmacro@code| is completely analogous,
! only
! here a slightly different terminating string will be used.
! Note that the space is not active in this environment.
! \begin{macrocode}
|catcode`| =12
|gdef|sxmacro@code#1% \end{macrocode*}[#1|end[macrocode*]]
!% \end{macrocode}
! because the |\catcode| changes have been made local by
! commencing a
! new group, there now follows the matching |\endgroup|
! in a rather
! unusual style of writing.
! \begin{macrocode}
|endgroup
!% \end{macrocode}
\catcode`\!=12
% \end{macro}
% \end{macro}
%
%
%
%
% \subsection{Macros for the `documentation parts'}
%
%
% \begin{macro}{\DescribeMacro}
% \begin{macro}{\Describe@Macro}
% \changes{v1.5v}{1990/01/28}{Macro added.}
% \changes{v1.5j}{1989/06/09}{\cs{ignorespaces} added as a temporary
% fix}
% \begin{macro}{\DescribeEnv}
% \begin{macro}{\Describe@Env}
% \changes{v1.5v}{1990/01/28}{Macro added.}
% \changes{v1.5j}{1989/06/09}{\cs{ignorespaces} added as a temporary
% fix}
% The |\DescribeMacro| and |\DescribeEnv| macros should
% print their arguments in the margin and produce an index entry.
% We simply use |\marginpar| to get the desired result. This
% is however not the best solution because the labels might be
% slightly misplaced. One also might get a lot of `marginpar moved'
% messages which are hard-wired into the \LaTeX{} output
% routine.\footnote{It might be better to change these macros into
% environments like the \textsf{macro} environment.} First we change
% to horizontal mode if necessary. The \LaTeX{} macros
% |\@bsphack| and |\@esphack| are used to make those
% commands invisible (i.e.\ to normalize the surrounding space and
% to make the |\spacefactor| transparent).
% \changes{v1.5v}{1990/01/28}{\cs{MakePrivateLetters} added.}
% \begin{macrocode}
\def\DescribeMacro{\leavevmode\@bsphack
% \end{macrocode}
% When documenting the code for the \texttt{amstex.sty} option we
% encountered a bug: the |\catcode| of |@| was active and
% therefore couldn't be used in command names. So we first have to
% make sure that we get all |\catcode|s right by calling
% |\MakePrivateLetters| inside a group. Then we call
% |\Describe@Macro| to do the work.
% \changes{v2.0g}{1999/03/22}{Parse backslash as letter in argument
% to \cs{DescribeMacro}.}
% \changes{v2.0h}{1999/03/25}{Correct errors introduced in v2.0g.}
% \begin{macrocode}
\begingroup\MakePrivateLetters\Describe@Macro}
\def\Describe@Macro#1{\endgroup
\marginpar{\raggedleft\PrintDescribeMacro{#1}}%
% \end{macrocode}
% Note the use of |\raggedleft| to place the output flushed
% right. Finally we call a macro which produces the actual index
% entry and finish with |\@esphack| to leave no
% trace.\footnote{The whole mechanism won't work because
% of the \texttt{\bslash leavevmode} in front.
% As a temporary change \texttt{\bslash ignorespaces}
% is added.}
% \begin{macrocode}
\SpecialUsageIndex{#1}\@esphack\ignorespaces}
% \end{macrocode}
% The |\DescribeEnv| macro is completely analogous.
% \changes{v1.5v}{1990/01/28}{\cs{MakePrivateLetters} added.}
% \begin{macrocode}
\def\DescribeEnv{\leavevmode\@bsphack\begingroup\MakePrivateLetters
\Describe@Env}
\def\Describe@Env#1{\endgroup
\marginpar{\raggedleft\PrintDescribeEnv{#1}}%
\SpecialEnvIndex{#1}\@esphack\ignorespaces}
% \end{macrocode}
% To put the labels in the left margin we have to use the
% |\reversemarginpar| declaration. (This means that the
% \texttt{doc.sty} can't be used with all classes or packages.)
% We also
% make the |\marginparpush| zero and |\marginparwidth| suitably
% wide.
% \changes{v1.5d}{1989/4/28}{\cs{marginparwidth} setting added.}
% \begin{macrocode}
\reversemarginpar
\setlength\marginparpush{0pt} \setlength\marginparwidth{8pc}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bslash}
% \changes{v1.7a}{1992/02/26}{Moved \cs{bslash} documentation to `user
% interface' part}
% We start a new group in which to hide the alteration of
% |\catcode|$\,$s, and make \verb+|+ introduce commands,
% whilst |\| becomes an `other' character.
%
% \begin{macrocode}
{\catcode`\|=\z@ \catcode`\\=12
% \end{macrocode}
% Now we are able to define |\bslash| (globally) to generate a
% backslash of |\catcode| `other'. We then close this group,
% restoring original |\catcode|$\,$s.
% \SpecialEscapechar{\|}
% \begin{macrocode}
|gdef|bslash{\}}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\verbatim}
% \begin{macro}{\verbatim*}
% \changes{v1.7i}{1992/07/12}{Added changed definition for verbatim!*.}
% The \textsf{verbatim} environment holds no secrets; it consists of
% the normal \LaTeX{} environment. We also set the
% |\@beginparpenalty| and change to the font given by
% |\MacroFont|.
% \begin{macrocode}
\def\verbatim{\@beginparpenalty \predisplaypenalty \@verbatim
\MacroFont \frenchspacing \@vobeyspaces \@xverbatim}
% \end{macrocode}
% We deal in a similar way with the star form of this environment.
% \begin{macrocode}
\@namedef{verbatim*}{\@beginparpenalty \predisplaypenalty \@verbatim
\MacroFont \@sxverbatim}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@verbatim}
% Additionally we redefine the |\@verbatim| macro so that it
% suppresses |%| characters at the beginning of the line. The
% first lines are copied literally from \texttt{latex.tex}.
% \changes{v1.7i}{1992/07/12}{Added \cs{@@par} to clear possible
% \cs{parshape}.}
% \begin{macrocode}
\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
\leftskip\@totalleftmargin\rightskip\z@
\parindent\z@\parfillskip\@flushglue\parskip\z@
\@@par
\@tempswafalse
% \end{macrocode}
% |\@verbatim| sets |^^M|, the end of line character, to
% be equal to |\par|. This control sequence is redefined
% here; |\@@par| is the paragraph primitive of \TeX.
% \changes{v1.7c}{1992/3/24}{Added \cs{interlinepenalty} to
% \cs{par} from verbatim.sty}
% \begin{macrocode}
\def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par
\penalty\interlinepenalty
% \end{macrocode}
% We add a control sequence |\check@percent| to the definition
% of |\par| whose task it is to check for a percent character.
% \begin{macrocode}
\check@percent}%
% \end{macrocode}
% The rest is again copied literally from \texttt{latex.tex} (less
% "\tt").
% \changes{v1.7a}{1992/02/26}{Removed redundant \cs{tt}.}
% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim,
% which handles more ligatures.}
% \begin{macrocode}
\obeylines
\let\do\do@noligs \verbatim@nolig@list
\let\do\@makeother \dospecials}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\check@percent}
% Finally we define |\check@percent|. Since this must compare a
% character with a percent sign we must first (locally) change
% percent's |\catcode| so that it is seen by \TeX. The definition
% itself is nearly trivial: grab the following character, check if
% it is a |%|, and insert it again if not. At the end of the
% \textsf{verbatim} environment this macro will peek at the next
% input line. In that case the argument to |\check@percent| might
% be a |\par| or a macro with arguments. Therefore we make the
% definition |\long| (|\par| allowed) and use the normal |\next|
% mechanism to reinsert the argument after the |\fi| if necessary.
% \changes{v1.5i}{1989/06/07}{Definition changed to `long'}
% \changes{v1.5i}{1989/06/07}{Macro \cs{next} used to guard against
% macro with arguments}
% There is a subtle problem here, the equal sign between
% |\next| and |#1| is actually necessary. Do you see why?
% The omission of this token once caused a funny error.
% \changes{v1.5u}{1989/11/14}{equal sign added.}
% \begin{macrocode}
{\catcode`\%=12
\long\gdef\check@percent#1{\ifx #1%\let\next\@empty \else
\let\next=#1\fi \next}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verb}
% \changes{v1.7a}{1992/02/27}{Now warns about newlines (from
% newdoc with `@noligs added).}
% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX \cs{verb}}
% We re-define "\verb" to check for newlines in its argument since a
% missing delimiter is difficult to detect in \DOC{} source.
% The code is the saem as in latex.tex of September 19, 1993.
% Perhaps there should be a font-changing
% hook rather than just using "\tt", but if so it probably should be
% different from "\MacroFont" since that normally includes "\small"
% and would look wrong inline.
% \changes{v1.7a}{1992/02/28}{Added math mode check (from verbatim.sty)}
% \begin{macrocode}
\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
\bgroup \let\do\do@noligs \verbatim@nolig@list
\ttfamily \verb@eol@error \let\do\@makeother \dospecials
\@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verb@balance@group}
% \begin{macro}{\verb@egroup}
% \begin{macro}{\verb@eol@error}
% \changes{v1.8b}{1993/09/21}{Renamed \cs{verb@err} to
% \cs{verb@eol@error}, as in new LaTeX verbatim.}
% \begin{macrocode}
\let\verb@balance@group\@empty
\def\verb@egroup{\global\let\verb@balance@group\@empty\egroup}
\begingroup
\obeylines%
\gdef\verb@eol@error{\obeylines%
\def^^M{\verb@egroup\@latex@error{%
Text for \noexpand\verb command ended by end of line}\@ehc}}%
\endgroup
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@sverb}
% \changes{v1.7a}{1992/02/27}{Added for \cs{verb} change.}
% \changes{v1.7a}{1992/02/28}{Now same as in verbatim.sty.}
% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim,
% which has better error trapping.}
% See \cite{art:verbatim} for commentary.
% \begin{macrocode}
\def\@sverb#1{%
\catcode`#1\active \lccode`\~`#1%
\gdef\verb@balance@group{\verb@egroup
\@latex@error{Illegal use of \noexpand\verb command}\@ehc}%
\aftergroup\verb@balance@group
\lowercase{\let~\verb@egroup}}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\verbatim@nolig@list}
% \begin{macro}{\do@noligs}
% These macros replace the old "\@noligs" mechanism by an
% extensible version to allow more ligatures to be added.
% \begin{macrocode}
\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-}
\def\do@noligs#1{%
\catcode`#1\active
\begingroup
\lccode`\~=`#1\relax
\lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\macro}
% \begin{macro}{\m@cro@}
% \changes{v1.5v}{1990/01/28}{\cs{macro@} renamed to \cs{m@cro@}
% since AmSTeX
% defines another macro of the same name.}
% \begin{macro}{\macro@cnt}
% \label{page:macro} The \textsf{macro} environment is implemented as
% a \textsf{trivlist} environment, whereby in order that the macro
% names can be placed under one another in the margin
% (corresponding to the macro's nesting depth), the macro
% |\makelabel| must be altered. In order to store the nesting
% depth, we use a counter. We also need a counter to count the
% number of nested \textsf{macro} environments.
% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
% \changes{v1.9k}{1994/02/22}{Fix probably no longer necessary}
% \begin{macrocode}
\newcount\macro@cnt \macro@cnt=0
% \end{macrocode}
% The environment takes an argument---the macro name to be
% described. Since this name may contain special `letters' we have
% to re-|\catcode| them before scanning the argument. This is done
% by the |\MakePrivateLetters| macro.
% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
% \changes{v1.7a}{1992/02/26}{Catcode backslash to other (from newdoc).}
% \changes{v1.9k}{1994/02/22}{Don't omit extra group}
% \begin{macrocode}
\def\macro{\begingroup
\catcode`\\12
\MakePrivateLetters \m@cro@ \iftrue}
% \end{macrocode}
%
% \begin{macro}{\environment}
% \changes{v1.8c}{1993/10/25}{Environment added}
% The ``environment'' envrionment will be implemented just like the
% ``macro'' environment flagging any differences in the code by
% passing |\iffalse| or |\iftrue| to the |\m@cro@| environment
% doing the actual work.
% \begin{macrocode}
\def\environment{\begingroup
\catcode`\\12
\MakePrivateLetters \m@cro@ \iffalse}
% \end{macrocode}
% \end{macro}
%
% After scanning the argument we close the group to get the normal
% |\catcode|$\,$s back. Then we assign a special value to
% |\topsep| and start a \textsf{trivlist} environment.
% \changes{v1.5f}{1989/5/07}{MacroTopsep parameter added.}
% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
% \changes{v1.8c}{1993/10/25}{Support ``environment'' env}
% \changes{v1.9k}{1994/02/22}{Remove \cs{macro@level}}
% \begin{macrocode}
\long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
% \end{macrocode}
% We also save the name being described in |\saved@macroname| for
% use in conjunction with the |\changes| macro.
% \begin{macrocode}
\edef\saved@macroname{\string#2}%
% \end{macrocode}
% Now there follows a variation of |\makelabel| which is used
% should the environment not be nested, or should it lie between
% two successive |\begin{macro}| instructions or explanatory
% text. One can recognize this with the switch |\if@inlabel|
% which will be |true| in the case of successive |\item|
% commands.
% \begin{macrocode}
\def\makelabel##1{\llap{##1}}%
% \end{macrocode}
% If |@inlabel| is |true| and if $\verb=\macro@cnt= > 0$
% then the above definition needs to be changed, because in this
% case \LaTeX{} would otherwise put the labels all on the same line
% and this would lead to them being overprinted on top of each
% other. Because of this |\makelabel| needs to be redefined
% in this case.
% \begin{macrocode}
\if@inlabel
% \end{macrocode}
% If |\macro@cnt| has the value $1$, then we redefine
% |\makelabel| so that the label will be positioned in the
% second line of the margin. As a result of this, two macro names
% appear correctly, one under the other. It's important whilst
% doing this that the generated label box is not allowed to have
% more depth than a normal line since otherwise the distance
% between the first two text lines of \TeX{} will be incorrectly
% calculated. The definition should then look like:
%\begin{verbatim}
% \def\makelabel##1{\llap{\vtop to \baselineskip
% {\hbox{\strut}\hbox{##1}\vss}}}
%\end{verbatim}
% Completely analogous to this is the case where labels need to be
% placed one under the other. The lines above are only an example
% typeset with the \textsf{verbatim} environment. To produce the real
% definition we save the value of |\macro@cnt| in
% |\count@| and empty the temp macro |\@tempa| for later
% use.
% \begin{macrocode}
\let\@tempa\@empty \count@\macro@cnt
% \end{macrocode}
% In the following loop we append for every already typeset label
% an |\hbox{\strut}| to the definition of |\@tempa|.
% \begin{macrocode}
\loop \ifnum\count@>\z@
\edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
% \end{macrocode}
% Now be put the definition of |\makelabel| together.
% \changes{v1.5b}{1989/04/27}{vbox to vtop changed in makelabel (test)}
% \changes{v1.5e}{1989/04/28}{ht strutbox changed to baselineskip
% (test)}
% \begin{macrocode}
\edef\makelabel##1{\llap{\vtop to\baselineskip
{\@tempa\hbox{##1}\vss}}}%
% \end{macrocode}
% Next we increment the value of the nesting depth counter. This
% value inside the \textsf{macro} environment is always at least one
% after this point, but its toplevel definition is zero. Provided
% this environment has been used correctly, $|\macro@cnt|=0$
% should not occur when |@inlabel|=\textsf{true}. It is
% however possible if this environment is used within other list
% environments (but this would have little point).
% \begin{macrocode}
\advance \macro@cnt \@ne
% \end{macrocode}
% If |@inlabel| is false we reset |\macro@cnt| assuming
% that there is enough room to print the macro name without
% shifting.
% \begin{macrocode}
\else \macro@cnt\@ne \fi
% \end{macrocode}
% Now the label will be produced using |\item|. The following
% line is only a hack saving the day until a better solution is
% implemented. We have to face two problems: the argument might be
% a |\par| which is forbidden in the argument of other macros
% if they are not defined as |\long|, or it is something like
% |\iffalse| or |\else|, i.e.\ something which will be
% misinterpreted when \TeX{} is skipping conditional text. In both
% cases |\item| will bomb, so we protect the argument by using
% |\string|.
% \begin{macrocode}
\edef\@tempa{\noexpand\item[%
% \end{macrocode}
% Depending on whether we are inside a ``macro'' or ``environment''
% environment we use |\PrintMacroName| or |\PrintEnvName| to
% display the name.
% \begin{macrocode}
#1%
\noexpand\PrintMacroName
\else
\noexpand\PrintEnvName
\fi
{\string#2}]}%
\@tempa
% \end{macrocode}
% At this point we also produce an index entry. Because it is not
% known which index sorting program will be used, we do not use the
% command |\index|, but rather a command
% |\SpecialMainIndex| after advancing the counter for indexing
% by line number. This may be redefined by the user in
% order to generate an index entry which will be understood by the
% index program in use (note the definition of
% |\SpecialMainIndex| for our installation).
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v1.9u}{1995/08/06}{Removed brace group which
% killed \cs{DoNotIndex}}
% We advance the current codeline number and after producing an
% index entry revert to the original value
% \begin{macrocode}
\global\advance\c@CodelineNo\@ne
% \end{macrocode}
% Again the macro to call depends on the environment we are
% actually in.
% \begin{macrocode}
#1%
\SpecialMainIndex{#2}\nobreak
\DoNotIndex{#2}%
\else
\SpecialMainEnvIndex{#2}\nobreak
\fi
\global\advance\c@CodelineNo\m@ne
% \end{macrocode}
% The |\nobreak| is needed to prevent a page break after the
% |\write| produced by the |\SpecialMainIndex| macro. We
% exclude the new macro in the cross-referencing feature, to
% prevent spurious non-main entry references. Regarding possibly
% problematic arguments, the implementation takes
% care of |\par| and the conditionals are uncritical.
% \changes{v1.7a}{1992/03/02}{Removed redundant code checking for
% \cs{par}.}^^A
%
% Because the space symbol should be ignored between the
% |\begin{macro}{...}| and the following text we must take
% care of this with |\ignorespaces|.
% \begin{macrocode}
\ignorespaces}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \begin{macro}{\endmacro}
% \begin{macro}{\endenvironment}
% Older releases of this environment omit the |\endgroup| token,
% when being nested. This was done to avoid unnessary stack usage.
% However it does not work if \textsf{macro} and
% \textsf{environment} environments are mixed, therefore we now
% use a simpler approach.
% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
% \changes{v1.9k}{1994/02/22}{Don't checkfor nesting}
% \begin{macrocode}
\let\endmacro \endtrivlist
\let\endenvironment\endmacro
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\MacroTopsep}
% Here is the default value for the |\MacroTopsep| parameter
% used above.
% \begin{macrocode}
\newskip\MacroTopsep \MacroTopsep = 7pt plus 2pt minus 2pt
% \end{macrocode}
% \end{macro}
%
%
%
%
%
% \subsection{Formatting the margin}
%
% The following three macros should be user definable.
% Therefore we define those macros only if they have not already
% been defined.
%
% \begin{macro}{\PrintMacroName}
% \begin{macro}{\PrintEnvName}
% \begin{macro}{\PrintDescribeMacro}
% \begin{macro}{\PrintDescribeEnv}
% The formatting of the macro name in the left margin is done by
% these macros. We first set a |\strut| to get the height and
% depth of the normal lines. Then we change to the
% |\MacroFont| using |\string| to |\catcode| the
% argument to other (assuming that it is a macro name). Finally we
% print a space. The font change remains local since this macro
% will be called inside an |\hbox|.
% \begin{macrocode}
\@ifundefined{PrintMacroName}
{\def\PrintMacroName#1{\strut \MacroFont \string #1\ }}{}
% \end{macrocode}
% We use the same formatting conventions when describing a macro.
% \begin{macrocode}
\@ifundefined{PrintDescribeMacro}
{\def\PrintDescribeMacro#1{\strut \MacroFont \string #1\ }}{}
% \end{macrocode}
% To format the name of a new environment there is no need to use
% |\string|.
% \begin{macrocode}
\@ifundefined{PrintDescribeEnv}
{\def\PrintDescribeEnv#1{\strut \MacroFont #1\ }}{}
\@ifundefined{PrintEnvName}
{\def\PrintEnvName#1{\strut \MacroFont #1\ }}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Creating index entries by scanning `macrocode'}
%
% The following macros ensure that index entries are created for each
% occurrence of a \TeX-like command (something starting with
% `|\|') providing indexing has been turned on with "\PageIndex"
% or "\CodelineIndex". With the default definitions of
% |\SpecialMainIndex|, etc., the index file generated is
% intended to be processed by Chen's \textsf{makeindex} program
% \cite{art:Chen}.
%
%
% Of course, in {\em this\/} package file itself we've sometimes had to
% make \verb+|+ take the r\^ole of \TeX's escape character to
% introduce command names at places where |\| has to belong to
% some other category. Therefore, we may also need to recognize
% \verb+|+ as the introducer for a command when setting the text
% inside the \textsf{macrocode} environment. Other users may have the
% need to make similar reassignments for their macros.
%
%
% \begin{macro}{\SpecialEscapechar}\label{sect:specialescapechar}
% \begin{macro}{\active@escape@char}
% \begin{macro}{\special@escape@char}
% The macro |\SpecialEscapechar| is used to denote a special escape
% character for the next \textsf{macrocode} environment. It has one
% argument---the new escape character given as a `single-letter'
% control sequence. Its main purpose is defining
% |\special@escape@char| to produce the chosen escape character
% |\catcode|$\,$d to 12 and |\active@escape@char| to produce the
% same character but with |\catcode| 13.
%
% The macro |\special@escape@char| is used to {\em print\/}
% the escape character while |\active@escape@char| is needed
% in the definition of |\init@crossref| to start the scanning
% mechanism.
%
% In the definition of |\SpecialEscapechar| we need an
% arbitrary character with |\catcode| 13. We use `\~{}' and
% ensure that it is active. The |\begingroup| is used to make
% a possible change local to the expansion of
% |\SpecialEscapechar|.
% \changes{v1.7g}{1992/6/19}{Making tilde active moved outside
% definition}
% \begin{macrocode}
\begingroup
\catcode`\~\active
\gdef\SpecialEscapechar#1{%
\begingroup
% \end{macrocode}
% Now we are ready for the definition of
% |\active@escape@char|. It's a little tricky: we first
% define locally the uppercase code of `\~{}' to be the new escape
% character.
% \begin{macrocode}
\uccode`\~`#1%
% \end{macrocode}
% Around the definition of |\active@escape@char| we place an
% |\uppercase| command. Recall that the expansion of
% |\uppercase| changes characters according to their
% |\uccode|, but leaves their |\catcode|$\,$s untouched
% (cf.\ \TeX{}book page 41).
% \begin{macrocode}
\uppercase{\gdef\active@escape@char{~}}%
% \end{macrocode}
% The definition of |\special@escape@char| is easier, we use
% |\string| to |\catcode| the argument of
% |\SpecialEscapechar| to 12 and suppress the preceding
% |\escapechar|.
% \begin{macrocode}
\escapechar\m@ne \xdef\special@escape@char{\string#1}%
% \end{macrocode}
% Now we close the group and end the definition: the value of
% |\escapechar| as well as the |\uccode| and
% |\catcode| of `\~{}' will be restored.
% \begin{macrocode}
\endgroup}
\endgroup
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
% \begin{macro}{\init@crossref}
% The replacement text of |\init@crossref| should fulfill the
% following tasks:
% \begin{itemize}
% \parindent4em
% \item[1)]
% |\catcode| all characters used in macro names to
% 11 (i.e.\ `letter').
% \item[2)]
% |\catcode| the `|\|' character to 13
% (i.e.\ `active').
% \item[3a)]
% |\let| the `|\|' equal |\scan@macro|
% (i.e.\ start the macro scanning mechanism) if there is
% no special escape character (i.e.\ the
% |\special@escape@char| is `|\|').
% \item[3b)]
% Otherwise |\let| it equal |\bslash|, i.e.\
% produce a printable |\|.
% \item[4)]
% Make the \meta{special escape character} active.
% \item[5)]
% |\let| the active version of the special escape
% character
% (i.e.\ the expansion of |\active@escape@char|) equal
% |\scan@macro|.
% \end{itemize}
% The reader might ask why we bother to |\catcode| the
% `|\|' first to 12 (at the end of |\macro@code|) then
% re-|\catcode| it to 13 in order to produce a $|\|_{12}$
% in case 3b) above. This is done because we have to ensure that
% `|\|' has |\catcode| 13 within the \textsf{macrocode}
% environment. Otherwise the delimiter for the argument of
% |\xmacro@code| would not be found (parameter matching
% depends on |\catcode|$\,$s).
%
% Therefore we first re-|\catcode| some characters.
% \begin{macrocode}
\begingroup \catcode`\|=\z@ \catcode`\\=\active
% \end{macrocode}
% We carry out tasks 2) and 3b) first.
% \SpecialEscapechar{\|}
% \begin{macrocode}
|gdef|init@crossref{|catcode`|\|active |let\|bslash
% \end{macrocode}
% Because of the popularity of the `|@|' character as a
% `letter' in macros, we normally have to change its
% |\catcode| here, and thus fulfill task 1). But the macro
% designer might use other characters as private letters as well,
% so we use a macro to do the |\catcode| switching.
% \SpecialEscapechar\|
% \begin{macrocode}
|MakePrivateLetters
% \end{macrocode}
% Now we |\catcode| the special escape character to 13 and
% |\let| it equal |\scan@macro|, i.e.\ fulfill tasks 4)
% and 5). Note the use of |\expandafter| to insert the chosen
% escape character saved in |\special@escape@char| and
% |\active@escape@char|.
% \SpecialEscapechar\|
% \begin{macrocode}
|catcode|expandafter`|special@escape@char|active
|expandafter|let|active@escape@char|scan@macro}
|endgroup
% \end{macrocode}
% If there is no special escape character, i.e.\ if
% |\SpecialEscapechar| is |\\|, the second last line will
% overwrite the previous definition of $|\|_{13}$. In this
% way all tasks are fulfilled.
%
% For happy documenting we give default values to
% |\special@escape@char| and |\active@escape@char| with
% the following line:
% \begin{macrocode}
\SpecialEscapechar{\\}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\MakePrivateLetters}
% Here is the default definition of this command, which makes just
% the |@| into a letter. The user may change it if he/she
% needs more or other characters masquerading as letters.
% \begin{macrocode}
\@ifundefined{MakePrivateLetters}
{\let\MakePrivateLetters\makeatletter}{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\close@crossref}
% At the end of a cross-referencing part we prepare ourselves for
% the next one by setting the escape character to `|\|'.
% \begin{macrocode}
\def\close@crossref{\SpecialEscapechar\\}
% \end{macrocode}
% \end{macro}
%
%
%
%
% \subsection{Macros for scanning macro names}
%
% \begin{macro}{\scan@macro}
% \changes{v1.5k}{1989/09/04}{Support for checksum added.}
% \begin{macro}{\macro@namepart}
% The |\init@crossref| will have made |\active| our
% |\special@escape@char|, so that each
% |\active@escape@char| will invoke |\scan@macro| when
% within the \textsf{macrocode} environment. By this means, we can
% automatically add index entries for every \TeX-like command which
% is met whilst setting (in verbatim) the contents of
% \textsf{macrocode} environments.
% \begin{macrocode}
\def\scan@macro{%
% \end{macrocode}
% First we output the character which triggered this macro. Its
% version |\catcode|$\,$d to 12 is saved in
% |\special@escape@char|. We also call |\step@checksum|
% to generate later on a proper check-sum (see section
% \ref{sec:checksum} for details).
% \begin{macrocode}
\special@escape@char
\step@checksum
% \end{macrocode}
% If the \textsf{macrocode} environment contains, for example, the
% command |\\|, the second |\| should not start the
% scanning mechanism. Therefore we use a switch to decide if
% scanning of macro names is allowed.
% \begin{macrocode}
\ifscan@allowed
% \end{macrocode}
% The macro assembles the letters forming a \TeX\ command in
% |\macro@namepart| so this is initially cleared; we then set
% |\next| to the \textit{first\/} character following the
% |\| and call |\macro@switch| to determine whether that
% character is a letter or not.
% \begin{macrocode}
\let\macro@namepart\@empty
\def\next{\futurelet\next\macro@switch}%
% \end{macrocode}
% As you recognize, we actually did something else, because we have
% to defer the |\futurelet| call until after the final
% |\fi|. If, on the other hand, the scanning is disabled we
% simply |\let| |\next| equal `empty'.
% \begin{macrocode}
\else \let\next\@empty \fi
% \end{macrocode}
% Now we invoke |\next| to carry out what's needed.
% \begin{macrocode}
\next}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\ifscan@allowed}
% \begin{macro}{\scan@allowedtrue}
% \begin{macro}{\scan@allowedfalse}
% |\ifscan@allowed| is the switch used above to determine if
% the |\active@escape@char|\SpecialIndex{\active@escape@char}
% should start the macro scanning mechanism.
% \begin{macrocode}
\newif\ifscan@allowed \scan@allowedtrue
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\EnableCrossrefs}
% \begin{macro}{\DisableCrossrefs}
% At this point we might define two macros which allow the user to
% disable or enable the cross-referencing mechanism. Processing of
% files will be faster if only main index entries are generated
% (i.e., if |\DisableCrossrefs| is in force).
% \begin{macrocode}
\def\DisableCrossrefs{\@bsphack\scan@allowedfalse\@esphack}
% \end{macrocode}
% The macro |\EnableCrossrefs| will also disable any
% |\DisableCrossrefs| command encountered afterwards.
% \begin{macrocode}
\def\EnableCrossrefs{\@bsphack\scan@allowedtrue
\def\DisableCrossrefs{\@bsphack\@esphack}\@esphack}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
% \begin{macro}{\macro@switch}
% Now that we have the character which follows the escape character
% (in |\next|), we can determine whether it's a `letter'
% (which probably includes |@|).
%
% If it is, we let |\next| invoke a macro which assembles the
% full command name.
% \begin{macrocode}
\def\macro@switch{\ifcat\noexpand\next a%
\let\next\macro@name
% \end{macrocode}
% Otherwise, we have a `single-character' command name. For all
% those single-character names, we use |\short@macro| to
% process them into suitable index entries.
% \begin{macrocode}
\else \let\next\short@macro \fi
% \end{macrocode}
% Now that we know what macro to use to process the macro name, we
% invoke it~\ldots
% \begin{macrocode}
\next}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\short@macro}
% \changes{v1.5c}{1989/4/27}{Corrected bad bug by putting the
% scan@allowedfalse macro before printing
% the argument.}
% \changes{v1.7a}{1992/03/10}{Ensure character stored in
% \cs{macro@namepart} as `letter' so index exclusion works.}
% This macro will be invoked (with a single character as parameter)
% when a single-character macro name has been spotted whilst
% scanning within the \textsf{macrocode} environment.
%
% First we take a look at the |\index@excludelist| to see
% whether this macro name should produce an index entry. This is
% done by the |\ifnot@excluded| macro which assumes that the
% macro name is saved in |\macro@namepart|. The character
% mustn't be stored with a special category code or exclusion from
% the index won't work, so we employ the case-changing trick used
% elsewhere. Since the argument might be an active character,
% |\string| is used to normalize it.
% \changes{v2.0e}{1998/12/28}{Correctly use the case-changing trick.}
% \begin{macrocode}
\begingroup
\catcode`\&=12
\gdef\short@macro#1{\begingroup
\uccode`\&=\expandafter`\string#1%
\uppercase{\def\x{\def\macro@namepart{&}}}%
\expandafter\endgroup\x
\ifnot@excluded
% \end{macrocode}
% If necessary the index entry is produced by the macro
% |\produce@index|. Depending on the actual character seen,
% this macro has to do different things, so we pass the character
% as an argument.
% \begin{macrocode}
\produce@index{#1}\fi
% \end{macrocode}
% Then we disable the cross-referencing mechanism with
% |\scan@allowedfalse| and print the actual character. The
% index entry was generated first to ensure that no page break
% intervenes (recall that a |^^M| will start a new line).
% \begin{macrocode}
\scan@allowedfalse#1%
% \end{macrocode}
% After typesetting the character we can safely enable the
% cross-referencing feature again. Note that this macro won't be
% called (since |\macro@switch| won't be called) if
% cross-referencing is globally disabled.
% \begin{macrocode}
\scan@allowedtrue }
\endgroup
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\produce@index}
% \changes{v1.4s}{1989/04/23}{Added noexpand to all
% \cs{if} tests
% to avoid garbage produced by new active chars}
% \changes{v1.4s}{1989/04/23}{Used \texttt{\protect\bslash string} for
% the same reason.}
% \changes{v1.5c}{1989/4/27}{Corrected bad bug by placing the
% scan@allowedfalse macro into short@macro}
% This macro is supposed to generate a suitable |\SortIndex|
% command for a given single-letter control sequence. We test
% first for the cases which involve active characters (i.e.\ the
% backslash, the special escape character (if any), the space and
% the |^^M|). Using the |\if| test (testing for
% character codes), we have to ensure that the argument isn't
% expanded.
% \begin{macrocode}
\def\produce@index#1{%
\if\noexpand#1\special@escape@char
% \end{macrocode}
% If the character is the special escape character (or the
% `|\|' in case there was none) the |\it@is@a| macro is
% used to produce the actual |\SortIndex| call.
% \begin{macrocode}
\scan@allowedfalse \it@is@a\special@escape@char \else
% \end{macrocode}
% Next comes the test for a `|\|' which must be the
% $|\|_{13}$ expanding to |\bslash|.
% \begin{macrocode}
\if\noexpand#1\bslash \it@is@a\bslash \else
% \end{macrocode}
% Another possibility is \verb*+ +$_{13}$. Recall that |\space|
% produces a \verb*+ +$_{10}$.
% \begin{macrocode}
\if\noexpand#1\space \it@is@a\space \else
% \end{macrocode}
% The last\footnote{Well, it isn't the last active character after
% all. I added \texttt{\bslash @noligs} some days ago and now
% \texttt{`} too is active. So we have to make sure that such
% characters don't get expanded in the index.} possibility of an
% active character is |^^M|\@. In this case we don't test for
% character codes, since it is easier to look if the character is
% equal to |\par|. (We are inside the \textsf{macrocode}
% environment.)
% \begin{macrocode}
\ifx#1\par
% \end{macrocode}
% If we end up here we have just scanned a |\^^M| or something
% similar. Since this will be treated like \verb*+\ + by \TeX{} we
% produce a corresponding index entry.
% \begin{macrocode}
\it@is@a\space \else
% \end{macrocode}
% If it is the token |\relax| we do nothing. This can't happen
% when the `doc' package is used in the way described here, but was
% added to allow extensions like the \texttt{idxverb} option.
% \changes{v1.5t}{1989/11/14}{Added \cs{relax} as a possible token to
% allow extensions.}
% \begin{macrocode}
\ifx#1\relax \else
% \end{macrocode}
% The next three branches are needed because of bugs in
% our \textsf{makeindex} program. You can't produce unbalanced index
% entries\footnote{This is possible for \TeX{} if you use
% \texttt{\string{$_{12}$ \rmfamily or
% \ttfamily\string}$_{12}$},
% but \textsf{makeindex} will complain.}
% and you have to double a percent character. To get around these
% restrictions we use special macros to produce the |\index|
% calls.\footnote{Brian \textsc{Hamilton Kelly} has written fixes for
% all three
% bugs. When they've found their way through all
% installations,
% the lines above will be removed. See
% page~\pageref{bug:fixes} if you already have them.
% (I'm not sure which versions incorporate these, but
% 2.11 is OK. See also
% \pageref{makeindex:version}.)}
% \begin{macrocode}
\if\noexpand#1\bgroup \LeftBraceIndex \else
\if\noexpand#1\egroup \RightBraceIndex \else
\if\noexpand#1\percentchar \PercentIndex \else
% \end{macrocode}
% All remaining characters are used directly to produce their index
% entries. This is possible even for the characters which have
% special meanings in the index program, provided we quote the
% characters. (This is correctly done in |\it@is@a|.)
% \begin{macrocode}
\it@is@a{\string#1}%
% \end{macrocode}
% We now need a whole pile of |\fi|$\,$s to match up with
% the |\if|$\,$s.
% \begin{macrocode}
\fi \fi \fi \fi \fi \fi \fi \fi}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\macro@name}
% We now come to the macro which assembles command names which
% consist of one or more `letters' (which might well include
% |@| symbols, or anything else which has a |\catcode| of
% 11).
%
% To do this we add the `letter' to the existing definition of
% |\macro@namepart| (which you will recall was originally set
% to |\@empty|).
% \begin{macrocode}
\def\macro@name#1{\edef\macro@namepart{\macro@namepart#1}%
% \end{macrocode}
% Then we grab hold of the {\em next\/} single character and let
% |\more@macroname| determine whether it belongs to the letter
% string forming the command name or is a `non-letter'.
% \begin{macrocode}
\futurelet\next\more@macroname}
% \end{macrocode}
% \end{macro}
%
%
%
%
%
% \begin{macro}{\more@macroname}
%
% This causes another call of |\macro@name| to add in the next
% character, if it is indeed a `letter'.
% \begin{macrocode}
\def\more@macroname{\ifcat\noexpand\next a%
\let\next\macro@name
% \end{macrocode}
% Otherwise, it finishes off the index entry by invoking
% |\macro@finish|.
% \begin{macrocode}
\else \let\next\macro@finish \fi
% \end{macrocode}
% Here's where we invoke whatever macro was |\let| equal to
% |\next|.
% \begin{macrocode}
\next}
% \end{macrocode}
% \end{macro}
%
%
%
%
%
% \begin{macro}{\macro@finish}
% When we've assembled the full `letter'-string which forms the
% command name, we set the characters forming the entire command
% name, and generate an appropriate |\index| command (provided
% the command name is not on the list of exclusions). The
% `|\|' is already typeset; therefore we only have to output
% all `letters' saved in |\macro@namepart|.
% \begin{macrocode}
\def\macro@finish{%
\macro@namepart
% \end{macrocode}
% Then we call |\ifnot@excluded| to decide whether we have to
% produce an index entry. The construction with |\@tempa| is
% needed because we want the expansion of |\macro@namepart| in
% the |\index| command.\footnote{The \texttt{\bslash index}
% command will expand its argument in the \texttt{\bslash output}
% routine. At this time \texttt{\bslash macro@namepart} might have a
% new value.}
% \begin{macrocode}
\ifnot@excluded
\edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}%
\@tempa \fi}
% \end{macrocode}
% \end{macro}
%
%
%
%
%
% \subsection[The index exclude list]{The index exclude
% list\footnotemark}
% \footnotetext{Warning: the incomplete commentary on
% \texttt{\bslash DoNotIndex} and the macros it calls
% was written by Dave Love.}
%
% The internal form of the index exclude list is
% \begin{quote}
% \meta{macro name}|,|\meta{macro name}|,|
% \ldots|,|
% \end{quote}
% where \meta{macro name} is a macro name like
% $"\"_{12}"p"{_{11}}"@"_{11}$ or $"\"_{12}"$"_{11}$. Note that the "\"
% has category `other' and the other characters in the name are all
% `letter', regardless of their normal category.
%
% \begin{macro}{\DoNotIndex}
% This macro is used to suppress macro names in the index. It
% starts off with a new group because we have to change the
% |\catcode|$\,$s of all characters which belong to `letters'
% while macros are defined.
% \begin{macrocode}
\def\DoNotIndex{\begingroup \MakePrivateLetters
\catcode`\\12
% \end{macrocode}
% Then we call the macro which actually reads the argument given by
% the user.
% \begin{macrocode}
\do@not@index}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\do@not@index}
% We make the |\do@not@index| macro |\long|
% since the user might want to exclude the |\par|
% macro.
% \begin{macrocode}
\long\def\do@not@index#1{%
% \end{macrocode}
% It just adds to a token list after finishing the group in which
% the catcodes were changed.
% \changes{v1.7a}{1992/02/26}{Replaced with newdoc version.}
% \begin{macrocode}
\endgroup
\addto@hook\index@excludelist{#1,}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\addto@hook}
% The code for adding tokens (the second argument) to a token list
% (the first argument) is taken from~\cite{art:verbatim}, but it needs
% to be "\long" in case "\par" is amongst the tokens.
% \begin{macrocode}
\long\def\addto@hook#1#2{#1\expandafter{\the#1#2}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\index@excludelist}
% We need an initially-empty register for the excluded list.
% \begin{macrocode}
\newtoks\index@excludelist
\index@excludelist{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifnot@excluded}
% \changes{v1.7a}{1992/02/26}{Replaced with newdoc version.}
% \begin{macro}{\expanded@notin}
% Now we take a look at the |\index@excludelist| to see
% whether a macro name saved in |\macro@namepart| should
% produce an index entry. This macro is a pseudo |\if|; it
% should expand to |\iftrue| or |\iffalse| depending on
% the contents of |\index@excludelist|.
% \begin{macrocode}
\begingroup
% \end{macrocode}
% First we change "\catcode"s so that "\" is `other' and "|" a
% temporary for the escape character. This is necessary since our
% macro names are stored that way in the "\index@excludelist".
% \begin{macrocode}
\catcode`\|=0%
\catcode`\\=12
% \end{macrocode}
% Then we define "\ifnot@excluded" to call "\expanded@notin" with
% two arguments: the first is the string "\" followed by the
% contents of "\macro@namepart" followed by a "," and the second is
% "\the" followed by "\index@excludelist". To achieve the expansion
% of "\macro@namepart", i.e.\ to pass its contents, we need a
% suitable number of "\expandafter"s.
% \SpecialEscapechar{\|}
% \begin{macrocode}
|gdef|ifnot@excluded{|expandafter
|expanded@notin|expandafter{|expandafter
\|macro@namepart,}{|the|index@excludelist}}
|endgroup
% \end{macrocode}
% The macro "\expanded@notin" now does the dirty work. It first
% defines a macro "\in@@" with a very special parameter text. If
% you look closely "\in@@" has three arguments, the first one is
% delimited by the first argument of "\expanded@notin" (i.e.\ by
% the string starting with a "\" and ending with a "," above), the
% second is undelimited (which means that it will get the next
% token after our string, and the third is delimited again and will
% get the rest up to the token "\in@@". In other words the token
% "\in@@" is also used as a delimiter.
% \begin{macrocode}
\def\expanded@notin#1#2{%
\def\in@@##1#1##2##3\in@@{%
% \end{macrocode}
% Now the replacement text simply compares the second argument
% (i.e.\ the undelimited one after our string) to the token
% "\expanded@notin". This is an unclosed "\ifx" statement which
% means that this macro behaves similar to a normal \TeX{}
% conditional.
% \begin{macrocode}
\ifx\expanded@notin##2}%
% \end{macrocode}
% After all these preparations we call "\in@@". First we expand the
% token after "\in@@" (which is "\the" from the second argument to
% "\expanded@notin"). As a result we get the contents of the
% "\index@excludelist" inserted after "\in@@". After this contents
% we add once more the string we are looking for, then the token
% "\expanded@notin" and finally the token "\in@@".
% \begin{macrocode}
\expandafter\in@@#2#1\expanded@notin\in@@}
% \end{macrocode}
% Now what happens when the macro "\in@@" above gets called? The
% first argument to "\in@@" is delimited by our string. In other
% words it will get everything from the contents of
% "\index@excludelist" before this string. If the string is not in
% "\index@excludelist" then it gets the whole contents, since after
% it we had inserted the string one more. In this case the next
% token is "\expanded@notin" which gets assigned to the second
% argument and the third argument will be empty. If, on the other
% hand, the string was inside "\index@excludelist" then the second
% argument will not be the token "\expanded@notin" and the third
% argument will be all the garbage up to "\in@@". Therefore testing
% the seconded argument, as done in the definition of "\in@@" will
% tell us whether or not the string is in "\index@includelist" and
% this was exactly what we wanted. (Deep breath.) You got
% that?\footnote{\TeX{}book page 125. The code described above is
% originally due to Michael Spivak who used a similar method within
% the \AmSTeX{} macros.}
% \end{macro}
% \end{macro}
%
%
%
%
%
%
%
% \subsection{Macros for generating index entries}
%
% Here we provide default definitions for the macros invoked to create
% index entries; these are either invoked explicitly, or automatically
% by |\scan@macro|. As already mentioned, the definitions given
% here presuppose that the |.idx| file will be processed by
% Chen's \textsf{makeindex} program --- they may be redefined for use
% with the user's favourite such program.
%
% To assist the reader in locating items in the index, all such
% entries are sorted alphabetically {\em ignoring\/} the initial
% `|\|'; this is achieved by issuing an |\index| command which
% contains the `actual' operator for \textsf{makeindex}. The default
% value for the latter operator is `|@|', but the latter character is
% so popular in \LaTeX\ package files that it is necessary to substitute
% another character. This is indicated to \textsf{makeindex} by means
% of an `index style file'; the character selected for this function
% is |=|, and therefore this character too must be specially treated
% when it is met in a \TeX\ command. A suitable index style file is
% provided amongst the supporting files for this style file in
% \texttt{gind.ist} and is generated from this source by processing
% with \texttt{docstrip} to extract the module \textbf{gind}. A
% similar style file \texttt{gglo.ist} is supplied for sorting the
% change information in the glossary file and is extracted as module
% \textbf{gglo}. First of all we add some information to the front of
% the \texttt{.ist} files. \changes{v1.7a}{1992/03/11}{glo.ist and
% gind.ist now derivable from doc.dtx with docstrip.}
% \begin{macrocode}
%</package>
%<+gind|gglo>%% This is a MAKEINDEX style file which should be used to
%<+gind>%% generate the formatted index for use with the doc
%<+gglo>%% generate the formatted change history for use with the doc
%<+gind|gglo>%% package. The TeX commands used below are defined in
%<+gind|gglo>%% doc.sty. The commands for MAKEINDEX like `level'
%<+gind|gglo>%% `item_x1' are described in `` Makeindex, A General
%<+gind|gglo>%% Purpose, Formatter-Independent Index Processor'' by
%<+gind|gglo>%% Pehong Chen.
%<+gind|gglo>
% \end{macrocode}
%
% \begin{macro}{\actualchar}
% \begin{macro}{\quotechar}
% \begin{macro}{\levelchar}
% First come the definitions of |\actualchar|,
% |\quotechar| and |\levelchar|. Note, that our defaults
% are not the ones used by the \textsf{makeindex} program without a
% style file.
% \begin{macrocode}
%<*package>
\@ifundefined{actualchar}{\def\actualchar{=}}{}
\@ifundefined{quotechar}{\def\quotechar{!}}{}
\@ifundefined{levelchar}{\def\levelchar{>}}{}
%</package>
%<+gind|gglo>actual '='
%<+gind|gglo>quote '!'
%<+gind|gglo>level '>'
%<*package>
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\encapchar}
% The \textsf{makeindex} default for the |\encapchar| isn't
% changed.
% \begin{macrocode}
\@ifundefined{encapchar}{\def\encapchar{|}}{}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\verbatimchar}
% We also need a special character to be used as a delimiter for
% the |\verb*| command used in the definitions below.
% \begin{macrocode}
\@ifundefined{verbatimchar}{\def\verbatimchar{+}}{}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\SpecialIndex}
% The |\SpecialIndex| command creates index entries for
% macros. If the argument is |\|$xyz$, the command produces
% \verb|\indexentry{|$xyz$\verb|=\verb!*+\|$xyz$\verb|+}{|$n$\verb|}|
% given the above defined defaults for |\actualchar|,
% |\quotechar| and |\verbatimchar|. We first remove the
% initial `|\|' to get a better index.
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \begin{macrocode}
\def\SpecialIndex#1{\@bsphack\special@index{\expandafter\@gobble
\string#1\actualchar
% \end{macrocode}
% Then follows the actual entry. A |\quotechar| is placed
% before the |*| to allow its use as a special \textsf{makeindex}
% character. Again |\@bsphack| and |\@esphack| are used
% to make the macros invisible.
% \begin{macrocode}
\string\verb\quotechar*\verbatimchar\string#1\verbatimchar}%
\@esphack}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SpecialMainIndex}
% \begin{macro}{\SpecialMainEnvIndex}
% \begin{macro}{\SpecialUsageIndex}
% The |\SpecialMainIndex| macro is used to cross-reference the
% names introduced by the \textsf{macro} environment. The action is
% as for |\SpecialIndex|, except that \textsf{makeindex} is
% instructed to `encap'sulate the entry with the string
% \verb=|main= to cause it to generate a call of the |\main|
% macro.
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v2.0c}{1998/08/22}{Correctly handle single character
% control sequences like \cs{<}.}
%
% |\SpecialMainIndex| passes the macro name to be indexed on to the
% macro |\SpecialIndex@|.
% \begin{macrocode}
\def\SpecialMainIndex#1{\@bsphack\SpecialIndex@{#1}{\encapchar main}%
\@esphack}
% \end{macrocode}
%
% \begin{macro}{\SpecialIndex@}
% \changes{v2.0c}{1998/08/22}{Macro added.}
% \changes{v2.0f}{1999/02/27}{Temp fix to allow strange code in arg 1
% (PR 2968)}
% The macro |\SpecialIndex@| does the real work for |\SpecialMainIndex|
% and |\SpecialUsageIndex|. It takes two arguments: the macro to be
% indexed (as a control sequence or list of character tokens) and the
% additional text for the index.
% \changes{v2.0g}{1999/03/22}{Correct so-called temp fix. I'm not going to
% explain this.}
% \begin{macrocode}
\begingroup
\catcode`\|=0
\catcode`\\=12
|gdef|@SpecialIndexHelper@#1#2|@nil{%
|if |noexpand#1\%
|gdef|@gtempa{#2}%
|else
|begingroup
|escapechar|m@ne
|expandafter|gdef|expandafter|@gtempa|expandafter{|string#1#2}%
|endgroup
|fi}
|endgroup
\def\SpecialIndex@#1#2{%
% \end{macrocode}
% The first thing it does is to convert the macro into a list of
% characters. Note that a character token list remains (mostly) unchanged.
% \begin{macrocode}
\@SpecialIndexHelper@#1\@nil
% \end{macrocode}
% The macro name \verb*|\ | has to handled in a special way. The reason
% is that the space token is skipped when \TeX\ is scanning macro
% parameters, so that the trick used below will not work.
% So, we check whether the replacement text of |\@tempa| starts with
% a space token and write the appropriate index entry.
% \begin{macrocode}
\def\@tempb{ }%
\ifcat \@tempb\@gtempa
\special@index{\quotechar\space\actualchar
\string\verb\quotechar*\verbatimchar
\quotechar\bslash\quotechar\space\verbatimchar#2}%
\else
% \end{macrocode}
% Having handled this special case we have to distinguish control
% sequences consisting of one or more
% letters and those that consists of exactly one nonletter. As character
% tokens in the replacement text of the macro |\@gtempa| have all
% category code $12$ (other), this is difficult. For simplicity, we treat
% all single character control sequences alike, irregardless of whether
% the character is a letter or not. This has the advantage that it works
% even for strange settings of the category codes.
%
% We define a utility macro |\@tempb| with two arguments, the second
% delimited by |\relax|.
% It will be called later so that the first argument is the first character
% of the macro name, and the second argument receives the rest of the
% characters. So we distinguish the two cases above by checking whether
% the second argument is empty.
% \begin{macrocode}
\def\@tempb##1##2\relax{\ifx\relax##2\relax
% \end{macrocode}
% If so, we define the helper macro |\@tempc| in a way that it
% adds quotechars in critical places.
% \begin{macrocode}
\def\@tempc{\special@index{\quotechar##1\actualchar
\string\verb\quotechar*\verbatimchar
\quotechar\bslash\quotechar##1\verbatimchar#2}}%
% \end{macrocode}
% Otherwise we write the characters as in |\SpecialIndex|.
% \begin{macrocode}
\else
\def\@tempc{\special@index{##1##2\actualchar
\string\verb\quotechar*\verbatimchar
\bslash##1##2\verbatimchar#2}}%
\fi}%
% \end{macrocode}
% Now pass the list of characters to \@tempb and call \@tempc to do the
% work.
% \begin{macrocode}
\expandafter\@tempb\@gtempa\relax
\@tempc
\fi}
% \end{macrocode}
% \end{macro}
%
% Slightly simpler is the main entry for environments
% \changes{v1.9e}{1994/02/03}{use \cs{ttfamily} with \cs{string}}
% \changes{v1.9f}{1994/02/07}{should have used \cs{noexpand}, sigh}
% \changes{v1.9i}{1994/02/11}{should have used \cs{protect}}
% \changes{v1.9j}{1994/02/16}{Back to string:-)}
% \changes{v1.9s}{1994/10/14}{Added missing percent and changed to
% \cs{ttfamily}}
% \changes{v2.0d}{1998/12/20}{Correctly handle second index entry
% by using \cs{special@index} not \cs{index} (PR/2928).}
% \changes{v2.0e}{1998/12/28}{Use \cs{string}, not \cs{protect} in argument to
% \cs{special@index}.}
% \changes{v2.1b}{2004/02/09}{environment names incorrectly sorted in
% index (pr/3615)}
% \begin{macrocode}
\def\SpecialMainEnvIndex#1{\@bsphack\special@index{%
#1\actualchar
{\string\ttfamily\space#1}
(environment)%
\encapchar main}%
\special@index{environments:\levelchar#1\actualchar{%
\string\ttfamily\space#1}\encapchar
main}\@esphack}
% \end{macrocode}
% The |\SpecialUsageIndex| is similar to |\SpecialMainIndex|, except
% that it uses the standard |\index| command.
% \texttt{usage} instead of \texttt{main}.
% \begin{macrocode}
\def\SpecialUsageIndex#1{\@bsphack
{\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}%
\@esphack}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
%
% \begin{macro}{\SpecialEnvIndex}
% Indexing environments is done a little bit differently; we produce
% two index entries with the |\SpecialEnvIndex| macro:
% \changes{v1.9e}{1994/02/03}{The index needs protecting}
% \changes{v1.9g}{1994/02/08}{should have used \cs{noexpand}, sigh}
% \changes{v1.9i}{1994/02/11}{should have used \cs{protect}}
% \begin{macrocode}
\def\SpecialEnvIndex#1{\@bsphack
% \end{macrocode}
% First we sort the environment under its own name stating in the
% actual entry that this is an environment.
% \begin{macrocode}
\index{#1\actualchar{\protect\ttfamily#1}
(environment)\encapchar usage}%
% \end{macrocode}
% The second entry is sorted as a subitem under the key
% `environments:'.
% \changes{v2.1b}{2004/02/09}{environment names incorrectly sorted in
% index (pr/3615)}
% \begin{macrocode}
\index{environments:#1\actualchar\levelchar{\protect\ttfamily#1}\encapchar
usage}\@esphack}
% \end{macrocode}
% Because both entries correspond to `descriptions' of the
% environment, we encapsulate the page numbers with the
% |\usage| macro.
% \end{macro}
%
%
%
% \begin{macro}{\SortIndex}
% This macro is used to generate the index entries for any
% single-character command that |\scan@macro| encounters. The
% first parameter specifies the lexical order for the character,
% whilst the second gives the actual characters to be printed in
% the entry. It can also be used directly to generate index entries
% which differ in sort key and actual entry.
% \begin{macrocode}
\def\SortIndex#1#2{\index{#1\actualchar#2}}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\it@is@a}
% This macro is supposed to produce a correct |\SortIndex|
% entry for a given character. Since this character might be
% recognised as a `command' character by the index program used,
% all characters are quoted with the |\quotechar|.
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \begin{macrocode}
\def\it@is@a#1{\special@index{\quotechar #1\actualchar
\string\verb\quotechar*\verbatimchar
\quotechar\bslash\quotechar#1\verbatimchar}}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\LeftBraceIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \begin{macro}{\RightBraceIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} These
% two macros fix the problems with \textsf{makeindex}. Note the
% `hack' with |\iffalse}\fi| to satisfy both \TeX{} and the
% \textsf{makeindex} program. When this is written to the
% \texttt{.idx} file \TeX{} will see both braces (so we get a
% balanced text). \textsf{makeindex} will also see balanced braces
% but when the actual index entry is again processed by \TeX{} the
% brace in between |\iffalse| |\fi| will vanish.
% \begin{macrocode}
\@ifundefined{LeftBraceIndex}{\def\LeftBraceIndex{%
\special@index{\bgroup\actualchar\string\verb\quotechar*\verbatimchar
\quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{}
\@ifundefined{RightBraceIndex}{\def\RightBraceIndex{%
\special@index{\egroup\actualchar\string\iffalse{\string\fi\string\verb
\quotechar*\verbatimchar\quotechar\bslash}\verbatimchar}}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\PercentIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v1.7c}{1992/03/25}{Default now for bug-fixed makeindex}
% By default we assume a version of \textsf{makeindex} without the
% percent bug is being used.
% \begin{macrocode}
\@ifundefined{PercentIndex}
{\def\PercentIndex{\it@is@a\percentchar}}{}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\OldMakeindex}
% \changes{v1.7c}{1992/03/26}{Replaced \cs{NewMakeIndex}.}
% \begin{macro}{\percentchar}
% Here is one solution for the percent bug in \textsf{makeindex}.
% The macro |\percentchar| denotes a |%|$_{12}$. Calling this from
% a package or the driver file sets things up
% appropriately.\label{bug:fixes}
% \begin{macrocode}
\def\OldMakeindex{\def\PercentIndex{%
\special@index{\quotechar\percentchar\actualchar\string\verb
\quotechar*\verbatimchar\quotechar\bslash
\percentchar\percentchar\verbatimchar}}}
{\catcode`\%=12 \gdef\percentchar{%}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
%
%
%
% \subsection{Redefining the \textsf{index} environment}
%
%\changes{v1.4r}{1989/04/22}{twocols env. placed into separate file}
%\changes{v1.4?}{1989/04/19}{use DEK's algorithm and implement
% a twocols env.}
%\changes{v1.4?}{1989/04/16}{changes to the index env.}
%\changes{v1.5a}{1989/04/26}{Now input multicol.sty instead of
% multcols.sty}
% \begin{macro}{\ifhave@multicol}
% \changes{v1.7a}{1992/03/04}{Added to support avoiding multicol.sty} By
% default the index is set in three columns, and will start on the
% same page as, and underneath, the last part of the text of the
% documented package file, if possible. The last page will be
% reformatted with balanced columns. This requires the
% \textsf{multicols} environment which is described elsewhere. So
% that \DOC{} can be run independently of
% \texttt{multicol.sty} we first check for its existence and set
% the "have@multicol" flag appropriately for use below.
% \changes{v1.9a}{1993/12/02}{Use \cs{IfFileExists}}
% \changes{v1.9m}{1994/04/28}{Use \cs{RequirePackage} to load multicol}
% \begin{macrocode}
\newif\ifhave@multicol
% \end{macrocode}
% If we found \texttt{multicol.sty} we use it. It would be nice to
% delay this (and the re-definition of "theindex") until we knew
% whether an index was actually required \ldots
% \begin{macrocode}
\IfFileExists{multicol.sty}{\have@multicoltrue
\RequirePackage{multicol}%
}{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\IndexMin}
% \begin{macro}{\c@IndexColumns}
% \changes{v1.4t}{1989/04/24}{Counter added.}
% If \texttt{multicol} is in use,
% when the index is started we compute the remaining space on the
% current page; if it is greater than |\IndexMin|, the first
% part of the index will then be placed in the available space.
% The number of columns set is controlled by the counter
% |\c@IndexColumns| which can be changed with a
% |\setcounter| declaration.
% \begin{macrocode}
\newdimen\IndexMin \IndexMin = 80pt
\newcount\c@IndexColumns \c@IndexColumns = 3
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\theindex}
% Now we start the multi-column mechanism, if appropriate. We use the
% \LaTeX{} counter |\c@IndexColumns| declared above to denote
% the number of columns and insert the `index prologue' text (which
% might contain a |\section| call, etc.). See the default
% definition for an example.
% \changes{v1.4t}{1989/04/24}{Incorporated new multicols env.}
% \changes{v1.5a}{1989/04/26}{Call multicols first}
% \changes{v1.6e}{1991/04/03}{Turned into env definition.}
% \changes{v1.7a}{1992/03/04}{Include test for multicols.}
% \begin{macrocode}
\ifhave@multicol
\renewenvironment{theindex}
{\begin{multicols}\c@IndexColumns[\index@prologue][\IndexMin]%
% \end{macrocode}
% Then we make a few last minute assignments to read the individual
% index |\item|$\,$s and finish off by ignoring any initial
% space.
% \begin{macrocode}
\IndexParms \let\item\@idxitem \ignorespaces}%
% \end{macrocode}
% \end{macro}
% \begin{macro}{\endtheindex}
% \changes{v1.4t}{1989/04/24}{Incorporated new multicols env.}
% At the end of the index, we have only to end the \textsf{multicols}
% environment.
% \begin{macrocode}
{\end{multicols}}
% \end{macrocode}
% If we can't use \textsf{multicols} we warn the user and use an
% environment that's basically the one from \texttt{article.sty}.
% \begin{macrocode}
\else
\typeout{Can't find multicol.sty -- will use normal index layout if
necessary.}
\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
\columnseprule \z@ \columnsep 35\p@
\twocolumn[\index@prologue]%
\IndexParms \let\item\@idxitem \ignorespaces}
\def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi}
\fi
% \end{macrocode}
% \end{macro}
% Here are the necessary \textsf{makeindex} declarations. We disable
% scanning of macro names inside the index with "\scan@allowedfalse\n"
% to avoid recursion.
% \begin{macrocode}
%</package>
%<+gind>preamble
%<+gind>"\n \\begin{theindex} \n \\makeatletter\\scan@allowedfalse\n"
%<+gind>postamble
%<+gind>"\n\n \\end{theindex}\n"
%<*package>
% \end{macrocode}
%
%
% \begin{macro}{\IndexPrologue}
% \begin{macro}{\index@prologue}
% \changes{v1.9w}{1995/12/27}{Text changed}
% \changes{v1.9x}{1996/01/11}{Text depends on code lines used}
% The |\IndexPrologue| macro is used to place a short message
% into the document above the index. It is implemented by
% redefining |\index@prologue|, a macro which holds the
% default text. We'd better make it a |\long| macro to allow
% |\par| commands in its argument.
% \begin{macrocode}
\long\def\IndexPrologue#1{\@bsphack\def\index@prologue{#1}\@esphack}
% \end{macrocode}
% Now we test whether the default is already defined by another
% package file. If not we define it.
% \changes{v2.0j}{2000/05/22}{Less obscure wording? (CAR pr/3202)}
% \begin{macrocode}
\@ifundefined{index@prologue}
{\def\index@prologue{\section*{Index}%
\markboth{Index}{Index}%
Numbers written in italic refer to the page
where the corresponding entry is described;
numbers underlined refer to the
\ifcodeline@index
code line of the
\fi
definition; numbers in roman refer to the
\ifcodeline@index
code lines
\else
pages
\fi
where the entry is used.
}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \begin{macro}{\IndexParms}
% These are some last-minute assignments for formatting the index
% entries. They are defined in a separate macro so that a user can
% substitute different definitions. We start by defining the
% various parameters controlling leading and the separation between
% the two columns. The entire index is set in |\small| size.
% \begin{macrocode}
\@ifundefined{IndexParms}
{\def\IndexParms{%
\parindent \z@
\columnsep 15pt
\parskip 0pt plus 1pt
\rightskip 15pt
\mathsurround \z@
\parfillskip=-15pt
\small
% \end{macrocode}
% \begin{macro}{\@idxitem}
% \begin{macro}{\subitem}
% \begin{macro}{\subsubitem}
% Index items are formatted with hanging indentation for any items
% which may require more than one line.
% \begin{macrocode}
\def\@idxitem{\par\hangindent 30pt}%
% \end{macrocode}
% Any sub-item in the index is formatted with a 15pt indentation
% under its main heading.
% \begin{macrocode}
\def\subitem{\@idxitem\hspace*{15pt}}%
% \end{macrocode}
% Whilst sub-sub-items go in a further 10pt.
% \begin{macrocode}
\def\subsubitem{\@idxitem\hspace*{25pt}}%
% \end{macrocode}
% \begin{macro}{\indexspace}
% The \textsf{makeindex} program generates an |\indexspace|
% before each new alphabetic section commences. After this final
% definition we end the |\@ifundefined| and the definition of
% |\IndexParms|.
% \begin{macrocode}
\def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}%
}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\efill}
% This definition of |\efill| is intended to be used after index
% items which have no following text (for example, ``\textit{
% see\/}'' entries). It just ensures that the current line is
% filled, preventing ``|Underfull \hbox|'' messages.
% \begin{macrocode}
\def\efill{\hfill\nopagebreak}%
%</package>
%<+gind|gglo>item_x1 "\\efill \n \\subitem "
%<+gglo>item_x2 "\\ "
%<+gind>item_x2 "\\efill \n \\subsubitem "
%<*package>
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\pfill}
% \begin{macro}{\dotfil}
% \begin{macro}{\dotfill}
% The following definitions provide the |\pfill| command; if
% this is specified in the index style file to \textsf{makeindex} as
% the delimiter to appear after index items, then the intervening
% space before the referenced page numbers will be filled with
% dots, with a little white space interpolated at each end of the
% dots. If the line is broken the dots will show up on both lines.
% \begin{macrocode}
\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus 1fill}%
\def\dotfil{\leaders\hbox to.6em{\hss .\hss}\hfil}%
\def\pfill{\unskip~\dotfill\penalty500\strut\nobreak
\dotfil~\ignorespaces}%
%</package>
%<+gind|gglo>delim_0 "\\pfill "
%<+gind|gglo>delim_1 "\\pfill "
%<+gind|gglo>delim_2 "\\pfill "
%<*package>
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \begin{macro}{\*}
% Here is the definition for the |\*| macro. It isn't used in
% this set of macros.
% \begin{macrocode}
\def\*{\leavevmode\lower.8ex\hbox{$\,\widetilde{\ }\,$}}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\main}
% The \textit{defining\/} entry for a macro name is flagged with
% the string \texttt{\encapchar main}\footnote{With the current
% definition of \texttt{\bslash encapchar} substituted for
% \texttt{\encapchar}} in the |\index| command; \textsf{makeindex}
% processes this so that the |\main| macro will be invoked to
% underline the page number(s) on which the {\em definition\/} of
% the macro will be found.
% \begin{macrocode}
\@ifundefined{main}{\def\main#1{\underline{#1}}}{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\usage}
% The |\usage| macro is used to indicate entries describing
% the usage of a macro. The corresponding page number(s) will be
% set in \textit{italics}.
% \begin{macrocode}
\@ifundefined{usage}{\def\usage#1{\textit{#1}}}{}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\PrintIndex}
% \changes{v1.5k}{1989/09/04}{\cs{printindex} changed to
% \cs{PrintIndex}}
% \changes{v1.7a}{1992/02/26}{Documentation moved to interface section.}
% \changes{v1.9h}{1994/02/10}{Use \cs{@input@} instead of \cs{@input}.}
% \changes{v1.9w}{1995/12/29}{Turn the cmd into a noop after use.}
% This is the same as "\printindex" in the \textsf{makeidx} package.
% \begin{macrocode}
\def\PrintIndex{\@input@{\jobname.ind}%
\global\let\PrintIndex\@empty}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\printindex}
% Since the above macro was called |\printindex| in older versions
% of \texttt{doc.sty} the following definition was provided up to
% version 1.9y.
% \changes{v1.9z}{1996/04/17}{Commented out}
% \begin{macrocode}
%\def\printindex{\typeout{\string\printindex\space is obsolete!}%
% \typeout{Please use \string\PrintIndex\space
% if you are a macro implementor^^J
% or get a newer version of the documented
% software if you are a user}%
% \PrintIndex}
% \end{macrocode}
% \end{macro}
%
% We want headings in the index (and changes list) according to the
% initial character of the next block of entries and have to instruct
% \textsf{makeindex} appropriately. Unfortunately the specification
% for this changed sometime between versions 2.4 and 2.11 of
% \textsf{makeindex}. We provide both ways of doing it but
% unfortunately this will always produce a warning message from
% \textsf{makeindex}. This is for older versions:
% \changes{v1.7h}{1992/07/01}{Turn off headings in gls file}
% \begin{macrocode}
%</package>
%<+gind,gglo>% The next lines will produce some warnings when
%<+gind,gglo>% running Makeindex as they try to cover two different
%<+gind,gglo>% versions of the program:
%<+gind,gglo>lethead_prefix "{\\bfseries\\hfil "
%<+gind,gglo>lethead_suffix "\\hfil}\\nopagebreak\n"
%<+gind>lethead_flag 1
%<+gglo>lethead_flag 0
% \end{macrocode}
% This works for newer ones:
% \begin{macrocode}
%<+gind,gglo>heading_prefix "{\\bfseries\\hfil "
%<+gind,gglo>heading_suffix "\\hfil}\\nopagebreak\n"
%<+gind>headings_flag 1
%<+gglo>headings_flag 0
%<*package>
% \end{macrocode}
%
%
%
% \subsection[Dealing with the change history]
% {Dealing with the change history\footnotemark}
% \footnotetext{The whole section was proposed by Brian \textsc{Hamilton
% Kelly}. He also documented and debugged the macros as
% well as many other parts of this package.}
%
% To provide a change history log, the |\changes| command has
% been introduced. This takes three arguments, respectively, the
% version number of the file, the date of the change, and some detail
% regarding what change has been made. The first of these arguments
% is otherwise ignored, but the others are written out and may be used
% to generate a history of changes, to be printed at the end of the
% document. However, note that older versions of Chen's standard
% \textsf{makeindex}
% program limit any textual field to just 64 characters; therefore,
% is important that the number of characters in the second and third
% parameters should not exceed 61 altogether (to allow for the
% parentheses placed around the date).
%
% \begin{macro}{\changes}
% \changes{BHK}{1989/04/26}{Documented \texttt{\protect\bslash changes}
% command.}
% \changes{BHK}{1989/04/26}{Changed definition of
% \texttt{\protect\bslash protect}.} The output of the |\changes|
% command goes into the \meta{Glossary\_File} and therefore uses
% the normal |\glossaryentry| commands.\footnote{Note that a recent
% change in \LaTeX{} 2.09 changed the command name in the
% \texttt{.glo} file from \texttt{\bslash indexentry} to
% \texttt{\bslash glossaryentry}. It is therefore necessary to
% have a special \textsf{makeindex} style file called
% \texttt{gglo.ist} to process this file correctly.} Thus
% \textsf{makeindex} or a similar program can be used to process
% the output into a sorted ``glossary''. The |\changes| command
% commences by taking the usual measures to hide its spacing, and
% then redefines |\protect| for use within the argument of the
% generated |\indexentry| command.
%
% We re-code nearly all chars found in |\sanitize| to letter
% since the use of special package which make some characters
% active might upset the |\changes| command when writing its
% entries to the file. However we have to leave |%| as comment
% and \verb*+ + as \meta{space} otherwise chaos will happen.
% And, of course the |\| should be available as escape
% character.
% \changes{v1.5v}{1990/01/28}{`Re-code a lot of chars.}
% \changes{v1.5m}{1989/09/20}{\cs{actualchar} in second level removed.}
% \changes{v1.5o}{1989/09/24}{New sorting.}
% \changes{v1.6c}{1990/06/29}{Again new sorting.}
% \changes{v1.9u}{1995/08/06}{Use \cs{protected@edef}}
% \begin{macrocode}
\def\changes{\@bsphack\begingroup\@sanitize
\catcode`\\\z@ \catcode`\ 10 \MakePercentIgnore
\changes@}
\def\changes@#1#2#3{%
\protected@edef\@tempa{\noexpand\glossary{#1\levelchar
% \end{macrocode}
% \changes{v1.9u}{1995/08/06}{Use value of \cs{saved@macroname} to
% find out about change entries at outer level}
% If the macro "\saved@macroname" doesn't contain any macro name
% (ie is empty) the current changes entry was done at top-level.
% In this case we preceed it by "\generalname".
% \begin{macrocode}
\ifx\saved@macroname\@empty
\space
\actualchar
\generalname
\else
\expandafter\@gobble
\saved@macroname
\actualchar
\string\verb\quotechar*%
\verbatimchar\saved@macroname
\verbatimchar
\fi
:\levelchar #3}}%
\@tempa\endgroup\@esphack}
% \end{macrocode}
%
% \begin{macro}{\saved@macroname}
% \changes{BHK}{1989/04/26}{Provided for sorting outside \textsf{macro}
% environment} The entries are sorted for convenience by the name
% of the most recently introduced macroname (i.e., that in the most
% recent |\begin{macro}| command). We therefore provide
% |\saved@macroname| to record that argument, and provide a default
% definition in case |\changes| is used outside a \textsf{macro}
% environment. (This is a {\em wicked\/} hack to get such entries
% at the beginning of the sorted list! It works providing no macro
% names start with "!" or |"|.) \changes{v1.7a}{1992/03/02}{Changed
% string used for better sorting.}
% \changes{v1.9u}{1995/08/06}{Now empty by default}
% \begin{macrocode}
\def\saved@macroname{}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\generalname}
% \changes{v1.9u}{1995/08/06}{Macro added}
% This macro holds the string placed before changes entries on
% top-level.
% \begin{macrocode}
\def\generalname{General}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\RecordChanges}
% \changes{BHK}{1989/04/26}{Renames former \texttt{\protect\bslash
% PrintChanges} command.}
% To cause the changes to be written (to a \texttt{.glo}) file, we
% define |\RecordChanges| to invoke \LaTeX's usual
% |\makeglossary| command.
% \begin{macrocode}
\let\RecordChanges\makeglossary
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\GlossaryMin}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% \begin{macro}{\c@GlossaryColumns}
% \changes{BHK}{1989/04/26}{Added to support \texttt{\protect\bslash
% changes}.} The remaining macros are all analogues of those used
% for the \textsf{theindex} environment. When the glossary is
% started we compute the space which remains at the bottom of the
% current page; if this is greater than |\GlossaryMin| then the
% first part of the glossary will be placed in the available space.
% The number of columns set are controlled by the counter
% |\c@GlossaryColumns| which can be changed with a |\setcounter|
% declaration.
% \begin{macrocode}
\newdimen\GlossaryMin \GlossaryMin = 80pt
\newcount\c@GlossaryColumns \c@GlossaryColumns = 2
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\theglossary}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% \changes{v1.5p}{1989/09/28}{Now call \cs{multicols} first.}
% \changes{v1.6e}{1991/04/03}{Turned into env definition.}
% \changes{v1.7a}{1992/03/10}{Changed to work without multicols if
% necessary.}
% \begin{macro}{\endglossary}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% The environment \textsf{theglossary} is defined in the same manner
% as the \textsf{theindex} environment.
% \begin{macrocode}
\ifhave@multicol
\newenvironment{theglossary}{%
\begin{multicols}\c@GlossaryColumns
[\glossary@prologue][\GlossaryMin]%
\GlossaryParms \let\item\@idxitem \ignorespaces}%
{\end{multicols}}
\else
\newenvironment{theglossary}{%
\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
\columnseprule \z@ \columnsep 35\p@
\twocolumn[\glossary@prologue]%
\GlossaryParms \let\item\@idxitem \ignorespaces}
{\if@restonecol\onecolumn\else\clearpage\fi}
\fi
% \end{macrocode}
% \end{macro}
% \end{macro}
% Here are the necessary \textsf{makeindex} declarations with scanning
% disabled as for the index.
% \begin{macrocode}
%</package>
%<+gglo>preamble
%<+gglo>"\n \\begin{theglossary} \n
%<+gglo> \\makeatletter\\scan@allowedfalse\n"
%<+gglo>postamble
%<+gglo>"\n\n \\end{theglossary}\n"
% \end{macrocode}
% This difference from \texttt{gind.ist} is necessary if you have an
% up-to-date \LaTeX.
% \begin{macrocode}
%<+gglo>keyword "\\glossaryentry"
%<*package>
% \end{macrocode}
%
%
% \begin{macro}{\GlossaryPrologue}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% \begin{macro}{\glossary@prologue}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% The |\GlossaryPrologue| macro is used to place a short
% message above the glossary into the document. It is implemented
% by redefining |\glossary@prologue|, a macro which holds the
% default text. We better make it a long macro to allow
% |\par| commands in its argument.
% \begin{macrocode}
\long\def\GlossaryPrologue#1{\@bsphack
\def\glossary@prologue{#1}%
\@esphack}
% \end{macrocode}
% Now we test whether the default is already defined by another
% package file. If not we define it.
% \begin{macrocode}
\@ifundefined{glossary@prologue}
{\def\glossary@prologue{\section*{{Change History}}%
\markboth{{Change History}}{{Change History}}%
}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\GlossaryParms}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% Unless the user specifies otherwise, we set the change history
% using the same parameters as for the index.
% \begin{macrocode}
\@ifundefined{GlossaryParms}{\let\GlossaryParms\IndexParms}{}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\PrintChanges}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% To read in and print the sorted change history, just put the
% |\PrintChanges| command as the last (commented-out, and thus
% executed during the documentation pass through the file) command
% in your package file. Alternatively, this command may form one of
% the arguments of the |\StopEventually| command, although a
% change history is probably {\em not\/} required if only the
% description is being printed.
%
% The command assumes that \textsf{makeindex} or some other program
% has processed the \texttt{.glo} file to generate a sorted
% \texttt{.gls} file.
% \changes{v1.9h}{1994/02/10}{Use \cs{@input@} instead of \cs{@input}.}
% \changes{v1.9w}{1995/12/29}{Turn the cmd into a noop after use.}
% \begin{macrocode}
\def\PrintChanges{\@input@{\jobname.gls}%
\global\let\PrintChanges\@empty}
% \end{macrocode}
% \end{macro}
%
%
%
%
%
% \subsection{Bells and whistles}
%
% \begin{macro}{\StopEventually}
% \changes{v1.5k}{1989/09/04}{Support for checksum.}
% \begin{macro}{\Finale}
% \changes{v1.5k}{1989/09/04}{Support for checksum.}
% \changes{v1.5z}{1990/04/22}{Define \cs{Finale} globally.}
% \begin{macro}{\AlsoImplementation}
% \changes{v1.9w}{1995/12/27}{Macro added}
% \begin{macro}{\OnlyDescription}
% If |\AlsoImplementation| is in force the whole documentation
% including the code part will be typeset. This is the default.
% \begin{macrocode}
\newcommand\AlsoImplementation{%
% \end{macrocode}
% To make this happen we have to define
% |\StopEventually| in a way that its argument is typeset at the
% very end or more exactly at |\Finale|. For this we
% save its argument in the macro |\Finale|.
% \begin{macrocode}
\long\def\StopEventually##1{\@bsphack\gdef\Finale{##1%
% \end{macrocode}
% But |\Finale| will be called at the very end of a file. This
% is exactly the point were we want to know if the file is
% uncorrupted. Therefore we also call |\check@checksum| at this
% point.
% \begin{macrocode}
\check@checksum}%
% \end{macrocode}
% On the other hand: |\StopEventually| is more or less a
% dividing point between description and code. So we start to look
% for the check-sum of the documented file by calling
% |\init@checksum|.
% \begin{macrocode}
\init@checksum
\@esphack}%
}
% \end{macrocode}
%
% Since |\AlsoImplementation| should be the default we execute it
% and thus |\StopEventually| gets the desired meaning.
% \begin{macrocode}
\AlsoImplementation
% \end{macrocode}
% When the user places an |\OnlyDescription| declaration in
% the driver file the document should only be typeset up to
% |\StopEventually|. We therefore have to redefine this macro.
% \begin{macrocode}
\def\OnlyDescription{\@bsphack\long\def\StopEventually##1{%
% \end{macrocode}
% In this case the argument of |\StopEventually| should be set
% and afterwards \TeX{} should stop reading from this file.
% Therefore we finish this macro with
% \begin{macrocode}
##1\endinput}\@esphack}
% \end{macrocode}
% If no |\StopEventually| command is given we silently ignore a
% |\Finale| issued.
% \changes{v1.9n}{1994/04/28}{Ignore \cs{Finale} if no
% \cs{StopEventually} is given}
% \begin{macrocode}
\let\Finale\relax
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\meta}
% \changes{v1.4t}{1989/04/24}{Macro added.}
% \changes{v1.5w}{1990/02/03}{Breaks at space allowed.}
% \changes{v1.6a}{1990/05/24}{Extra space bug corrected.}
% The |\meta| macro is a bit tricky. We want to allow line
% breaks at blanks in the argument but we don't want a break
% in between. In the past this was done by defining |\meta| in a way that a
% \verb*+ + is active when the argument is scanned. Words are then
% scanned into |\hbox|es. The active \verb*+ + will end the
% preceding |\hbox| add an ordinary space and open a new
% |\hbox|. In this way breaks are only possible at spaces. The
% disadvantage of this method was that |\meta| was neither robust
% nor could it be |\protect|ed. The new implementation fixes this
% problem by defining |\meta| in a radically different way: we
% prevent hypenation by defining a |\language| which has no
% patterns associated with it and use this to typeset the words
% within the angle brackets.
% \changes{v2.0i}{2000/05/21}{New implementation (pr/3170)}
% \begin{macrocode}
\ifx\l@nohyphenation\undefined
\newlanguage\l@nohyphenation
\fi
% \end{macrocode}
%
% \begin{macrocode}
\DeclareRobustCommand\meta[1]{%
% \end{macrocode}
% Since the old implementation of |\meta| could be used in math we
% better ensure that this is possible with the new one as
% well. So we use |\ensuremath| around |\langle| and
% |\rangle|. However this is not enough: if |\meta@font@select|
% below expands to |\itshape| it will fail if used in math
% mode. For this reason we hide the whole thing inside an
% |\nfss@text| box in that case.
% \changes{v2.0l}{2000/06/10}{Fixing changes for (pr/3170)}
% \begin{macrocode}
\ensuremath\langle
\ifmmode \expandafter \nfss@text \fi
{%
\meta@font@select
% \end{macrocode}
% Need to keep track of what we changed just in case the user
% changes font inside the argument so we store the font explicitly.
% \changes{v2.0m}{2000/07/04}{More fixing changes for (pr/3170)}
% \begin{macrocode}
\edef\meta@hyphen@restore
{\hyphenchar\the\font\the\hyphenchar\font}%
\hyphenchar\font\m@ne
\language\l@nohyphenation
#1\/%
\meta@hyphen@restore
}\ensuremath\rangle
}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\meta@font@select}
% \changes{v2.0k}{2000/05/26}{Macro added (pr/3170)}
% Maske font used inside |\meta| customizable.
% \begin{macrocode}
\def\meta@font@select{\itshape}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IndexInput}
% This next macro may be used to read in a separate file (possibly
% a package file that is {\em not\/} documented by this means) and
% set it verbatim, whilst scanning for macro names and indexing the
% latter. This could be a useful first pass in preparing to
% generate documentation for the file read.
% \begin{macrocode}
\def\IndexInput#1{%
% \end{macrocode}
% We commence by setting up a group, and initializing a
% |\trivlist| as is normally done by a
% |\begin{macrocode}| command.
% \begin{macrocode}
\begingroup \macro@code
% \end{macrocode}
% We also make spacing behave as in the \textsf{macrocode}
% environment, because otherwise all the spaces will be shown
% explicitly.
% \begin{macrocode}
\frenchspacing \@vobeyspaces
% \end{macrocode}
% Then it only remains to read in the specified file, and finish
% off the |\trivlist|.
% \changes{v1.5t}{1989/11/07}{Call \cs{endmacrocode} instead
% of \cs{endtrivlist}.}
% \begin{macrocode}
\input{#1}\endmacrocode
% \end{macrocode}
% Of course, we need to finish off the group as well.
% \begin{macrocode}
\endgroup}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\maketitle}
% The macro to generate titles is easily altered in order that it
% can be used more than once (an article with many titles). In the
% original, diverse macros were concealed after use with
% |\relax|. We must cancel anything that may have been put
% into |\@thanks|, etc., otherwise {\em all\/} titles will
% carry forward any earlier such setting!
% \changes{v1.5j}{1989/06/09}{thispagestyle plain removed}
% \changes{v1.9r}{1994/06/09}{Added new definitions of
% \cs{@makefnmark} and \cs{@makefntext}}
% \begin{macrocode}
\def\maketitle{\par
\begingroup \def \thefootnote {\fnsymbol {footnote}}%
\setcounter {footnote}\z@
\def\@makefnmark{\hbox to\z@{$\m@th^{\@thefnmark}$\hss}}%
\long\def\@makefntext##1{\parindent 1em\noindent
\hbox to1.8em{\hss$\m@th^{\@thefnmark}$}##1}%
\if@twocolumn \twocolumn [\@maketitle ]%
\else \newpage \global \@topnum \z@ \@maketitle \fi
% \end{macrocode}
% \changes{v1.5k}{1989/09/04}{Added \cs{ps@titlepage}}
% For special formatting requirements (such as in TUGboat), we use
% pagestyle |titlepage| for this; this is later defined to be
% |plain|, unless already defined, as, for example, by
% |ltugboat.sty|.
% \begin{macrocode}
\thispagestyle{titlepage}\@thanks \endgroup
% \end{macrocode}
% If the driver file documents many files, we don't want parts of a
% title of one to propagate to the next, so we have to cancel
% these:
% \begin{macrocode}
\setcounter {footnote}\z@
\gdef\@date{\today}\gdef\@thanks{}%
\gdef\@author{}\gdef\@title{}}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ps@titlepage}
% \changes{v1.5k}{1989/09/04}{Added \texttt{\protect\bslash
% ps@titlepage}} When a number of articles are concatenated into a
% journal, for example, it is not usual for the title pages of such
% documents to be formatted differently. Therefore, a class
% such as \textsf{ltugboat} can define this macro in advance.
% However, if no such definition exists, we use pagestyle
% \texttt{plain} for title pages.
% \begin{macrocode}
\@ifundefined{ps@titlepage}
{\let\ps@titlepage=\ps@plain}{}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\MakeShortVerb}
% \changes{v1.7a}{1992/02/27}{Added (from newdoc but now alters
% \cs{dospecials}, \cs{@sanitize}).}
% This arranges an abbreviation for "\verb" such that if you say
% "\MakeShortVerb{\"\meta{c}"}" subsequently using
% \meta{c}\meta{text}\meta{c} is equivalent to
% "\verb"\meta{c}\meta{text}\meta{c}.\footnote{Warning:
% the commentary in the rest of this section was written by Dave
% Love.} In addition, the fact
% that \meta{c} is made active is recorded for the benefit of the
% \textsf{verbatim} and \textsf{macrocode} environments.
% Note particularly that the definitions below are global.
% The first thing we do (it needn't be first) is to record
% the---presumably new---special character in "\dospecials" and
% "\@sanitize" using "\add@special".
%
% \changes{v1.9e.2}{1994/02/07}{-js: Check if \protect\meta{c} is
% already an
% abbreviation for \cs{verb}.}
% Some unwary user might issue "\MakeShortVerb" for a second time, we
% better protect against this. We assume that this happened if a
% control sequence "\cc\"\meta{c} is bound, the probability that this
% name is used by another module is low. We will output a warning
% below, so that a possible error might be noticed by the programmer
% if he reads the "LOG" file. (Should have used module internal names,
% 'though.)
%
% \begin{macro}{\MakeShortVerb*}
% \changes{v2.1a}{2003/12/09}{(HjG) Added \texttt{*} form}
% This arranges an abbreviation for "\verb*" such that if you say
% "\MakeShortVerb*{\"\meta{c}"}" subsequently using
% \meta{c}\meta{text}\meta{c} is equivalent to
% "\verb*"\meta{c}\meta{text}\meta{c}.
% \begin{macrocode}
%</package>
%<*package|shortvrb>
\def\MakeShortVerb{%
\@ifstar
{\def\@shortvrbdef{\verb*}\@MakeShortVerb}%
{\def\@shortvrbdef{\verb}\@MakeShortVerb}}
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
\def\@MakeShortVerb#1{%
\expandafter\ifx\csname cc\string#1\endcsname\relax
% \end{macrocode}
% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}}
% \begin{macrocode}
\@shortvrbinfo{Made }{#1}\@shortvrbdef
\add@special{#1}%
% \end{macrocode}
% Then the character's current catcode is stored in "\cc\"\meta{c}.
% \begin{macrocode}
\expandafter
\xdef\csname cc\string#1\endcsname{\the\catcode`#1}%
% \end{macrocode}
% The character is spliced into the definition using the same trick as
% used in "\verb" (for instance), having activated "~" in a group.
% \begin{macrocode}
\begingroup
\catcode`\~\active \lccode`\~`#1%
\lowercase{%
% \end{macrocode}
% The character's old meaning is recorded in "\ac\"\meta{c} prior to
% assigning it a new one.
% \begin{macrocode}
\global\expandafter\let
\csname ac\string#1\endcsname~%
\expandafter\gdef\expandafter~\expandafter{\@shortvrbdef~}}%
\endgroup
% \end{macrocode}
% Finally the character is made active.
% \begin{macrocode}
\global\catcode`#1\active
% \end{macrocode}
% If we suspect that \meta{c} is already a short reference, we tell
% the user. Now he or she is responsible if anything goes wrong\,\dots
% \begin{macrocode}
\else
% \end{macrocode}
% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}}
% \begin{macrocode}
\@shortvrbinfo\@empty{#1 already}{\@empty\verb(*)}%
\fi}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\DeleteShortVerb}
% \changes{v1.7a}{1992/02/27}{Added (from newdoc but now alters
% \cs{dospecials}, \cs{@sanitize}).}
% Here's the means of undoing a "\MakeShortVerb", for instance in a
% region where you need to use the character outside a verbatim
% environment. It arranges for "\dospecials" and "\@sanitize" to be
% altered appropriately, restores the saved catcode and, if necessary,
% the character's meaning (as stored by
% "\MakeShortVerb"). If the catcode wasn't stored in
% "\cc\"\meta{c} (by "\MakeShortVerb") the command is silently
% ignored.
% \changes{v1.7a}{1992/02/28}{Check for previous matched
% \cs{MakeShortVerb}
% to avoid error.}
% \begin{macrocode}
\def\DeleteShortVerb#1{%
\expandafter\ifx\csname cc\string#1\endcsname\relax
% \end{macrocode}
% \changes{v2.1a}{2003/12/10}{(HjG) Notify user
% if it's not a short verb character}
% \begin{macrocode}
\@shortvrbinfo\@empty{#1 not}{\@empty\verb(*)}%
\else
% \end{macrocode}
% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}}
% \begin{macrocode}
\@shortvrbinfo{Deleted }{#1 as}{\@empty\verb(*)}%
\rem@special{#1}%
\global\catcode`#1\csname cc\string#1\endcsname
% \end{macrocode}
% \changes{v1.9e.2}{1994/02/07}{-js: Reset `cc`\protect\meta{c} in
% in \cs{DeleteShortVerb}}
% We must not forget to reset "\cc\"\meta{c}, otherwise the check in
% "\MakeShortVerb" for a repeated definition will not work.
% \begin{macrocode}
\global \expandafter\let \csname cc\string#1\endcsname \relax
\ifnum\catcode`#1=\active
\begingroup
\catcode`\~\active \lccode`\~`#1%
\lowercase{%
\global\expandafter\let\expandafter~%
\csname ac\string#1\endcsname}%
\endgroup \fi \fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@shortvrbinfo}
% \changes{v1.9v}{1995/11/03}{(DPC) Macro added}
% \changes{v2.1a}{2003/12/10}{(HjG) Third argument added
% on behalf of \cmd{\MakeShortVerb*}}
% Helper function for info messages.
% \begin{macrocode}
\def\@shortvrbinfo#1#2#3{%
%<shortvrb> \PackageInfo{shortvrb}{%
%<!shortvrb> \PackageInfo{doc}{%
#1\expandafter\@gobble\string#2 a short reference
for \expandafter\string#3}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\add@special}
% \changes{v1.7a}{1992/02/27}{Added for short verb facility.}
% This helper macro adds its argument to the
% "\dospecials" macro which is conventionally used by verbatim macros
% to alter the catcodes of the currently active characters. We need
% to add "\do\"\meta{c} to the expansion of "\dospecials" after
% removing the character if it was already there to avoid multiple
% copies building up should "\MakeShortVerb" not be balanced by
% "\DeleteShortVerb" (in case anything that uses "\dospecials" cares
% about repetitions).
% \begin{macrocode}
\def\add@special#1{%
\rem@special{#1}%
\expandafter\gdef\expandafter\dospecials\expandafter
{\dospecials \do #1}%
% \end{macrocode}
% Similarly we have to add "\@makeother\"\meta{c} to "\@sanitize"
% (which is used in things like "\index" to re-catcode all special
% characters except braces).
% \begin{macrocode}
\expandafter\gdef\expandafter\@sanitize\expandafter
{\@sanitize \@makeother #1}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\rem@special}
% \changes{v1.7a}{1992/02/27}{Added for short verb facility.}
% The inverse of "\add@special" is slightly trickier. "\do" is
% re-defined to expand to nothing if its argument is the character of
% interest, otherwise to expand simply to the argument. We can then
% re-define "\dospecials" to be the expansion of itself. The space
% after "=`##1" prevents an expansion to "\relax"!
% \begin{macrocode}
\def\rem@special#1{%
\def\do##1{%
\ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
\xdef\dospecials{\dospecials}%
% \end{macrocode}
% Fixing "\@sanitize" is the same except that we need to re-define
% "\@makeother" which obviously needs to be done in a group.
% \begin{macrocode}
\begingroup
\def\@makeother##1{%
\ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
\xdef\@sanitize{\@sanitize}%
\endgroup}
%</package|shortvrb>
%<*package>
% \end{macrocode}
% \end{macro}
% \begin{macro}{\MakeShortverb}
% \begin{macro}{\DeleteShortverb}
% \changes{v1.7a}{1992/02/27}{Added (from newdoc).}
% These commands from \textsf{newdoc} are now obsolete.
% \begin{macrocode}
\def\MakeShortverb{\typeout{*** Switch to \noexpand\MakeShortVerb
syntax, this is obsolete ***}\MakeShortVerb}
\def\DeleteShortverb{\typeout{*** Switch to \noexpand\DeleteShortVerb
syntax, this is obsolete ***}\DeleteShortVerb}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \subsection[Providing a checksum and character table]
% {Providing a checksum and character table\footnotemark}
% \footnotetext{Warning: the commentary in this section was
% written by Dave Love. }
%
%
% \begin{macro}{\init@checksum}
% The checksum mechanism works by counting backslashes in the
% macrocode. This initialises the count (when called from
% "\StopEventually").
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% \begin{macrocode}
\def\init@checksum{\relax
\global\bslash@cnt\z@}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\check@checksum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% This reports the sum compared with the value ("\bslash@cnt") the
% file advertises. It's called from "\Finale" (if that hasn't been
% re-defined).
% \begin{macrocode}
\def\check@checksum{\relax
\ifnum\check@sum=\z@
\typeout{**********************************}%
\typeout{* This macro file has no checksum!}%
\typeout{* The checksum should be \the\bslash@cnt!}%
\typeout{**********************************}%
\else
\ifnum\check@sum=\bslash@cnt
\typeout{*******************}%
\typeout{* Checksum passed *}%
\typeout{*******************}%
\else
\PackageError{doc}{Checksum not passed
(\the\check@sum<>\the\bslash@cnt)}%
{The file currently documented seems to be wrong.^^J%
Try to get a correct version.}%
\fi
\fi
\global\check@sum\z@}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\check@sum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% \begin{macro}{\bslash@cnt}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% We need to define counters, "\bslash@cnt" for the number of
% backslashes counted and "\check@sum" for the value advertised by the
% file.
% \begin{macrocode}
\newcount\check@sum \check@sum = \z@
\newcount\bslash@cnt \bslash@cnt = \z@
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\CheckSum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% This is the interface to setting "\check@sum".
% \begin{macrocode}
\def\CheckSum#1{\@bsphack\global\check@sum#1\relax\@esphack}
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\step@checksum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% This advances the count when a backslash is encountered in the
% macrocode.
% \begin{macrocode}
\def\step@checksum{\global\advance\bslash@cnt\@ne}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CharacterTable}
% The user interface to the character table-checking does some
% "\catcode"ing and then compares the following table with the
% stored version. We need to have "@" of type ``other'' within the
% table since this is the way it is usually returned when reading
% in a normal document. To nevertheless have a private letter we
% use "~" for this purpose. "~" does no harm as a ``letter'' as it
% comes last in the table and therefore will not gobble following
% space.
% \changes{v1.5m}{1989/09/20}{Macro added to check character translation
% problems.}
% \changes{v1.5q}{1989/11/01}{Made character table more readable.}
% \changes{v1.5t}{1989/11/07}{Make \string\~{} letter in chartable
% macros.}
% \changes{v1.5u}{1989/11/14}{Made @ other in default table.}
% \begin{macrocode}
\def\CharacterTable{\begingroup \CharTableChanges \character@table}
% \end{macrocode}
% \end{macro}
% \def\MakePrivateLetters{\catcode`\~=11\makeatletter}
% \begin{macro}{\character@table}
% This does the work of comparing the tables and reporting the result.
% Note that the following code is enclosed in a group
% with "~" catcoded to letter.
% \begin{macrocode}
\begingroup
\catcode`\~=11
\gdef\character@table#1{\def\used~table{#1}%
\ifx\used~table\default~table
\typeout{***************************}%
\typeout{* Character table correct *}%
\typeout{***************************}%
\else
\PackageError{doc}{Character table corrupted}
{\the\wrong@table}
\show\default~table
\show\used~table
\fi
\endgroup}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\CharTableChanges}
% When the character table is read in we need to scan it with a
% fixed set of "\catcode"s. The reference table below was defined by
% assuming the normal "\catcode"s of \TeX{}, i.e.\ "@" is of type
% other and the only token of type ``letter'' are the usual letters
% of the alphabet. If, for some reason, other characters are made
% ``letters'' then their "\catcode"s need to be restored before
% checking the table. Otherwise spaces in the table are gobbled and
% we get the information that the tables are different, even if
% they are actually equal. For this reason "\CharTableChanges" can
% be set up to locally restore the "\catcode"s of such ``letters''
% to ``other''.
% \begin{macrocode}
\global\let\CharTableChanges\@empty
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\default~table}
% Here's what the table {\em should\/} look like (modulo spaces).
% \begin{macrocode}
\makeatother
\gdef\default~table
{Upper-case \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
Lower-case \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
Digits \0\1\2\3\4\5\6\7\8\9
Exclamation \! Double quote \" Hash (number) \#
Dollar \$ Percent \% Ampersand \&
Acute accent \' Left paren \( Right paren \)
Asterisk \* Plus \+ Comma \,
Minus \- Point \. Solidus \/
Colon \: Semicolon \; Less than \<
Equals \= Greater than \> Question mark \?
Commercial at \@ Left bracket \[ Backslash \\
Right bracket \] Circumflex \^ Underscore \_
Grave accent \` Left brace \{ Vertical bar \|
Right brace \} Tilde \~}
\endgroup
% \end{macrocode}
% \end{macro}
% \let\MakePrivateLetters=\makeatletter
%
% \begin{macro}{\wrong@table}
% \changes{v1.7a}{1992/02/28}{Moved to where the catcodes are right
% so it works.}
% We need a help message in case of problems.
% \begin{macrocode}
\newhelp\wrong@table{Some of the ASCII characters are corrupted.^^J
I now \string\show\space you both tables for comparison.}
% \end{macrocode}
% \end{macro}
%
%
% \subsection[Attaching line numbers to code lines]
% {Attaching line numbers to code lines\footnotemark}
% \footnotetext{Warning: the commentary was written by Dave
% Love.}
%
%
% The code in this section allows index entries to refer to code line
% numbers---the number of the first line of macrocode in the
% \textsf{macro} environment.
%
%
% \begin{macro}{\codeline@index}
% Indexing by code line is controlled by the "codeline@index" switch.
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v1.7a}{1992/02/24}{Documented code line no. support.}
% \begin{macro}{\CodelineNumbered}
% \changes{v1.8a}{1993/05/19}{Macro added}
% \begin{macrocode}
\newif\ifcodeline@index \codeline@indexfalse
\let\CodelineNumbered\codeline@indextrue
% \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\codeline@wrindex}
% The code index entries are written out by "\special@index". If
% indexing is by code line this is "\let" to "\codeline@wrindex";
% if indexing is by page it is just "\index". However, if
% "\nofiles" is given, we omit writing such an index entry at all.
% \changes{v1.7j}{1992/08/14}{Added \cs{if@filesw}.}
% \begin{macrocode}
\def\codeline@wrindex#1{\if@filesw
\immediate\write\@indexfile
{\string\indexentry{#1}%
{\number\c@CodelineNo}}\fi}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\special@index}
% By default no index entries are written out.
% \begin{macrocode}
\let\special@index = \@gobble
% \end{macrocode}
% \end{macro}
% \begin{macro}{\CodelineIndex}
% \changes{v1.5u}{1989/11/14}{Added \cs{PageIndex} and
% \cs{CodelineIndex} (Undoc)}
% This switches on use of the index file with "\makeindex", sets the
% switch to indicate code line numbering and defines "\special@index"
% appropriately.
% \begin{macrocode}
\def\CodelineIndex{\makeindex
\codeline@indextrue
\let\special@index\codeline@wrindex}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\PageIndex}
% "\PageIndex" is similar.
% \begin{macrocode}
\def\PageIndex{\makeindex
\codeline@indexfalse
\let\special@index\index}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\c@CodelineNo}
% \changes{v1.5l}{1989/09/10}{Counter added to support code line
% numbers}
% \changes{v1.5y}{1990/02/24}{Default changed.}
% \changes{v1.6b}{1990/06/15}{\cs{rm} moved before \cs{scriptsize} to
% avoid unnecessary fontwarning.}
% We need a counter to keep track of the line number.
% \begin{macrocode}
\newcount\c@CodelineNo \c@CodelineNo\z@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\theCodelineNo}
% \changes{v1.7a}{1992/02/25}{Existing definition not overwritten.}
% \changes{v1.7a}{1992/03/12}{Use \cs{reset@font} for NFSS.}
% This provides a hook to control the format of line numbers which may
% be defined in a class file.
% \begin{macrocode}
\@ifundefined{theCodelineNo}
{\ifx\selectfont\undefined
\def\theCodelineNo{\rmfamily\scriptsize\arabic{CodelineNo}}%
\else
\def\theCodelineNo{\reset@font\scriptsize\arabic{CodelineNo}}%
\fi}
{}
% \end{macrocode}
% \end{macro}
%
%
%
%
% \subsection{Layout Parameters for documenting package files}
%
% \begin{macro}{\tolerance}
% People documenting package files would probably rather have things
% ``sticking out'' in overfull |\hbox|es and poorish spacing,
% because they probably don't want to spend a lot of time on making
% all the line breaks perfect!
% \begin{macrocode}
\tolerance=1000\relax
% \end{macrocode}
% \end{macro}
%
% \DeleteShortVerb{\"}
%
% The following |\mathcode| definitions allow the characters
% `|\|'
% and `\texttt{@}' to appear in |\ttfamily| font when invoked in math
% mode;\footnote{You may wonder why the definitions state that both
% characters belong to the {\em variable family\/}
% (i.e.\ the number 7 in front). The reason is this:
% Originally the \texttt{\bslash mathcode} of
% \texttt{\bslash} was defined to be \texttt{"075C},
% i.e.\ ordinary character number 92 (hex 5C) in
% math family number 7 which is the typewriter family in
% standard \LaTeX.
% But this file should not depend on this specific
% setting, so I changed these
% \texttt{\bslash mathcode}$\,$s
% to work with any family assignments. For an example
% see the article about the new font selection scheme.}
% particularly for something like $|\@abc|=1$.
%
% If an {\em old\/} version of the \textsf{german} package is in
% force, then the `|"|' character is active and would upset the
% definition of the \meta{16-bit number} quantities below, therefore
% we change the |\catcode| of |"| inside a group, and use
% |\global|.
% \begin{macrocode}
{ \catcode`\"=12
\global\mathcode`\\="705C \global\mathcode`\@="7040 }
% \end{macrocode}
% \MakeShortVerb{\"}
%
% \begin{macro}{\DocstyleParms}
% This macro can be used, for example, to assign new values to
% |\MacrocodeTopsep| and |\MacroIndent| and some other internal
% registers. If it is already defined, the default definition
% won't be carried out. Note that it is necessary to assign new
% values via this macro if it should be done in a class file (like
% \texttt{ltugboat.cls} for example) since the registers are
% undefined before \texttt{doc.sty} is read in. The default values
% for the internal registers are scattered over this file.
% \changes{v1.5u}{1989/11/14}{\cs{DocStyleParms} now empty}
% \begin{macrocode}
\@ifundefined{DocstyleParms}{}{}
% \end{macrocode}
% Now we allow overwriting the values by calling
% |\DocstyleParms|.
% \begin{macrocode}
\DocstyleParms \let\DocstyleParms\relax
% \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\AmSTeX}
% \changes{v1.5j}{1989/06/09}{Macro AmsTeX renamed to AmSTeX}
% \begin{macro}{\BibTeX}
% \begin{macro}{\SliTeX}
% Here are a few definitions which can usefully be employed when
% documenting package files: now we can readily refer to \AmSTeX,
% \BibTeX\ and \SliTeX, as well as the usual \TeX\ and \LaTeX.
% \begin{macrocode}
\@ifundefined{AmSTeX}
{\def\AmSTeX{\leavevmode\hbox{$\mathcal A\kern-.2em\lower.376ex%
\hbox{$\mathcal M$}\kern-.2em\mathcal S$-\TeX}}}{}
\@ifundefined{BibTeX}
{\def\BibTeX{{\rmfamily B\kern-.05em%
\textsc{i\kern-.025em b}\kern-.08em%
T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}}{}
\@ifundefined{SliTeX}
{\def\SliTeX{{\rmfamily S\kern-.06emL\kern-.18em\raise.32ex\hbox
{\scshape i}\kern -.03em\TeX}}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\PlainTeX}
% \changes{v1.5g}{1989/05/07}{space between plain and TeX changed.}
% \begin{macro}{\Web}
% There's even a \PlainTeX{} and a \Web.
% \begin{macrocode}
\@ifundefined{PlainTeX}{\def\PlainTeX{\textsc{Plain}\kern2pt\TeX}}{}
\@ifundefined{Web}{\def\Web{\textsc{Web}}}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \subsection{Changing the \texttt{\protect\bslash catcode} of \%}
%
% \begin{macro}{\MakePercentIgnore}
% \begin{macro}{\MakePercentComment}
% And finally the most important bit: we change the |\catcode|
% of `|%|' so that it is ignored (which is how we are able to
% produce this document!). We provide two commands to do the actual
% switching.
%^^A The |\MakePercentIgnore| is then called as the
%^^A last command in this file.
% \begin{macrocode}
\def\MakePercentIgnore{\catcode`\%9\relax}
\def\MakePercentComment{\catcode`\%14\relax}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\DocInput}
% The two macros above are now used to define the |\DocInput| macro
% which was introduced in version v1.5l (or so) of the \DOC{}
% package. In older versions |\MakePercentIgnore| was placed
% at the very end of \texttt{doc.sty}.
% \begin{macrocode}
\def\DocInput#1{\MakePercentIgnore\input{#1}\MakePercentComment}
% \end{macrocode}
% \end{macro}
%
% \subsection{GetFileInfo}
%
% \begin{macro}{\GetFileInfo}
% \changes{v1.9o}{1994/05/08}{Macro added}
% \changes{v1.9z}{1997/02/05}{Missing percent latex/2404}
% Define |\filedate| and friends from info in the
% |\ProvidesPackage| etc.\ commands.
% \begin{macrocode}
\def\GetFileInfo#1{%
\def\filename{#1}%
\def\@tempb##1 ##2 ##3\relax##4\relax{%
\def\filedate{##1}%
\def\fileversion{##2}%
\def\fileinfo{##3}}%
\edef\@tempa{\csname ver@#1\endcsname}%
\expandafter\@tempb\@tempa\relax? ? \relax\relax}
% \end{macrocode}
% \end{macro}
%
% We can now finish the \texttt{docstrip} main module.
% \begin{macrocode}
%</package>
% \end{macrocode}
%
%
% \Finale
% \PrintIndex \PrintChanges
\endinput
|