Home
The s¯ ngs package
Contents
1. Type Processed only if chorded the option is active lyric the option is not active slides the option is active partiallist the macro is being used to extract a partial list of songs songindexes the option is not active measures the option is not active pdfindex the option is not active rawtext the rawtext option is active transcapos the option is active nolyrics the macro is in effect vnumbered the current verse is numbered i e it was started with instead of Vosginversef Table 1 Conditional macros 11 4 Conditional Blocks Conditional macros allow certain material to be included in some books but not others For example a musician s chord book might include extra verses with alternate chordings A conditional block begins with a macro named if type where type is one of the types listed in the first column of Table 1 The conditional block concludes with the macro fi Between the if type and the fi may also appear an else For example in the construction ifchorded A else B fi material A is only included if the option is active and material B is only included if the option is not active 11 5 Page Layout The number of columns per page can be set with Nsongcolumns For example to create 3 columns per page write songcolumns 3 The number of columns should only be changed outside of environments
2. 2949 ifx SB out relax else 2950 protected write SB out protect SB iwrite 1 2 2951 fi 2952 SB iwrite The line contributed by SB cwrite to the sxc file is an SB iwrite macro that re outputs the data to an appropriate sxd file 2953 newcommand SB iwrite 2 2954 def SB tempii 1 2955 ifx SB temp SBOtempiiZ 2956 SB toks 2 2957 immediate write SB out the SBOtoks 2958 fi 2959 SB uncombine At the end of the document the sxc file can be processed multiple times to produce all the sxd files without resorting to multiple write registers Each pass activates the subset of the SB iwrite commands that apply to one index 2960 newcommand SB uncombine y 2961 ifx SB out relax else 2962 immediate closeout SB out 2963 ifsongindexes 2964 for SB temp SB allindexes do 7 2965 immediate openout SB out 2966 csname SB idxfilename SB temp endcsname sxd relaxi 2967 begingroup makeatletter catcode 12 relax 2968 input jobname sxc endgroup 2969 immediate closeout SB outy 2970 yh 2971 ML 2972 Ni 2973 2974 AtEndDocument SB uncombine 142 SB songwrites SB addtoindex SB addtoindexes SB addtotitles SB chkidxlst The following box register stores index data until it can be migrated to the top of the song box currently under construction 2975 newbox SB songwrites Queue data arg2 associated with the current song for eventual writing to
3. If text Y in index entry X Y has multiple items in a list those items should be separated by NN macros instead of by commas The NN macro will be assigned the definition of SB idxitemsep during index generation which produces the comma along with the complex spacing required if Y ends up being broken into multiple lines In particular it forces each wrapped line of Y to be right justified with left margin at least SB dimen 3145 NnewcommandNSBOidxitemsepi 3146 kern 2em penalty 8 hskip2 33em minus 11lem 3147 hskip SB dimen plus 1fi11 3148 vadjust nobreak 3149 hskip SB dimen plusifill relax 3150 The following set of macros and environments are intended for use in the Sbx files that are automatically generated by an index generating program they shouldn t normally appear in the user s tex or sbd files directly However they are named as exported macros no symbols since they are used outside the package code and are therefore not stricly internal Some indexes are divided into blocks e g one for each letter of the alphabet or one for each book of the bible Each such block should be enclosed between begin idxblock X and end idxblock lines where X is the title of the block The actual definition of the idxblock environment is set within the initial ization code for each type of index below 3151 newenvironment idxblock 1 Within each idxblock environment there should be a series of i
4. SBO bskvfmt 756 762 764 765 SB bsoldfmt TAT SB cbarshift 59 150 154 1380 SB ch 182 196 2612 SB ch off 196 226 2612 SB ch on 182 224 2612 SB chbgroup 2301 2435 SB chbspace 2402 2403 2406 SB chbstok 2047 2413 2494 SB chdone 2244 2246 2284 2314 2324 2335 2337 2367 2388 2394 2397 2398 2401 2417 2419 2420 2430 2466 2471 2479 2481 SB chegroup 2303 2439 SB chegrpdone 2439 SB chegrpmacro 2439 SB chegrpname 2439 SB chegrpouter 2439 SB chegrpscan 2439 SB chendspace 2247 2399 2416 SB chespace 2247 2282 2301 2303 2308 2312 2317 2343 2345 2353 2355 2365 2399 2416 2432 SB chexpspace 2246 2299 2397 2402 2414 2420 SB chgetname 2326 2329 SB chgetspace 2406 SB chhyph 2307 2389 SB chimpspace 2245 2347 2349 2397 2403 2415 2419 SB chkidxlst 2906 3000 3019 2343 2467 SB chlig SB chlyrdone 2244 2401 2481 SB chmacro 2292 2320 SB chmain 2250 SB chmbar 2339 2341 2428 SB chmstop 2370 SB chmulti 2370 SB chnorm 2274 2275 2278 SB chord 180 2208 2687 SB chordbox 2045 2054 2055 2234 2412 2517 2538 2549 2556 SB chordedspectrue pugan 173 174 SB chordsoff 141 171 SB chordson 171 3597 SB chorusbar 1363 1386 1440 1445 SB chorusbox 311 559 562 570 622 656 672 771 798 1233 1290 1328 1329 1367 1368 1438 1439 1543 157
5. newsongkey versemark or chorusmark to add the necessary TEX marks to the current page whenever a new song verse or chorus begins These macros expect no arguments to access the current song s information including titles use the macros docu mented in 412 To access the current song s number or the current verse s num ber use or Ntheversenun see q11 1 For example to include the song number in the page headings produced by IATEX s pagestyle myheadings feature you could redefine Nsongmark as follows renewcommand songmark markboth thesongnum thesongnum 11 8 Defining New Beginsong Keyvals The beginsong macro supports several optional keyval parameters for declaring song information including and Users can define their own ad ditional keyvals as well To do so use the newsongkey macro which has the syntax newsongkey keyname initcode L default setcode Here keyname is the name of the new key for the keyval initcode is INTEX code that is executed at the start of each line before the beginsong arguments are processed default if specified is the default value used for the keyval when keyname appears in beginsong without a value and setcode is macro code that is executed whenever key is parsed as part of the Noeginsong keyval arguments In setcode 1 expands to the value given by the user for the keyval or to default if no value was given For example to defin
6. 169 SB colorbox 903 932 1492 3304 3600 SB colorboxesfalse 165 SB colorboxestrue 3593 SB colwidth 130 244 248 336 677 774 807 910 1547 3157 3179 3182 SB computess 1393 1394 1403 SB convertnotesfalse 1753 SB convertnotestrue mo 1738 1748 SB cr 779 1244 2644 SB creg 2075 2646 2660 2662 2670 2672 2677 SB csify 2752 2870 2872 2875 2879 2883 2884 SB ctail 2061 2645 2672 2677 2681 2686 SB ctoken 2865 SB cwrite ae 2948 2981 2983 SB declare 2118 SB dimen 24 336 339 341 349 351 364 366 379 382 408 409 412 477 637 639 643 646 647 649 849 850 857 858 860 865 866 871 874 877 878 880 881 1160 1163 1165 1388 1390 1392 1406 1407 1411 1415 1417 1419 1422 1423 1461 1465 1976 1978 1980 1981 1991 1997 2003 2018 2025 2027 2029 2033 2034 2036 2038 2517 2521 2547 2550 2580 2583 2709 2711 2713 2827 2830 2833 2843 3066 3086 3087 3091 3102 3103 3107 3112 3119 3132 3133 3135 3147 3149 3168 3268 3269 3278 3283 3322 3325 3327 SB dimenii 24 638 646 652 1389 1391 1398 1411 1413 1415 1417 1420 1421 1983 1988 2005 2832 2835 3101 3134 3135 3137 3140 3266 3276 3278 3287 3325 3327 SB dimeniii 24 639 641 647 649 651 3107 3108 3112 3117 3119 3120 3123 SB dimeniv 24 3108 3110 3117 3120 3123 3125
7. 493 endgroup 494 Mnobreak 495 ifSB inverse 496 vskip2 p relax 497 else ifSB inchorus 498 vskip2 p relax 499 NelseMifSBOstanzaVelse 500 nobreak vskip versesep 501 VM iM Mif 502 Create a textual note for musicians 503 newcommand musicnote 1 ifchorded textnote 1 fi Typeset an echo part in the lyrics Echo parts will be oblique and parenthesized We toggle between oblique and upright shapes like emph but we use slshape instead of itshape because it tends to look nicer with the larger fonts used in slides mode 95 rep The echo macro must be able to accept chords in its argument This com plicates the implementation because chord macros should change catcodes but if we grab echo s argument in the usual way then all the catcodes will be set before the chord macros have a chance to change them This would disallow chord name abbreviations like and amp within echo parts If we re using TEX then the solution is easy we use scantokens to re scan the argument and thereby re assign the catcodes One subtlety Whenever IXTEX consumes an argument to a macro it changes to so that when the argument text is substituted into the body of the macro the replacement text will not contain unsubstituted parameters such as 1 If scantokens is used on the replacement text and the scanned tokens assign a new catcode to that causes s to be doubled in the output which was not the
8. Then he adds scripindent Acolon Their sins and lawless acts Bcolon I will remember no more scripoutdent And where these have been forgiven there is no longer any sacrifice for sin endscripture produces Then he adds Their sins and lawless acts I will remember no more And where these have been forgiven there is no longer any sacrifice for sin Hebrews 10 17 18 9 Guitar Tablatures gtab Guitar tablature diagrams can be created by using the construct gtab chord fret strings fingering 22 minfrets transpose where the fret and fingering parts are both optional and you may omit any colon that borders an omitted argument chord is a chord name to be placed above the diagram fret is an optional digit any number from 2 to 9 placed to the left of the diagram strings should be a series of symbols one for each string of the guitar from lowest pitch to highest Each symbol should be one of X if that string is not to be played 0 zero or the letter O if that string is to be played open or one of 1 through 9 if that string is to be played on the given numbered fret fingering is an optional series of digits one for each string of the guitar from lowest pitch to highest Each digit should be one of 0 if no fingering information is to be displayed for that string e g if the string is not being played or is being played open or one of 1 through 4 to indi
9. 1 hfil 3338 nobreak 3339 SB idxheadsep nointerlineskip 3340 F 3341 mark noexpand relax 3342 penalty 20 vskip3 p plus3 p relax 3343 3344 renewenvironment SB smidx 1 3345 begin SB lgidx 1 end SB lgidx 3346 renewcommand idxentry 2 3347 SB ellipspread hskip 25cm idxscripfont relax 1 3348 idxrefsfont relax 2 3349 SB toks expandafter SB idxcolhead 3350 mark noexpand SB idxcont the SB toks 33581 153 3352 3353 3354 renewcommand idxaltentry 2 SB erridx a scripture NSBOdisplayindex SB makeauthorindex Create an author index arg1 is a column count arg2 is the title and arg2 is the index identifier which was passed to newauthindex 3355 newcommand SB makeauthorindex 3356 3357 3358 3359 3360 3361 3362 3363 3364 renewenvironment SB lgidx 1 renewenvironment SB smidx 1 renewcommand idxentry 2 7 SB ellipspread idxauthfont relax sfcode Qm 1 idxrefsfont 2 renewcommand idxaltentry 2 SB erridx an author 7 NSBOdisplayindex 16 16 Error Messages We break error messages out into separate macros here in order to reduce the length in tokens of the more frequently used macros that do actual work This can result in a small speed improvement on slower machines SB Error All errors and warnings will be reported as coming from package songs MSBOWarn 3365 newcommand SB Error
10. 1222 1268 1351 2627 SB lop 693 713 2061 2686 3085 SB lyric 2042 2231 2271 2272 2306 2371 2382 2409 2411 2424 2436 2474 2487 2495 SB lyricbox 2045 2229 2407 2408 2412 2482 2483 2520 2521 2536 2543 2544 2547 2551 2558 2566 SB lyricnohyp 2044 2306 2485 SB macrotests 2123 2132 2144 2363 SB makeauthorindex 3297 3355 SB makeidxcolumn a 3163 3252 3256 SB makembar 211 1947 SB makescripindex 3296 3334 SB maketitleindex 3295 3302 SB maxmin 294 2547 3137 3278 3324 3326 SB mbar 211 222 2010 171 SB mch 213 215 224 226 2618 SB mch m 215 2618 SB mch on 213 2618 SB mchlig 2345 2467 SB measuremark 1946 1963 1990 SB measuresoff 184 198 200 205 SB measureson 184 186 198 205 SB measurespectrue EEE TEN ST 207 208 SB memorize 2653 SB meterbot 1943 1945 2012 SB metertop 1943 1945 2012 SB migrate 324 332 333 SB mkpage 295 351 412 421 426 431 477 SB mrkbox 293 330 331 353 SB multiline 3105 3113 3128 3130 SBO multitests 2134 2144 2380 SB nbsp 2222 2348 SB needkeyfalse 1771 1772 1910 SB needkeytrue 1766 1936 SB newindex 2927 2942 2944 2946 SB next 958 972 974 983 985 987 991 1009 1038 1040 1047 1049 1051 1053 1055 1083 1085 1089 1091 1093 1095 1097 1100 1103 1124 1684 1685
11. 1688 1695 1805 1807 1809 1812 1826 1829 1836 1844 1849 1852 1870 1915 1921 1930 2119 2120 2153 2154 2170 2173 2252 2256 2258 2260 2262 2264 2266 2268 2279 2291 2298 2300 2302 2304 2309 2338 2346 2388 2322 2334 2336 2340 2342 2344 2348 2351 2378 2390 2413 2427 2442 2444 2447 2455 2475 2494 2510 2514 SB nextcol 374 416 513 519 587 588 684 685 1456 SB nextname 961 2159 2164 2251 2330 2361 2379 2425 2440 2463 2476 2493 SB nocmark add Monae 634 671 1306 SB nocmarkclass Mer eres 633 671 1292 SB nohatfalse 2058 SB nohattrue 2053 SB noreplay 2077 2470 2616 2688 2693 SB numcols 235 236 239 242 243 245 248 269 285 289 304 307 347 352 364 376 434 435 438 443 446 448 455 457 458 463 475 511 519 524 538 585 774 807 910 1547 2913 SB numhyps 2043 2232 2305 2391 2484 2528 2529 2569 SB obeylines 1170 1269 1352 SB omitscripfalse 233 SB omitscriptrue 232 234 SB oneidxpage 3176 3259 3271 3281 SB onfret 2700 2736 2737 SB othertests 2125 2144 2310 SB out 2925 2935 2937 2939 2949 2950 2957 2961 2962 2965 2969 3032 3042 SB outer 161 2215 2216 SB outertest 2080 2322 2455 SB output 346 395 527 SB par 1171 1175 1193 2336 2512 SB parindent 1194 1197 1199 1601 1603 1626 1642 1644 1659 SB p
12. 2037 kern1 5 p 2038 6 vrule width1 5 p height SB dimen depth po 2039 111 16 10 Lyric Scanning The obvious way to create a chord macro is as a normal macro with two ar guments one for the chord name and one for the lyrics to go under the chord e g chord chordname lyric However in practice such a macro is extremely cumbersome and difficult to use The problem is that in order to use such a macro properly the user must remember a bunch of complex style rules that govern what part of the lyric text needs to go in the lyric parameter and what part should be typed after the closing brace To avoid separating a word from its trailing punctuation the lyric parameter must often include punctuation but not cer tain special punctuation like hyphens should include the rest of the word but not if there s another chord in the word should omit measure bars but only if measure bars are being shown etc This is way too difficult for the average user To avoid this problem we define chords using a one argument macro the argument is the chord name but with no explicit argument for the lyric part Instead the macro scans ahead in the input stream automatically determining what portion of the lyric text that follows should be sucked in as an implicit second argument The following code does this look ahead scanning ifSB wordends Chord macros must look ahead in the input stream to see if this chord is immedi ifSB br
13. 2865 newcommand SB ctoken def SB ctoken 2866 newcommand SB tabargs 2867 def SB tabargs 1 2 3 4 SBOtabargs 2868 def SB temp 4 2869 ifx SB temp Gempty 2870 SB csify SBO targstr 1 2871 else ifx SB temp SB ctoken 2872 SB csify SBOtargstr 1 2873 ifnum SB cnt gt ne 2874 SB cntii SB cnt 2875 SB csify SBO targf ing 2 7 2876 NSBOcntNSBOcntii 2877 else 2878 def SB targfret 1 2879 SB csify SB targstr 2 2880 ML 2881 else 2882 def SB targfret 1 138 songchapter songsection songs 2883 2884 2885 2886 SB csify SB targfing 3 SB csify SB targstr 2 MN 16 14 Book Sectioning The following macros divide the song book into distinct sections each with differ ent headers different song numbering styles different indexes etc Format the chapter header for a chapter in a song book By default chapter headers on a song book omit the chapter number but do include an entry in the pdf index or table of contents Thus the chapter has a number it s just not displayed at the start of the chapter 2887 newcommand songchapter 2888 2889 2890 2891 2892 2893 2894 let SB temp seccntformaty def seccntformat 1 startsection chapter 0 zo 3 5ex plusiex minus 2ex 4ex let seccntformat SB temp sffamily bfseries LARGE centering Format the section header for a section in a song book This is the same as for chapter
14. 336 SB dimen SB colwidth 337 advance SB dimen columnsep 338 nultiply SB dimen SB colnum 339 advance SB dimen wd SB pgbox 340 unhbox SB pgbox 341 ifdim SB dimen z else hskip SB dimen relax fi7 342 box SB box 343 344 61 SB droppage SBG out put SB put boxes SB nextcol This alternate definition of SB updatepage drops the just created page instead of contributing it This allows SB mkpage to be called by the song positioning algorithm as a trial run without outputting anything 345 newcommand SB droppage setbox SB box box voidb x This is the main output routine for the page builder It repeatedly calls SB mkpage emitting pages as they are completed until the remaining content of box SB colbox is not enough to fill a column This final in progress column is left unfinished pending future contributions 346 newcommand SB output 347 ifnum SB numcols gt z begingroup 348 loop 349 NSBOdimenNtextheight 350 ifinner else advance SB dimen pagetotal fi 351 SB mkpage SB colbox SB colnum SB dimen 352 ifnum SB colnum lt SB numcols else 353 unvbox SB mrkbox 354 ifinner else kern z fiZ 355 box SB pgbox 356 ifinner else vfil break vskip vsize relax fif 357 global SB colnum z 358 repeat 359 endgroup else 360 unvbox SB colbox unskip 361 fik 362 Create a vertical list consisting of the already committed contents of the current column plus the
15. 904 NSBOtoksNexpandafter NSBOtemp 905 fi 906 MletNSBOdothisNSBOtrmain 907 SB trscan 908 If this is the first chord of the song assume that this is the tonic of the key and select whether to use a sharped or flatted key signature for the rest of the song based on that Even if this isn t the tonic it s probably the dominant or sub dominant which almost always has a number of sharps or flats similar to the tonic If the bottom note of the chord turns out to be a black key we choose the enharmonic equivalent that is closest to C on the circle of fifths i e the one that has fewest sharps or flats 909 NnewcommandNSBOsetkeysigi 910 global SB needkeyfalse 911 MifcaseMSBOcnt 912 global SB prefshrpstrue or A 913 global SB prefshrpsfalse or Bb 914 global SB prefshrpstrue or B 915 ifx SB next m C 916 global SB prefshrpsfalse 917 else 918 global SB prefshrpstrue 919 Mi Nor 920 NglobalNSBOprefshrpstrueVor Ci 921 ifx SB next m D 922 NglobalNSBOprefshrpsfalse 923 else 924 NglobalNSBOprefshrpstrue 925 Mi Nor 926 global SB prefshrpsfalse or Eb 927 global SB prefshrpstrue or E 928 global SB prefshrpsfalse or F 929 global SB prefshrpstrue or Fi 930 ifx SB next m G 931 global SB prefshrpsfalse 932 else 933 global SB prefshrpstrue 934 fi or 108 1935 NglobalNSBOprefshrpsfalseNVelse Ab 1936 global SB needkeytrue non chord 1937 Mif 1938 sB trend The
16. SB erreco 1375 3496 SB errect 1377 3502 SB errecv 1374 3490 SB erreoc 795 3410 SB erreor 844 3416 SB erreot 845 3423 SB erreov 794 3404 SB errero 1568 1590 3519 SB errert 1568 1590 3525 SB erretex 273 3465 SB errevc 1283 3447 SB errevo 1284 3453 SB errevt 1286 3459 SB erridx 3352 3362 3575 SB errmbar 1949 3558 SB errnoidx 3004 3028 3290 3571 170 SB errnse SB Error 2904 3371 1012 1940 3365 3372 3376 3382 3398 3405 3411 3424 3430 3436 3448 3454 3460 3472 3479 3485 3497 3503 3509 3520 3526 3532 3545 3550 3554 3567 3572 3576 257 3375 3368 3392 3417 3442 3466 3491 3515 3538 3559 SB errpl SB errreg 2658 2668 3549 SB errreplay 2682 3544 SB errrtopt 177 3381 SB errscrip 1630 1637 1650 1656 3531 SB errspos 502 3367 SB errtab 3566 SB etextrue 4 SB everypar 1195 1248 1258 1261 1263 1266 1344 1346 1348 SB finger 2744 2855 SB finloop 591 592 604 605 612 SB firstchord 2224 SB firstchordfalse SB firstchordtrue 2224 2273 2587 2605 2092 SBOflatsize SB f our SB fretbar 2707 2849 2852 SB fretempty 2736 2771 SB frethit 2736 2771 SB fretnum 2697 2819 SB fretwidth 2695 2701 2702 2705 2710 2824 SB gettabindfalse 2073 2747 2863 SB gettabindtrue 2053 SB gotcho
17. splitbotmark 333 3171 splitfirstmark 332 1962 splitfirstmarks 633 635 644 splitmaxdepth 297 3167 3215 splittopskip 297 3167 3215 NSS Eng Ate tias 2200 stitlefont 37 890 916 strophe 1648 T NU Lem d 2186 3633 textbf 124 textheight 188 349 408 421 426 431 3216 3228 3268 textnote 1478 1503 3668 3679 3684 textwidth 247 theSB songsnum thesongnum 64 780 819 820 905 934 1531 2983 3394 3401 3413 3419 3425 3438 3444 3449 3461 3474 3481 3492 3498 3504 3511 3517 3521 3528 3538 3546 3559 3644 theversenum Pul 67 1247 1250 tiny 921 948 1973 1974 titleprefixword 3031 transcapostrue 231 transpose 1760 1769 transposecapos option 231 transposehere 1773 1796 2068 2804 2817 trchordformat 838 2930 3407 3432 3455 3487 1790 1804 twosongcolumns 235 twosongcolumns option Ns ceca ce E uccode 1830 1862 unouter option 161 1509 1517 2183 3632 upshape usefont usepackage NW oa adhd 2184 3632 vbadness 406 630 1405 1958 3214 3265 3287 vcpenalty 106 279 1134 1203 1214 1214 verse verse environment verse environment versefont 40 1267 versejustify 51 136 137 1267 versemark 112 1242 versenumstyle 67 versenumwidth 99 149 265 1252 1254 versesep 80 673 796
18. 063 NnewcommandNSBOprgr 1 SB toks expandafter the SBOtoks 1 SB prloop SB prcomma Commas and hyphens are replaced with active equivalents SB prhyphen 1064 newcommand SB prcomma 1 065 catcode active 066 gdef SB prcomma 1 SB toks expandafter the SBOtoks SB prloop 067 newcommand SB prhyphen 1 068 catcode active 069 gdef SB prhyphen 1 SB toks expandafter the SB toks SB prloop SB prspace Spaces are made active as well but doing so requires some specialized code since SB prspace they cannot be consumed as implicit macro arguments 1070 newcommand SB prspace 1 1071 obeyspaces 1072 gdef SB prspace SB toks expandafter the SB toks SB prspace 1073 newcommand SB prspace afterassignment SB prloop let SB temp SB sractives Assign macro definitions to active commas hyphens spaces and returns when the token list generated by SB parsesrefs is used to typeset a scripture reference list 1074 newcommand SB sractives 1075 catcode active catcode active obeyspaces 1076 gdef SB sractives 1077 let SB srcomma let SB srhyphen let SB srspaceh 1078 SB srspacing 1079 SB srspacing The space factors of semicolons and commas are what the active spaces within a scripture reference text use to decide what came before The following sets them to their default values in case they have been changed but sets all other space factors to 1000 1080 new
19. 2132 2156 SB addtest 2149 2153 2154 2158 2163 2170 2172 SB addtoindex 2976 2990 2997 SB addtoindexes 785 2988 3020 SB addtotitles 787 2994 3022 SB allindexes 2923 2931 2932 2964 3033 SB amp 3629 3638 SB appendsp 962 1007 1813 2424 SB atopfret 2704 2718 2719 2728 2745 SB balancerows 3075 3081 SB begincname 2208 2209 2614 2621 2786 SB beginverse 1215 1218 1223 1224 1226 SB box 24 305 317 320 342 345 631 632 642 643 652 654 665 668 674 852 853 873 874 909 927 930 932 938 942 951 952 955 956 1162 1164 1167 1245 1249 1252 1254 1257 1278 1342 1362 1364 1369 1372 1407 1419 1440 1441 1445 1446 1460 1461 1471 1475 1519 1522 1621 1623 1953 1955 1957 1973 1975 1976 1985 1986 1993 2816 2821 2837 3069 3074 3077 3083 3093 3095 3101 3104 3116 3126 3164 3168 3169 3172 3196 3216 3217 3244 3270 3272 3280 3282 SB boxii 24 410 412 426 903 912 927 928 1957 1959 1960 1974 1975 1978 1987 1988 1999 2819 2823 2827 2841 3111 3116 3127 3216 3218 3270 3276 3280 3286 SB boxiii 24 419 421 431 476 477 168 2820 2828 2843 2844 3271 3273 3281 3285 SB boxup 1459 1492 SB bracket 180 194 2207 2640 SB breakpoint 367 530 1130 1140 1434 1442 1447 1452 SB brokenwordfalse 2519 2530 SB brokenwordtrue 2522 2532
20. 2467 newcommand SB chlig 5 2468 gdef SB ligpre 3 2469 gdef SB ligpost 2 44 2470 gdef SB ligfull SB noreplay hphantom lyricfont 3 2 5 3 2471 SB chdone 2472 2473 newcommand SB mchlig 5 2474 SB lyric expandafter the SB lyric 3 2475 let SB next measurebar 2476 edef SB nextname string measurebar 2477 gdef SB ligpost measurebar 2 4 2478 gdef SB ligfull measurebar 2 4 125 SB chdone SB chlyrdone SB chspcdone SB ligpre SB ligpost SB ligfull SB clearlig SB emitchord 2479 SB chdone 2480 The SB chdone macro is invoked when we ve decided to end the lyric text usu ally because we ve encountered a non lyric token Normally this expands to SB chlyrdone which adds any uncontributed lyric material to the SB lyricbox and jumps to the main chord formatting macro However if MultiwordChords is active and if the lyric ended with a sequence of one or more space tokens then we instead reinsert the space tokens into the token stream without contributing them to the SB lyricbox 2481 newcommand SB chlyrdone 2482 setbox SB lyricbox hbox 2483 unhbox SB lyricbox 2484 ifnum SB numhyps ne 2485 the SB lyricnohyp 2486 else 2487 the SB lyric 2488 M 2489 Y 2490 NSBOemitchord 2491 2492 newcommand SB chspcdone 2493 let SB nextname relax 2494 let SB next SB chbstok 2495 NexpandafterMSBOemitchor
21. 2950 protected Qwrite R raggedright rawtext option rawtexttrue rep repchoruses 267 3388 3466 repchorusfalse 275 619 repchorustrue 270 621 Arepl y cecus 1244 1336 2665 3696 MRequirePackage Lane pats 5 35 3601 resettitles 705 784 788 817 887 3643 rightmargin 1209 rightskip 55 59 154 775 808 1464 1469 1603 1642 3092 3138 rmfamily 119 NEG eruta 1698 1710 rrep 2032 3693 S SB beginsong 759 767 769 3630 SB Gch 2612 SB gtab 2796 2799 2805 SB mch 2618 SB beginchorus 1337 1340 1449 SB beginsong TAT SB bskvfmt TAT SB ch 2612 SB chmacro 2331 2333 SB chord 2208 2225 SB csify 2752 SB echo 1504 SB gtab 2791 2793 SB idxcmd 3031 SB idxentry 3015 3024 SB lop 693 SB mch 2618 SB outertest 2080 SB par 1173 1193 SB prspace 1070 SB prstep 1038 SB rechord 181 2679 SB replay 2665 SB selectcol 403 493 496 499 SB srcomma 1083 SB srcso 1117 SB srdash 1089 SB srhyphen 1089 SB srspace 1097 SB testdigit 1014 SB accidental 2577 2588 2589 SB activehat 2058 2060 2064 2258 2334 2624 2636 SB addDtest 2125 2127 2129 2152 SB addMtest 2134 2168 SB addNtest 2123
22. 5 p 26 ML 27 SB dimen wd SB boxiit 28 advance SB dimen wd SB boxiiiZ 29 ifdim hsize lt SB dimen 30 hsize SB dimen 31 NelseNifSBOgettabind 32 SB dimenii hsize 33 advance SB dimenii SB dimen 34 divide SB dimenii tw 35 global advance SB tabindent SB dimeniiZ 36 fi fiz 37 hbox to hsize hfil unhbox SB box hfil 38 kern p nointerlineskip 39 hbox to hsize 40 hfil 137 SB tabargs SB ctoken 2841 vtop kern p kern2 p box SB boxii 2842 vtop 2843 SB dimen wd SB boxiii 2844 box SB boxiii 2845 SB cnt minfrets 2846 SB gtset relax SB gtmax SB targstr 2847 SB gtinit 2848 loop 2849 SB fretbar hbox SB targstr 2850 advance SB cnt m ne 2851 ifnum SB cnt gt z SB gtinc repeat 2852 NSBOfretbar 2853 ifx SBOtargsfing empty else 2854 kern1 5 po 2855 NSBOgtsetNSBOtopemptyNSBOfinger 2856 hbox SB targfing 2857 MR 2858 yh 2859 hfil 2860 yh 2861 kern3 po 2862 YA 2863 SB gettabindfalse 2864 Break the second argument to a gtab macro into three sub arguments The possible forms are a strings b fret strings c strings fingering or d fret strings fingering To distinguish forms b and c we count the number of tokens before the first colon If there is only one token we assume it must be form b since frets larger than 9 and 1 stringed instruments are both rare Otherwise we assume form c
23. 553 838 841 1531 1537 2909 SB skip 24 796 824 827 1143 1144 1146 1148 1155 1392 1394 1396 1398 1400 1556 1557 1952 1966 1969 2525 2526 SB smidx environment 3154 SB songbox 288 372 419 476 534 540 543 556 569 616 773 804 826 1546 1562 1577 1582 SB songlistbrk 575 588 598 SB songlistcdp 575 590 600 SB songlistcp 575 589 599 SB songlistnc 575 587 597 SB songsenvfalse 722 2919 2914 SB songwrites 704 806 2975 2979 2980 SB songsenvtrue SB spbegnew T 418 447 456 SB spcinit 2233 2241 SB spdblpg 433 451 465 SB spextnew TCR 429 449 464 SB spextold pk Ree 423 444 462 SB spos 413 491 494 497 500 505 SB sposi 442 494 SB sposii 454 482 497 SB sposiii 471 500 SB sractives 1033 1074 SB srbox 1593 1598 1619 1626 SB srcomma 1077 1083 SB srcso 1104 1117 SB srdash 1089 SB srhyphen 1077 1089 SB srspace 1077 1085 1097 1119 SB srspacing 1078 1080 SB stanzabreak 655 657 670 1127 1241 1324 1330 SB stanzafalse 770 SB stanzatrue 1243 1335 3670 3671 SB star SB stypcol SB stype 558 573 SB styppage SB submitpart SB submitsong 572 840 1564 1585 SB tabargs 2809 2865 SB tabindent 2229 2230 2747 2823 2825 2835 522 523 1586 oe ee 522 1584 1586 537 1584 549 573 SB targfi
24. 564 ML 565 yh 566 global advance SB groupcent 567 ifnum SB groupcnt lt z m ne else ne fih 568 fik 569 setbox SB songbox box voidb x 570 setbox SB chorusbox box voidb x 571 Submit the most recently finished song or block of other vertical material for output If we re generating a partial list of songs save it in a box instead of submitting it here The saved boxes will be submitted in the requested order at the end of the songs section 572 newcommand SB submitsong 573 ifpartiallist SB submitpart else SB stype fi4 574 68 SB songlistbrk These macros define the words that when placed in a songlist force a column SB songlistnc break at that point Using brk produces a soft break like Nork that won t leave SB songlistcp whitespace at the bottom of the broken column in lyric books Using nextcol SB songlistcdp produces a hard break like Nnextcol that may insert whitespace to finish the column Using sclearpage moves to the next page if the current page is nonempty Using scleardpage moves to the next double page if the current double page is nonempty 575 newcommand SB songlistbrk 576 def SB songlistbrk brk 577 newcommand SB songlistnc 578 def SB songlistnc nextcol 579 newcommand SB songlistcp 580 def SB songlistcp sclearpage 581 newcommand SB songlistcdp 582 def SB songlistcdp scleardpage commitsongs If we re generating only a partial list then wait until
25. 621 repchorustrue 622 setbox SB chorusbox expandafter box 623 csname chbox SB tempii endcsname 624 ML 625 csname stypeQNSBOtempiiNendcsname 626 advance SB groupcnt ifnum SB groupcnt lt z m ne else ne fi 627 repeat 628 Insert a chorus into the first marked spot in the box given in the first argument This is usually achieved by splitting the box at the first valid breakpoint after the first SB cmark in the box The box is globally modified 629 newcommand SB insertchorus 1 630 631 632 652 653 654 vbadness 0M vfuzz maxdimen setbox SB box copy 17 setbox SB box vsplit SB box toWnaxdimen edef SB temp splitfirstmarks SB nocmarkclass ifx SB temp SB nocmark else edef SB temp splitfirstmarks SB cmarkclass ifx SB temp SB cmark SB dimen4096 pe SB dimenii maxdimen SB dimeniii SB dimen loop SB dimeniii 5 SB dimeniiiZ setbox SB box copy 1 setbox SB box vsplit SB box to SB dimen edef SB temp splitfirstmarks SB cmarkclass ifx SB temp SB cmark SB dimenii SB dimen advance SB dimen SB dimeniii else advance SB dimen SB dimeniiiZ M MifdimMSBOdimeniii 2NpONrepeat setbox SB box vsplit 1to SB dimeniiZ global setbox 1 vbox unvbox SB box unskip 70 nextcol sclearpage 655 SB inversefalse SB prevversetrue SB stanzabreak 656 SB putbox unvcopy SB chorusbox 657 SB inversetrue SB prevversefalse SB stanzabreak 658 Nunvboxit17 659 y
26. Christian Fellowship CICF Once I had fine tuned my package to be sufficiently versatile I decided to release it for public use At that time I noticed the Songbook package and others and wrote this summary of the most prominent differences For information on more song typesetting resources for IXTEX I recommend consulting the documentation provided with the Songbook package It includes an excellent list of other resources that might be of interest to creators of song books 15 GNU General Public License TERMS AND CONDITIONS FOR COPYING DISTRIBUTION AND MODIFICATION 0 This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this Gen eral Public License The Program below refers to any such program or work and a work based on the Program means either the Program or any deriva tive work under copyright law that is to say a work containing the Program or a portion of it either verbatim or with modifications and or translated into another language Hereinafter translation is included without limitation in the term modification Each licensee is addressed as you Activities other than copying distribution and modification are not covered by this License they are outside its scope The act of running the Program is not restricted and the output from the Program is covered only if its contents consti tute a work based on
27. Declare macro 2156 newcommand SB addNtest 4 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 ifx0 2 else SB addtest 1 edef SB temp string 4 ifx SBOtemp SB nextname 2 fiZ Yh M ifx0 3 else SB addtest SBChyphtests edef SB temp string 4 ifx SBOtemp SB nextname 3 fiZ n M SB addMtest A multibyte test The test succeeds if the next lyric token is the beginning of a UTF 8 encoded multibyte character sequence that matches the multibyte sequence given to the Declare macro 2168 newcommand SB addMtest 4 2169 2170 2171 2172 2173 2174 2175 ifx0 2 else SB addtest 1 def SB temp 4 ifx SB next SBOtemp 2 fi M ifx0 3 else SB addtest SBGhyphtests def SB temp 4 ifx SB next SBOtemp 3 fi M The following code declares the common intra word macros provided by TEX as listed on p 52 of The TEXbook to be lyric continuing 2176 DeclareLyricChar 2177 DeclareLyricChar 2178 DeclareLyricChar 2179 DeclareLyricChar 2180 DeclareLyricChar 2181 DeclareLyricChar 2182 DeclareLyricChar 2183 DeclareLyricChar u 2184 DeclareLyricChar v 2185 DeclareLyricChar H 2186 DeclareLyricChar t 2187 DeclareLyricChar c 2188 DeclareLyricChar d 2189 DeclareLyricChar b 2190 DeclareLyricChar oe 116 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 91 NDeclareLyricCharNOE 92 NDeclareLyricChar Nae 93 DeclareLyricChar AE 94 DeclareLyric
28. In the beginsonglline titles is one or more song titles separated by If multiple titles are provided the first is typeset normally atop the song and the rest are each typeset in parentheses on separate lines The otherinfo part is an optional comma separated list of key value pairs keyvals of the form key value The possible keys and their values are by authors authors composers and other contributors cr copyright copyright information 1i license licensing information sr refs related scripture references index lyrics an extra index entry for a line of lyrics ititle title an extra index entry for a hidden title For example a song that begins and ends with beginsong Title1 Title2 by Joe Smith sr Job 3 cr copyright 2012 XYZ li Used with permission endsong looks like 1 Titlel T itle2 Job 3 Joe Smith 2012 XYZ Used with permission The four keyvals used in the above example are described in detail in the remainder of this section the final two are documented in You can also create your own keyvals see 811 8 Song Authors The by authors keyval lists one or more authors com posers translators etc An entry is added to each author index associated with the current Songs environment for each contributor listed Contributors are ex pected to be separated by commas semicolons or the word and For example by Fred Smith John Doe and B
29. PackageError songs 3366 newcommand SBOWarn PackageWarning songs SB errspos 3367 newcommand SB errspos 3368 3369 3370 SB errnse SB Error Illegal protect songpos space argument The argume nt to protect songpos space must be a number from 0 to 3 3371 newcommand SB errnse 3372 3373 3374 SB errpl SB Error Nested songs environments are not supported End th e previous songs environment before beginning the next one 3375 newcommand SB errp1 3376 3377 3378 3379 3380 SB Error protect includeonlysongs space not permitted with in a songs environment protect includeonlysongs space can o nly be used in the document preamble or between songs environ ments in the document body 154 SB errrtopt SB warnrc SB errboo SB errbor SB erreov SB erreoc 3381 newcommand SB errrtopt 3382 SB Error Cannot display chords in a rawtext dump You have u 3383 sed the rawtext option in the protect usepackage space lin 3384 e and have either used the chorded option as well or have use 3385 d the protect chordson space macro subsequently 3386 3387 NnewcommandNSBOvarnrci 3388 NSBOWarniThe protect repchoruses space feature will not wor 3389 k when the number of columns is set to zero 3390 3391 newcommand SB errboo 3392 SB Error Encountered protect beginsong space without seein 3393 g an protect endsong space for the previous song 339
30. Place rep n at the end of a line to indicate that it should be sung n times 524 newcommand rep 1 7 525 raise 25ex hbox 96 1526 fontencoding 0MS fontfamily cmsy selectfont char tw 7 1527 1 1528 16 7 Scripture Quotations The macros in this section typeset scripture quotations and other between songs environments songgroup A songgroup environment associates all enclosed environments with the enclosed song When generating a partial list all the enclosed environments are contributed if and only if the enclosed song is contributed 529 newenvironment songgroup 530 ifnum SB grouplv1 z7 531 edef SB sgroup thesongnum 532 global SB groupcnt m ne 533 fik 534 advance SB grouplvl ne 535 FOL 536 advance SB grouplv1l m ne 537 ifnum SB grouplvl z let SB sgroup empty fi 538 SB grouplvl Count the songgroup environment nesting depth 539 NnewcountNSBOgrouplvl intersong An intersong block contributes vertical material to a column between the songs of a songs section It is subject to the same column breaking algorithm as real songs but receives none of the other formatting applied to songs 540 newenvironment intersong 541 ifSB insong SB errbro SB closeall fiz 542 ifSB intersong SB errbrr SB closeall fiZ 3 setbox SB chorusbox box voidb x 4 NSBOintersongtrue 5 def SB closeall end intersong 546 setbox SB songbox vbox bgroup begingroup 7 ifnum
31. SB transposefactor Even when transposition is not requested the transposition logic can be used to automatically convert note names to another form The following conditional turns that feature on or off 1715 newif ifSB convertnotes Reserve a control sequence for each note of the diatonic scale These will be used to identify which token sequences the input file uses to denote the seven scale degrees Their eventual definitions must consist entirely of uppercase letters and they must be assigned using def but that comes later 1716 newcommand notenameA 1717 newcommand notenameB 1718 newcommand notenameC 1719 newcommand notenameD 1720 newcommand notenameE 1721 newcommand notenameF 1722 newcommand notenameG These control sequences are what the transposition logic actually outputs to denote each scale degree They can include any TX code that is legal in horizontal mode 723 newcommand printnoteA 724 newcommand printnoteB 725 newcommand printnoteC 726 newcommand printnoteD 727 newcommand printnoteE 728 newcommand printnoteF 729 newcommand printnoteG Set the note names used by the input file 730 newcommand notenamesin 7 731 def notenameA 1 732 def notenameB 2 733 def notenameC 3 734 def notenameD 4 735 def notenameE 5 736 def notenameF 6 731 def notenameG 7 738 SB convertnotestruey 739 Y 102 notenamesout Set the note names
32. War ges chins E 78 lastbox 320 665 668 1621 1953 3093 lastcolglue 127 513 lastpenalty 397 1480 lastskip 1148 1556 1952 2525 leaders 1396 3071 3140 leftmargin 1209 1210 leftskip 55 59 73 148 149 154 156 775 808 1382 1383 1463 1468 1603 1622 1643 1659 3088 3138 lineskip 92 915 3160 lineskiplimit 91 3160 Nivst colon cies 1205 listparindent 1208 ME aee 1691 1704 NIIep ove ne 2024 3692 lyric option 171 lyricfalse 179 lyricfont 36 71 134 789 870 1162 2470 lyrictrue 193 3582 M m th 2579 makeatletter 2967 makepostlude 830 946 makeprelude 823 886 N ark i t ivy REA 327 1990 3341 3350 marks 671 800 1236 1341 1433 maxdepth 297 3167 3215 mbar 2010 2012 2340 3561 3691 mch 2262 2344 2618 meaning 2120 2322 2351 2455 166 measurebar 2011 2338 2475 2478 2620 2623 2635 measuresfalse 221 measuresoff 205 Mneasureson 205 measurestrue 210 memorize 1244 2653 3695 783 1945 2013 129 2845 2241 meter minfrets MultiwordChords musicnote 1503 1769 3683 N newauthorindex newbox 28 30 288 291 293 554 560 1290 1593 2045 2046 2975 3060 newchords 2647 3551 3555 newcount 32 33 106 111 129 289 290 548 1539 1714 2043 62 63 2921 newco
33. begin songs titleidx beginsong Doxology by Louis Bourgeois and Thomas Ken sr Revelation 5 13 cr Public domain index Praise God from Whom all blessings flow beginverse G Praise God D from Em Whom Bm all Em bless D ings G flow N G Praise Him all D crea Em tures C here G be D low Em Praise D Him G a D bove G ye C heav n D ly Em host G Praise Fa Em ther D Son Am and G B G C Ho D ly G Ghost NECTAN G men endverse endsong end songs end document To compile this book execute three commands First use IATEX pdflatex is recommended to compile the document lyric chorded slides rawtext Nchordson Nchordsoff slides nomeasures showmeasures measureson measuresoff pdflatex mybook tex where mybook tex is the name of the source document above Next use the songidx program provided with this distribution to generate the indexes songidx titleidx sxd titleidx sbx Finally regenerate the document using IATEX so that the newly generated index data will be included pdflatex mybook tex The final document is named mybook pdf if you use pdflatex or mybook dvi if you use regular latex A copy of the first page of a sample song section is shown in Figure 1 The page shown in that figure is from a chorded version of the book When generating a lyric version the chords are omitted See g for information on how to generate different versions
34. selectfont 1526 2016 2609 2698 2724 2733 2741 2745 sepindexestrue 3592 sepverses 276 setkeys 766 setlicense 733 744 sfcode 951 1081 3359 sffamily 38 47 70 78 117 118 120 1973 1974 2698 2745 2893 2901 sharpsymbol 2586 2588 shiftdblquotes 45 1663 showauthors 115 950 showindex 3289 showmeasures option 205 showrefs 115 954 shrp 852 873 1852 1892 1896 2588 2634 Xslides ics 131 slides option 131 slidestrue 133 slshape 38 78 118 120 135 955 1509 1517 NSmall scien ii seen 47 120 121 123 124 897 snumbgcolor 48 903 932 solfedge 1755 song environment 747 songauthors 728 742 785 951 3647 3648 songchapter 2887 3187 songcolumns 235 285 2913 songcopyright 116 728 743 3659 songgroup environment oak 8 1529 songindexesfalse 168 songindexestrue t4 Sora ces 167 3591 songlicense 116 728 733 3660 songlist 255 551 586 596 songmark 112 805 songnumstyle 64 songnumwidth 97 262 902 904 911 925 933 songpos 488 506 3368 3369 Nsongrefs 132 140 955 1035 1598 3665 songs environment 2903 songsection 2895 3184 songtitle 704 711 714 718 719 785 787 819 890 917 919 3644 3646 spacefactor 1101 1102 2559 2572 spenalty 111 142 367 530
35. then do nothing and return to scanning Otherwise compute a new transposed name 871 newcommand SB trtrans 872 advance SB cnt7 873 ifx SBO temp notenameA z0 874 else ifx SB temp notenameB tw 875 else ifx SB temp notenameC throo 876 else ifx SB temp notenameD5 877 else ifx SB temp notenameE7 878 else ifx SB temp notenameF8 879 else ifx SB temp notenameG10 880 else 99 fi fi fi fi fi fi fiZ 881 ifnum SB cnt lt m ne 882 SB toks expandafter expandafter expandafter 883 expandafter the expandafter SB toks SB temp 884 else 885 NadvanceNSBOcntNSBOtransposefactor 886 ifnum SB cnt lt z advance SB cnt12 Mif 887 ifnum SB cnt gt 11 advance SB cnt 12 fi 888 ifSB needkey ifnum SBOtransposefactor z else SB setkeysig fi fiz 889 edef SB temp 890 the SB toks 891 MifSBOprefshrps 892 ifcase SB cnt printnoteA or printnoteA noexpand shrp or 893 printnoteB or printnoteC or printnoteC noexpand shrp or 107 SB setkeysig 894 MprintnoteDNorNprintnoteDNnoexpandNshrpVorNprintnoteENor 895 MprintnoteFNorNprintnoteFNnoexpandNshrpVorNprintnoteGNVor 896 MprintnoteGNnoexpandNshrpMf i 897 else 898 ifcase SB cnt printnoteA or printnoteB noexpand fl1t or 899 printnoteB or printnoteC or printnoteD noexpand fl1t or 900 printnoteD or printnoteE noexpand flt or printnoteE or 901 printnoteF or printnoteG noexpand flt or printnoteG or 902 printnoteA noexpand f1t fi7 903 ME
36. 1228 1240 1315 1374 3406 3408 3431 3448 3451 3454 3456 3460 3462 3473 3476 3494 3541 3563 3666 enskip 1106 1120 ensuremath 2586 environments chorus 1312 idxblock 3151 intersong 1540 SB lgidx 3154 SB smidx 3154 Scripture 1594 SOng xav TAT songgroup 1529 songs 2903 verse 1214 verse escapechar eTeXversion everychorus Neveryp r uen ein 1266 1348 1490 76 1271 everyverse exhyphenpenalty 2569 3161 extendpostlude 115 948 extendprelude 115 897 922 F f baselineskip 2608 f size 89 849 871 1605 2583 2606 2608 3159 finalhyphendemerits lh Se beh ete od 1627 flat 2587 flatsymbol 2586 2589 flt 852 873 1849 1898 1902 2588 2633 fontencoding 1526 2722 2731 2739 fontfamily 1526 2722 2731 2739 fontseries 2723 2732 2740 fontshape 2723 2732 2740 fontsize 2607 2698 2724 2733 2741 2745 foreachtitle 717 787 919 3646 G 2786 2799 3567 2800 2804 gtab gtabtrans NH Au hangafter hangindent hbadness 157 3089 3105 3113 3089 3105 3113 2470 2616 677 811 1549 hfuzz hphantom hrule hsize 774 807 811 834 889 893 896 910 912 913 1465 1467 1469 1547 1549 1558 2821 2829 2830 2832 2837 2839 3074 3077 3102 3133 3157 3165 3179 3201 3232 3237 3330 3337 NH ge o me 38 bUge se
37. 2342 2612 Nchapter 3185 3186 CheckCommand 1203 chorded option 171 chordedfalse 193 1491 chordedtrue 179 1491 chordlocals 79 2217 chordsoff 171 chordson 171 3385 chorus environment 1312 chorusfont 40 135 1350 Nchorusjustify Mision 51 137 1350 Nchorusmark Im 112 1325 1331 clearpage 599 601 2918 3240 clineparams 88 2541 closeout 2962 2969 Ncolbotglue 125 143 188 202 281 416 588 1143 1152 1456 colorbox 3611 columnsep 244 246 337 3180 3181 3256 commitsongs 583 2916 copyright 3634 cvpenalty 106 280 1132 D Ndi ifs Ste aaah oe 2188 DeclareFlatSize 2590 DeclareLyricChar 2118 2176 2205 164 DeclareNoHyphen hg 2118 2206 DeclareNonLyric 2118 DeclareOption 131 162 166 171 172 205 206 231 232 235 236 define key 738 definecolor 3602 discretionary 2205 E Vecho 1504 3690 emergencystretch 1607 endchorus 795 1229 1283 1316 1321 3412 3414 3437 3439 3451 3480 3482 3491 3493 3497 3499 3503 3505 3542 3564 3677 endendverse 3433 endgraf 1179 1645 endlinechar 1510 endscripture 1599 3399 3402 3418 3421 3520 3522 3526 3528 3535 3682 endsong 752 1240 1280 1321 1361 3393 3395 3405 3411 3417 3420 3424 3426 3509 3512 3523 endverse 794
38. 3087 advance SB dimen 5em 3088 leftskip 5cm 3089 hbadness M hfuzz maxdimen 3090 hskip 5cm relax SB temp unskip nobreak 3091 hskip SB dimen nobreak 3092 rightskip2em plusifil par 3093 setbox SB box lastbox 3094 setbox SB box hbox 3095 unhbox SB box 3096 unskip unskip unpenalty 3097 unpenalty unskip unpenalty 3098 th 3099 expandafter 3100 3101 expandafter SB dimenii the wd SB box relax Next compute the smallest width w2 such that the index entry text produced by 146 SB multiline 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 SB multiline with SB dimen wy has no more lines than with SB dimen set to the maximum available width for the right hand side This effectively horizontal balances the right hand side of the index entry text making all lines of Y roughly equal in width without introducing any extra lines 02 SB dimen hsizey 03 advance SB dimen 5cm 04 setbox SB box vbox 05 SB multiline hbadness OM hfuzz maxdimen 06 234 07 SB dimeniii 5 SB dimen 08 SB dimeniv SB dimeniiilZ 09 Moop 0 SB dimeniv 5 SB dimenivy 1 setbox SB boxii vbox y 2 SB dimen SB dimeniiilZ 3 SB multiline hbadness OM hfuzz maxdimen 4 3 5 ifnum SB cnt lt OM 6 ifdim ht SB boxii gt ht SB box 7 advance SB dimeniii SB dimenivy 8 else 9 SB dimen SB dimeniiiZ
39. 32 columnsep colbotglue lastcolglue songpos Setting the number of columns to zero disables the page building algorithm entirely This can be useful if you want to use an external package such as multicol or PTFX s built in twocolumn macro to build pages For example the following sets up an environment that is suitable for a lyric book that uses twocolumn songcolumns 0 flushbottom Ntwocolumn NLARGENcentering My Songs Nbegin songs H vene S555 When disabling the page builder please note the following potential issues e The Nrepchoruses feature does not work when the page builder is disabled because the page builder is responsible for inserting repeated choruses as new columns are formed e External page building packages tend to allow column and page breaks within songs because they have no mechanism for moving an entire song to the next column or page to avoid such a break see below e Indexes produced with are typeset to the width of the enclosing environment Thus you should be sure to reset IATEX back to one column via onecolumn before executing The horizontal distance between consecutive columns is controlled by the columnsep dimension For example to separate columns by 1 centimeter of space write columnsep 1cm When IATEX ends each column it inserts glue equal to colbotglue In lyric books this macro is set to Opt so that each column ends flush with the bottom of the page In
40. License as published by the Free Software Foundation either version 2 of the License or at your option any later version A copy of the license can be found in This document corresponds to songs v2 14 dated 2012 03 17 2012 Kevin W Hamlen and distributed under version 2 the GNU General Public License as published by the Free Software Foundation This program is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE See the GNU General Public License in 15 for more details A copy of the license can also be obtained by writing to the Free Software Foundation Inc 51 Franklin Street Fifth Floor Boston MA 02110 1301 USA This software is copyright 2012 Kevin W Hamlen For contact information or the latest version see the project webpage at http songs sourceforge net 3 Sample Document For those who would like to start making song books quickly the following is a sample document that yields a simple song book with one song and one title index Starting from this template you can begin to add songs and customizations to create a larger book Instructions for compiling this sample song book follow the listing documentclass article usepackage chorded songs newindex titleidx titleidx noversenumbers begin document showindex Complete Index of Songs titleidx songsection Worship Songs
41. ML 3011 edef SB indexlist the SBO toks 143 3012 th 3013 A 3014 indexentry SB addtoindexes will be called automatically for each song in a section How SB idxentry ever indexentry may be called by the user in order to add an alternative index SB idxentry entry for the given song Usually this is done to index the song by its first line or some other memorable line in a chorus or verse somewhere 3015 newcommand indexentry ifnextchar SB idxentry SBO idxentry 3016 newcommand SB idxentry 3017 def SB idxentry 1 2 3 1 3018 def SB indexlist 2 3019 SB chkidxlst 3020 SB addtoindexes 1 3 3 3 7 3021 3022 newcommand SB idxentry 2 SB addtotitles 1 2 indextitleentry indextitleentry may be used to add an alternate title for the song to the index The only difference between the effects of indexentry and indextitleentry is that the latter are italicized in the rendered index and the former are not 3023 NnewcommandNindextitleentryi 3024 ifnextchar SB idxentry SBO idxentry 3025 indexsongsas The following macro allows the user to change how songs are indexed on the right side of index entries By default the song s number is listed 3026 NnewcommandNindexsongsas 1 7 3027 ifundefined SB idxrefO 1 3028 SB errnoidx 1 gobble 3029 expandafter renewcommand csname SB idxref 1 endcsname 3030 SB idxcmd The songidx index generation program understand
42. SB numcols else ifSB preamble else SB clearpage fi4 ML SB numcols SB cnt ifnum SB numcols gt z7 SB colwidth columnsep nultiply SB colwidth SB numcols NadvanceNSBOcolvidthNcolumnsep NadvanceNSBOcolwidthNtextwidth divide SB colwidth SB numcols else ifrepchorus SB warnrc fif 251 Mil 252 253 newcommand onesongcolumn songcolumns ne 254 newcommand twosongcolumns songcolumns tw iw N 0o NAAR Oto oco bo c o Display only a select list of songs and ignore the rest 255 newcommand songlist 256 newcommand includeonlysongs 1 257 ifSB songsenv SB errp1 else 258 partiallisttrue 259 renewcommand songlist 1 260 fik 261 The user can turn off song numbering with the following macro 262 newcommand nosongnumbers setlength songnumwidth z The user can turn off verse numbering with the following macro 263 newcommand noversenumbers 264 renewcommand printversenum 1 265 setlength versenumwidth z 266 58 repchoruses norepchoruses sepverses SB songbox Using repchoruses causes choruses to be automatically repeated on subsequent pages of the song The feature requires e TEX because the supporting code needs an extended mark register class 267 if SB etex 268 newcommand repchoruses 269 ifnum SB numcols lt ne SB warnrc fi4 270 repchorustrue 271 272 else 273 newcommand repchoruses SB erretex 274 fi 275 ne
43. and arg2 is the denominator of the meter to be rendered above the bar If those arguments are left blank render a measure bar without a meter marking 947 newcommand SB makembar 2 948 ifSB inverse else 949 ifSB inchorus else SB errmbar fif 950 fih 951 ifhmode 952 SB skip lastskip unskip 953 setbox SB box lastbox 954 copy SB box 955 ifvbox SB box 956 Nbegingroup 957 setbox SB boxii copy SB box 109 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 2000 2001 2002 2003 2004 2005 2006 2007 vbadness M vfuzz maxdimen setbox SB boxii vsplit SB boxii to maxdimen endgroup long edef SB temp splitfirstmark ifx SB temp SB measuremark penalty100 hskip1em else penalty100 hskip SB skip MR else penalty100 hskip SB skip ML ML ifvmode leavevmode fi setbox SB box hbox tiny sffamily 1 setbox SB boxii hbox tiny sffamily 2 7 ifdim wd SB box gt wd SB boxiil SB dimen wd SB box relax else SB dimen wd SB boxii relax ML ifdim SB dimen lt 5 p0 SB dimen 5 po ML SB dimenii baselineskip advance SB dimenii 2 po advance SB dimenii ht SB box advance SB dimenii dp SB box advance SB dimenii ht SB boxiif advance SB dimenii dp SB boxiif vbox mark SB measuremark hbox to SB
44. any case this macro should work decently whether in horizontal or vertical mode In horizontal mode life is easy we just append the reference to the current horizontal list using the classic code from p 106 of The TEXbook However if we re now in vertical mode the problem is a little harder We do the best we can by using lastbox to remove the last line then adding the reference and re typesetting it This isn t as good as the horizontal mode solution because TEX only gets to reevaluate the last line instead of the whole paragraph but usually the results are passable 617 newcommand scitehere 7 618 NifSBOintersong 619 ifvoid SB srbox else 620 ifvmode 621 setbox SB box lastbox 622 nointerlineskip noindent hskip leftskip 623 unhbox SB box unskip 624 Mid 625 unskip nobreak hfil penalty50 hskip 8em null nobreak hfil 626 box SB srbox kern SB parindent 627 parfillskip z finalhyphendemerits2000 par 628 ML 629 else 630 SB errscrip scitehere 99 1631 f i 1632 Acolon Typeset a line of poetry in a scripture quotation Bcolon 1633 newcommand Acolon SB colon2 Acolon 1634 newcommand Bcolon SB colon1 Bcolon SB colon Begin a group of temporary definitions that will end at the next return The return will end the paragraph and close the local scope 635 newcommand SB colon 2 636 ifSB intersong else 637 SB errscrip 2 638 beginscripture Unknown 639 Nfi 640 ifhmod
45. broken SB macrotests out into separate macros based on category codes SB multitests 9144 newcommand SB lettertests SB othertests 2145 newcommand SB macrotests NSBOhyphtests 2146 newcommand SB multitests 2147 newcommand SB othertests 2148 newcommand SB hyphtests The following macros add tests to the test macros defined above In each arg1 is the test macro to which the test should be added arg2 and arg3 is the code to be executed at scanning time and at hyphenation time if the test succeeds or 0 if no action is to be performed and arg4 is the token to which the currently scanned token should be compared to determine if it matches SB addtest Append the top level expansion of arg2 to the control sequence name given by arg1 2149 newcommand SB addtest 2 2150 NexpandafterNgdefNexpandafteritiNexpandafter i142 7 2151 SB addDtest A definition test The test succeeds if the definition at test time of the next lyric token matches the definition at test time of the control sequence that was given to the Declare macro 2152 newcommand SB addDtest 4 115 2153 2154 2155 ifx0 2 else SB addtest 1 ifx SB next 4 2 fi fi ifx0 3 else SB addtest SB hyphtests ifx SB next 4 3 fi fi SB addNtest A name test The test succeeds if the next token is a non outer macro or active character and its stringified name matches the stringified name of the control sequence that was given to the
46. by the songidx program are then read in by the macro next time the source document is compiled using TFX These sbx files consist of the macros and environments described below 40 idxblock idxentry idxaltentry In indexes that are blocked off into sections one for each letter of the alphabet the filename sbx files generated for that index consist of a series of idxblock environments one for each such section An idxblock environment begins and ends with begin idxblock letter end idxblock where letter is the letter of the alphabet for that block The index entries themselves are created by lines of the form idxentry leftside rightside indexaltentry leftside rightside each of which creates an index entry with leftside on the left followed by a series of dots followed by rightside on the right The indexentry macro is used for normal entries e g titles in a title index and indexaltentry is used for alternate entries e g lyric lines in a title index Within rightside multiple items are separated with NX macros instead of commas When used in an index sbx file the NN macro produces a comma followed by some complex spacing that allows index lines to be broken suitably if they are too long to fit in one physical line 14 Other Resources There are a number of other IXTEX packages available for typesetting songs tabla ture diagrams or song books Probably the best o
47. contribution to it Box b and count register are globally modified If SB updatepage is not redefined boxes SB pgbox and SB mrkbox are also globally modified based on the results of the split 295 newcommand SB mkpage 3 296 Nbegingroup A 297 splitmaxdepth maxdepth splittopskip z skip 298 global setbox 1 vbox 299 unvbox 1 300 nointerlineskip 301 null 302 vfil 60 SB migrate SB updatepage 303 th 304 loop ifnum 2 lt SB numcols 305 setbox SB box vsplit 1to 3 relax 306 ifvoid 1 307 2 SB numcols 308 else 309 SB updatepage 310 global advance 2 ne 311 ifrepchorus ifvoid SB chorusbox else 312 SB insertchorus 1 313 MN 314 fik 315 repeat 316 global setbox 1 vbox 317 unvbox SB box 318 unvbox 1 319 unskip 320 setbox SB box lastbox 321 3 322 endgroup 323 Migrate a mark out of a recently split vertical list but do not insert superfluous empty marks that may override previous marks 324 newcommand SB migrate 1 325 SB toks expandafter 1 326 edef SB temp the SBO toks 327 ifx SB temp empty else mark the SB toks fiz 328 Update boxes SB pgbox and SB mrkbox immediately after splitting the contents of SB colbox 329 newcommand SB updatepage 330 global setbox SB mrkbox vbox 7 331 unvbox SB mrkbox 332 NSBOnigrateNsplitfirstmark 333 SB migrate splitbotmark 334 MA 335 global setbox SB pgbox hbox 7
48. dotranspose 1 777 the SB toks 778 else 779 1 780 ML 781 else 782 ifSB convertnotes 783 SB transposefactor z 784 SB dotranspose 1 785 xdef SB tempv the SB toks 786 else 787 def SB tempv 1 788 ML 789 SB dotranspose 1 790 expandafter trchordformat expandafter SB tempv the SB toks 791 fi 792 notrans Suppress chord transposition without suppressing note name conversion When a notrans tezt macro appears within text undergoing transposition the notrans macro and the group will be preserved verbatim by the transposition parser When it is then expanded after parsing we must therefore re invoke the transposition logic on the argument but in an environment where the transposi tion factor has been temporarily set to zero This causes note name conversion to occur without actually transposing 1793 newcommand notrans 1 1794 Nbegingroup A 1795 NSBOtransposefactorVzQ 1796 transposehere 1 1797 endgroup 1798 104 SB dotranspose trchordformat Parse the argument to a chord macro yielding the transposed equivalent in the SB toks token register 1799 newcommand SB dotranspose 1 1800 SB toks 1801 let SB dothis SB trmain 1802 SB trscan 1 SB trend 1803 By default transposing means replacing old chords with new chords in the new key However sometimes the user may want to typeset something more sophisticated like old
49. following macro marks the end of chord text to be processed It should always be consumed and discarded by the chord scanning logic above so generate an error if it is ever expanded 1939 newcommand SB trend 1940 SB Error Internal Error Transposition failed 1941 This error should not occur 1942 16 9 Measure Bars The following code handles the typesetting of measure bars SB metertop These macros remember the current numerator and denominator of the meter SBGmeterbot 1943 newcommand SB metertop 1944 newcommand SB meterbot meter Set the current meter without producing an actual measure bar yet 1945 newcommand meter 2 gdef SB metertop 1 gdef SBOmeterbot 2 SB measuremark Normally measure bar boxes should be as thin as possible so that they can be slipped into lyrics without making them hard to read But when two measure bars appear consecutively they need to be spaced apart more so that they look like two separate lines instead of one thick line To achieve this there needs to be a way to pull a vbox off the current list and determine whether or not it is a box that contains a measure bar The solution is to insert a mark SB measuremark at the top of each measure bar vbox We can then see if this measure bar immediately follows another measure bar by using vsplit on lastbox 1946 newcommand SB measuremark SBO IsMeasure SB makembar Typeset a measure bar If provided arg1 is the numerator
50. headers except at the section level 2895 newcommand songsection 2896 2897 2898 2899 2900 2901 2902 let SB temp seccntformaty def seccntformat 1 startsection section 1 zo 3 5ex plusiex minus 2ex 4ex let seccntformat SB temp sffamily bfseries LARGE centering Begin and end a book section The argument is a list of indexes with which to associate songs in this section 2903 newenvironment songs 1 7 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 ifSB songsenv SB errnse fi gdef SB indexlist 1 MSBOchkidxlst stepcounter SB songsnum setcounter songnum 1 let SB sgroup empty ifinner else ifdim pagetotal gt z null nointerlineskip fi fik songcolumns SB numcols SB songsenvtrue 2915 M 139 2916 commitsongs 2917 global let SB indexlist empty 2918 NifinnerVelseNclearpageMfifA 2919 NSBOsongsenvfalse 2920 Each songs section needs a unique number to aid in hyperlinking 2921 newcounter SB songsnum 16 15 Index Generation The following macros generate the various types of indexes At present there are four types 1 A large index has a separate section for each capital letter and is printed in two columns 2 A small index has only a single column centered and has no sections 3 A scripture index has three columns and each entry has a comma separated list of references 4 An author index i
51. ifnolyrics ifdim wd SB lyricbox z SB testtrue fi fi4 127 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 MifSBOtest NunhboxNSBOchordbox gdef SB temp expandafter SB clearlig SB ligfull else Otherwise typeset the chord above the lyric on a double height line vbox clineparams relax MifSBObrokenword global setbox SB lyricbox hbox unhbox SB lyricbox SB ligpre Ht SB maxmin SB dimen lt wd SB lyricbox advance SB dimen 5em hbox to SB dimen unhbox SB chordbox hfil hbox to SB dimen unhcopy SB lyricbox hfil char hyphenchar font hfil t NglobalNSBOcnt Nm gdef SB temp expandafter SB clearlig SB ligpost else box SB chordbox hbox unhcopy SB lyricbox global SB cnt spacefactor hfil Ht gdef SB temp expandafter SB clearlig SB ligfull Mid If the chord is lyricless inhibit a linebreak immediately following it This prevents sequences of lyricless chords which often end lines from being wrapped in the middle which looks very unsightly and makes them difficult to read If the chord has a lyric but it doesn t end on a word boundary insert an appropriate penalty to prevent linebreaking without hyphenation Also preserve the spacefactor in this case which allows ATEX to fine tune the spacing between consecutive characters in the word that contains the chord 25
52. in italics instead of bold face type renewcommand idxauthfont small it The font used to typeset entries of a scripture index is controlled by idxscripfont For example to typeset such entries in boldface instead of italics type renewcommand idxscripfont sffamily small bfseries To control the formatting of the lines that start each new book of the bible in a scripture index redefine idxbook which accepts the book name as its single argument For example to typeset each book name in a box one could define renewcommand idxbook 1 framebox small bfseries 1 In a scripture index when a column break separates a block of entries devoted to a book of the bible the new column is titled bookname continued by default You can change this default by redefining the idxcont macro which receives the bookname as its single argument For example to typeset an index in German one might define renewcommand idxcont 1 small textbf 1 fortgefahren Alphabetization Options In English when a title begins with The or A it is traditional to move these words to the end of the title and sort the entry by the following word So for example The Song Title is typically indexed as Song Title The To change this default behavior you can use titleprefixword in the document preamble to identify each word to be moved to the end whenever it appears as the first word of a title index entry
53. installation of the executable However as a special exception the source code distributed need not include anything that is normally distributed in either source or binary form with the major components compiler kernel and so on of the operating system on which the executable runs unless that component itself accompanies the executable 44 If distribution of executable or object code is made by offering access to copy from a designated place then offering equivalent access to copy the source code from the same place counts as distribution of the source code even though third parties are not compelled to copy the source along with the object code You may not copy modify sublicense or distribute the Program except as ex pressly provided under this License Any attempt otherwise to copy modify sub license or distribute the Program is void and will automatically terminate your rights under this License However parties who have received copies or rights from you under this License will not have their licenses terminated so long as such parties remain in full compliance You are not required to accept this License since you have not signed it However nothing else grants you permission to modify or distribute the Program or its derivative works These actions are prohibited by law if you do not accept this License Therefore by modifying or distributing the Program or any work based on the Program you indicate your acc
54. intent To avoid this problem we use sanitize before consuming the argument to echo which sets the catcodes of most special tokens including to 12 so that IXTEX will not recognize any of them as parameters and will therefore not double any of them 504 if SB etex 505 newcommand echo begingroup sanitize SB echo 506 newcommand SB echo 1 507 NendgroupA 508 Nbegingroup 509 ifdim fontdimen ne font gt z upshape else slshape fiZ 510 endlinechar m ne 511 scantokens 1 Y 512 endgroup 513 514 else If we re not using e TEX we must do something more complicated We set up the appropriate font within a local group and finish with hbox so that the argument to echo is treated as the body of the box Control is reacquired after the box using Naftergroup whereupon we unbox the box and insert the closing parenthesis This almost works except that if the last thing in an echo part is a long chord name atop a short lyric the closing parenthesis will float out away from the lyric instead of being sucked under the chord I can find no solution to this problem so to avoid it users must find a version of IXTEX that is e TEX compatible 515 newcommand echo 516 Nbegingroup 517 ifdim fontdimen ne font gt z upshape else slshape fiZ 518 afterassignment SB echo 519 setbox SB box hbox 520 521 newcommand SB echo aftergroup SB echo 522 newcommand SB echo unhbox SB box endgroup 523 fi
55. item that follows the word by So for example Music by J S Bach is indexed as Bach J S rather than Bach Music by J S To recognize a different word instead of by you can use authbyword in the document preamble For example to recognize durch instead you could say authbyword durch When parsing author index entries if a list item contains the word unknown that item is ignored and is not indexed This prevents items like Composer un known from being indexed as names To cause the indexer to recognize and ignore a different word you can use the authignoreword macro in the docu ment preamble For example to ignore author index entries containing the word unbekannt you could say authignoreword unbekannt 11 7 Page Headers and Footers In 4TRX page headers and footers are defined using a system of invisible marks that get inserted into the document at the beginning of each logical unit of the document e g each section song verse and chorus The headers and footers are then defined so as to refer to the first and or last invisible mark that ends up on each page once the document is divided into pages This section describes the marks made available by the songs package For more detailed information about the marks already provided by LATEX and how to use them consult any LXTEX user manual To add song information to page headings and footers redefine Nsongmark 36
56. non transposing instruments can play from the same piece of music This can be achieved by redefining the trchordformat 24 Nsolfedge Nalphascale notenames notenamesin notenamesout transposehere macro which receives two arguments the original chord name and the trans posed chord name respectively For example to print the old chord above the new chord above each lyric define renewcommand trchordformat 2 vbox hbox 1 hbox 2 Changing Note Names In many countries it is common to use the solfedge names for the notes of the scale LA SI DO RE MI FA SOL instead of the alphabetic names A B C D E F G By default the transposition logic only understands alphabetic names but you can tell it to look for solfedge names by typing solfedge To return to alphabetic names type alphascale You can use other note names as well To define your own note names type notenames nameA nameB nameG where each of nameA through nameG must consist entirely of a sequence of one or more uppercase letters For example some solfedge musicians use T instead of SI for the second note of the scale To automatically transpose such music use notenames LA TI DO RE MI FA SOL The songs package can also automatically convert one set of note names to another For example suppose you have a large song book in which chords have been typed using alphabetic note names but you wish to produce a boo
57. of the same book 4 Initialization and Options Each ATEX document that uses the songs package should contain a line like the following near the top of the document usepackage options songs Supported options include the following Output Type The songs package can produce four kinds of books lyric books chord books books of overhead slides and raw text output You can specify which kind of book is to be produced by specifying one of lyric chorded slides or rawtext as an option If none of these are specified chorded is the default Lyric books omit all chords whereas chord books include chords and addi tional information for musicians specified using musicnote Books of overhead slides omit all chords and typeset one song per page in a large font centered Raw text output yields an ascii text file named jobname txt where jobname is the root filename containing lyrics without chords This can be useful for importing song books into another program such as a spell checker Chords can be turned on or off in the middle of the document by using the chordson or chordsoff macros Slides mode can be activated in the middle of the document by using the slides macro For best results this should typically only be done in the docu ment preamble or at the beginning of a fresh page Measure Bars The songs package includes a facility for placing measure bars in chord books see q7 7 To omit these measure bars use th
58. other books that have ragged bottoms it is set to stretchable glue so that columns end at whatever vertical position is convenient The recommended setting for typsetting columns with ragged bottoms is renewcommand colbotglue Opt plus 5 textheight minus Opt The last column in a songs environment gets lastcolglue appended to it instead By default it is infinitely stretchable so that the last column ends at its natural height By setting it to Opt you can force the last column to be flush with the bottom of the page renewcommand lastcolglue Opt The songs package uses a song positioning algorithm that moves songs to the next column or page in order to avoid column or page breaks within songs The algorithm has four levels of aggressiveness numbered from 0 to 3 You can change the aggressiveness level by typing 33 spenalty indexsongsas sepindexestrue sepindexesfalse idxrefsfont idxtitlefont idxlyricfont idxheadfont songpos level The default level is 3 which avoids column breaks page breaks and page turns within songs whenever possible Page turns are page breaks after odd numbered pages in two sided documents or after all pages in one sided documents Level 2 avoids page breaks and page turns but allows column breaks within songs Level 1 avoids only page turns within songs Level 0 turns off the song positioning algorithm entirely This causes songs to be positioned wherever TEX thinks
59. preamble ifSB test SB temp SB tempii SB tempiii SB tempiv SB tempv SB dimen SB dimenii SB dimeniii SB dimeniv SB box SB boxii SB boxiii SB toks SB cnt SB cntii SB skip lyricfont 11 ifnum pdfoutput lt ne else 12 SB pdftrue 13 fi 14 fi 15 fi Some macros have different effects depending on when they re used in the preamble or in the document body so we need a conditional that remembers whether we re still in the preamble It gets initialized to true and later changed to false once the body begins 16 newif ifSB preamble 17 SB preambletrue Reserve some control sequence names for scratch use 18 NnewifNifSBOtest 19 newcommand SB temp 20 newcommand SB tempii 21 newcommand SB tempiii 22 newcommand SBO tempiv 23 newcommand SB tempv Reserve some temp registers for various purposes 24 newdimen SB dimen 25 newdimen SB dimenii 26 newdimen SB dimeniii 27 newdimen SB dimeniv 28 newbox SB box 29 newbox SB boxii 30 newbox SB boxiii 31 newtoks SB toks 32 newcount SB cnt 33 newcount SB cntii 34 newskip SB skip Load David Carlisle s keyval package for processing key value style macro arguments 35 RequirePackage keyval 16 2 Default Parameters This section defines macros and lengths that will typically be executed or redefined by the user in the document preamble to initialize the document Not all of these are restricted to preamble
60. s number It is set to 1 after each Nbeginsong line and is increased by 1 after each Nen verse except if the verse begins with The versenum counter can be redefined anywhere within a song For example setcounter versenum 3 sets the next verse s number to be 3 You can change the verse numbering style by redefining theversenum For example to cause verses to be numbered in uppercase roman numerals define renewcommand theversenum Roman versenum To change the formatting of verse numbers as they appear at the beginning of each verse redefine the printversenum macro which expects the text yielded by Ntheversenun as its only argument For example to typeset verse numbers in italics define renewcommand printversenum 1 it LARGE 1 The versenumwidth length defines the horizontal space reserved for verse numbers to the left of each verse text Verse text is shifted right by this amount For example to reserve half a centimeter of space for verse numbers define setlength versenumwidth 0 5cm Verse numbers whose widths exceed versenumwidth indent the first line of the verse an additional amount to make room but subsequent lines of the verse are only indented by versenumwidth To turn off verse numbering entirely use noversenumbers This is equivalent to saying renewcommand printversenum 1 setlength versenumwidth Opt The horizontal placement of verse numbers within the first line of
61. s title By default this is the first title provided in the Nbeginsong line The and foreachtitle macros see below cause it to be set to the current song s other titles if any To get the current song s primary title i e the first title specified in the song s line execute resettitles This sets the Nsongtitle macro to be the song s primary title To get the song s next title execute nexttitle which sets Nsongtitle to be the next title in the song s list of titles or sets Nsongtitle to relax if there are no more titles The foreachtitle macro accepts LXTEX code as its single argument and 39 songlist executes it once for each remaining song title Within the provided code use songtitle to get the current title For example the following code generates a comma separated list of all of the current song s titles resettitles songtitle nexttitle foreachtitle songtitle When includeonlysongs is used to extract a partial list of songs the songlist macro expands to the comma separated list of songs that is being extracted Redefining songlist within the document preamble alters the list of songs to be extracted Redefining it after the preamble may have unpredictable results 13 Index Generation The material in this section describes macros provided by the songs package that are used during the automatic generation of the song book indexes Since index generation is automatic document autho
62. single composite symbol When a chord macro falls inside a ligature IXTEX fails to compact the ligature into a single font character even in non chorded versions of the book To avoid this minor typograhpical error use the ch macro to typeset the chord ch chord pre post full where chord is the chord text pre is the text to appear before the hyphen if the ligature is broken by auto hyphenation post is the text to appear after the hyphen if the ligature is broken by auto hyphenation and full is the full ligature if it is not broken by hyphenation For example to correctly typeset Gsus4 dif G ficult in which the G chord falls in the middle of the ffi ligature one should use G di ch G f fil ffi cult produces difficult This causes the ffi ligature to appear intact yet still correctly places the G chord over the second f To use the ch macro with a replayed chord name see 7 4 use as the chord The mch macro is exactly like the macro except that it also places a measure bar into the ligature along with the chord For example G di mch G f fi ffi cult produces dn places both a measure bar and a G chord after the first f in difficult yet cor rectly produces an unbroken ffi ligature in copies of the book in which measure bars are not displayed In the unusual case that a meter change is required within a ligature this can be achieved with a construction like G met
63. songlist The includeonlysongs macro only reorders songs within each songs envi ronment see q7 not between different songs environments It also cannot be used in conjunction with the rawtext option songsection songchapter newindex newauthorindex newscripindex showindex 5 Book Sections Section Titles Section titles in a song book can be produced with songsection title which acts like IXTEX s Nsection command except that it centers the title text in sans serif font and omits the section number When using the book document class use songchapter instead of songsection Indexes The songs package supports three kinds of indexes indexes by title and or notable lyrics indexes by author and indexes by scripture reference To generate an index first declare the index in the document preamble i e before the begin document line with one of the following newindex id filename newauthorindex id filename newscripindex id filename The id should be an alphabetic identifier that will be used to identify the index in other macros that reference it The filename should be a string that when appended with an extension constitutes a valid filename on the system Aux iliary files named filename sxd and filename sbx are generated during the automatic index generation process For example newindex mainindex idxfile creates a title index named mainindex whos
64. space m 3456 ight have an protect endverse space with no matchin 3457 g protect beginverse 3458 SB errevt 3459 newcommand SB errevt 3460 SB Error Encountered an protect endverse space outside of 3461 f any song Before song thesongnum there is a 3462 n protect endverse space line not preceded b 3463 y a protect beginsong space line 3464 SB erretex 3465 newcommand SB erretex 3466 SB Error The protect repchoruses space feature requires e 3467 TeX compatibility Your version of LaTeX2e does not appear t 3468 o be e TeX compatible Find a distribution that includes e T 3469 eX support in order to use this feature 3470 Y SB errbcv 3471 newcommand SB errbcv 3472 SB Error Encountered protect beginchorus space without see 3473 ing an protect endverse space for the preceding verse Son 3474 g thesongnum space might hav 3475 ea protect beginverse space with no match 3476 ing protect endverse 3477 Y SB errbcc 3478 newcommand SB errbcc 3479 SB Error Encountered protect beginchorus space without see 3480 ing an protect endchorus space for the preceding chorus 3481 Song thesongnum space might have a protect beginchorus 3482 Nspace with no matching protect endchorus 3483 SB errbct 3484 newcommand SB errbct 3485 SB Error Encountered protect beginchorus space without see 3486 ing a protect beginsong space line first After son 3487 g
65. the index whose identifier is given by arg1 2976 newcommand SB addtoindex 2 2977 protected edef SBOtempii 2 2078 ifx SB tempii empty else 2979 global setbox SB songwrites vbox 2980 unvbox SB songwrites 2981 SB cwrite 1 2 2982 SB cwrite 1 csname SB idxref 1 endcsname 7 2983 SB cwrite 1 song theSB songsnum thesongnum 2984 ifnum c section z 1 else2 fi 2985 yh 2986 fi 2987 Add arg1 to all title indexes arg2 to all scripture indexes and arg3 to all author indexes 2988 newcommand SB addtoindexes 3 2989 for SB temp SB indexlist do 7 2990 SB addtoindex SB temp 2991 csname SB idxse1 SBOtemp endcsname 1 2 3 2992 2993 Add arg1 to all title indexes but leave other indexes unaffected 2994 newcommand SB addtotitles 1 2995 for SB temp SB indexlist dof 7 2996 csname SB idxsel SB temp endcsname 2997 SB addtoindex SBetemp 1 29098 Y 2999 Check the current list of indexes and flag an error if any are undefined 3000 newcommand SB chkidxlst 3001 let SB temp SB indexlist 3002 let SB indexlist empty 3003 for SB tempii SB temp do 3004 if undef ined SB idxse1 SBOtempii SB errnoidx SB tempii 3005 ifx SB indexlist empty 3006 SB toks expandafter SBOtempii 3007 else 3008 SB toks expandafter expandafter expandafter 3009 expandafter SB indexlist expandafter SB tempii 3010
66. the Program independent of having been made by running the Program Whether that is true depends on what the Program does 1 You may copy and distribute verbatim copies of the Program s source code as you receive it in any medium provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty keep intact all the notices that refer to this License and to the absence of any warranty and give any other recipients of the Program a copy of this License along with the Program You may charge a fee for the physical act of transferring a copy and you may at your option offer warranty protection in exchange for a fee 2 You may modify your copy or copies of the Program or any portion of it thus forming a work based on the Program and copy and distribute such modifications or work under the terms of Section 1 above provided that you also meet all of these conditions a You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change b You must cause any work that you distribute or publish that in whole or in part contains or is derived from the Program or any part thereof to be licensed as a whole at no charge to all third parties under the terms of this License 43 c If the modified program normally reads commands interactively when run you must cause it when started running for such interactive use in t
67. titles Indexing Extra Song Titles To add a regular index entry typeset in italics to the title index es use ititle title in the Nbeginsong line instead Like index key vals ititle can be used multiple times to produce multiple additional index entries You can also create index entries by saying indexentry indexes lyrics which creates an entry like or indextitleentry indezes title which creates an entry like These two macros can be used anywhere between the song s and lines and can be used multiple times to produce multiple entries If specified indexes is a comma separated list of the identifiers of indexes to which the entry should be added Otherwise the new entry is added to all of the title indexes for the current songs environment 18 ch mch 7 10 Chords in Ligatures This subsection covers an advanced topic and can probably be skipped by those creating song books for non professional use TheN macro is the normal means by which chords should be inserted into a song however a special case occurs when a chord falls within a ligature Ligatures are combinations of letters or symbols that TEX normally typesets as a single font character so as to produce cleaner looking output The only ligatures in English are ff fi fl ffi and ffl Other languages have additional ligatures like and Notice that in each of these cases the letters are squished together to form a
68. with full justification 459 newcommand SB boxup 1 460 setbox SB box hbox notefont 1 461 SB dimen wd SB box 462 advance SB dimen6 po 463 advance SB dimen leftskip 464 advance SB dimen rightskip 465 NifdimMSBOdimen hsizef 466 vbox 467 advance hsize 6 p0 468 advance hsize leftskip 94 Ntextnote musicnote echo SB echo SB echo 469 advance hsize rightskip 470 notejustify 471 unhbox SB box par 472 kern zo 473 In 474 else 475 vbox box SB box kern zO 476 fih 477 Y Create a textual note for singers and musicians If the note begins a verse or chorus it should not be preceded by any spacing Verses and choruses begin with the sentinel penalty 12345 so we check lastpenalty to identify this case When typesetting the note we must be sure to temporarily clear everypar to inhibit any verse numbering that might be pending We also readjust the baselineskip as if we weren t doing chords since no chords go above a textual note 478 newcommand textnote 1 7 479 ifhmode par fi 480 ifnum lastpenalty 12345 else 481 MifSBOinverse 482 vskip2 p relax 483 else ifSB inchorus 484 vskip2 p relax 485 else ifSB stanza 486 nobreak vskip versesep 487 fi fi fih 488 Mi 489 begingroup 490 everypar 491 if chorded chordedfalse SB setbaselineskip chordedtrue fi 492 placenote SB colorbox notebgcolor SB boxup 1
69. write SB txtout thesongnum songtitle nexttitle foreachtitle immediate write SB txtout songtitle ifx songauthors empty else immediate write SB txtout songauthors Md ifx SBO rawrefs Gempty else immediate write SBOtxtout SB rawrefs Mid immediate write SBO txtout SB doEOLfalse Nobeylines renewcommand SB endsong SB doEOLtrue immediate write SB txtout songcopyright spaceh songlicense SB printEOL endgroup SB insongfalse stepcounter songnum def SB parsesrefs 1 def songrefs 1 long def beginverse 1 2 endverse SB doEOLtrue begingroup def textnote 1 1 def SB temp 1 def SB star MifxNSBOtempNSBOstar immediate write SB txtout gobble 2 7 else immediate write SB txtout 2 Mid endgroup SB doE0Lfalse 162 3677 long def beginchorus 1 endchorus 3678 SB doEOLtrue begingroup 3679 def textnote 1 1 7 3680 immediate write SBOtxtout Chorus 1 3681 endgroup SB doEULfalse 3682 long def beginscripture 1 endscripture 3683 def musicnote 1 3684 def textnote 1 3685 SB doEOLtrue 3686 immediate write SBOtxtout 1 SB printEOL 3687 SB doEOLfalse 3688 def brk 3689 def rep 1 x 1 3690 def echo 1 1 3691 def mbar 1 2 3692 def lrep 3693 def rrep 3694 def nolyrics 3695 renewcommand memorize 1 3696 renewcommand replay 1 3697 fi 16 19 Codeline
70. 0 else 231 SB errbvt beginsong Unknown Song 232 Mif 233 ifrepchorus ifvoid SB chorusbox else 234 NSBOgotchorustruej 235 ifSB prevverse ifvnumbered 236 marks SB cmarkclass SB cmark 237 MEN 288 fi fi 239 SB inversetrue 240 def SB closeall endverse endsong 241 NSBOstanzabreak 242 NversemarkNMnobreak 243 global SB stanzatrue 244 SB ifempty SB cr memorize replay 245 NsetboxNSBObox box MbgroupNbegingroup 246 NMifvnumbered 88 271 272 protected edef currentlabel p versenum theversenum def SB everypar setbox SB box hbox printversenum theversenum 337 ifdim wd SB box lt versenumwidth setbox SB box hbox to versenumwidth unhbox SB box hfil 7 M if chorded vrule Cheight baselineskip width z depth z fiZ placeversenum SB box gdef SB everypar n else def SB everypar if chorded vrule GCheight baselineskip width z depth z fiZ gdef SB everypar n M everypar SB everypar everypar NversefontNversejustify NSBOloadactives NSBOobeylines penalty12345 everyverse relax SB endverse End a verse This involves unboxing the verse material with SB putbox which corrects for last lines that are unusually shallow 274 275 276 283 284 285 286 287 288 273 newcommand SB endverse MifSBOinsong ifSB inverse unpenalty endgroup egroup SB putbox unvbox SB box SB inversefalse def SB closeall1 e
71. 04 ifx empty 1 3605 vbox 3606 kern3 po 3607 hbox kern3 p0 2 kern3 pe 3608 kern3 po 3609 3 3610 else 3611 colorbox 1 2 3612 Mid 3613 3614 else 3615 newcommand SB colorbox 2 vbox 3616 kern3 po 3617 hbox kern3 p0 2 kern3 pe 3618 kern3 po 3619 3620 fi 16 18 Rawtext Mode If generating raw text most of what has been defined previously is ignored in favor of some very specialized macros that write all the song lyrics to a text file 3621 ifrawtext 3622 newwrite SB txtout 3623 immediate openout SBOtxtout jobname txt 3624 newif ifSB doEOL 3625 Ncatcode NV M12 3626 catcode J12 161 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 364 364 364 364 364 364 364 364 364 364 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 o NankRWwWNEH OO gdef SB printEOL ifSB doEOL M J fi catcode 12 gdef SB hash catcode amp 12 gdef SB amp amp renewcommand SB beginsong begingroup def def def v def u def def 7 def def H def def def t 7 def copyright c let space let par SB printEOL7 Met MASBOhash Met NE NSBOamp catcode 9 catcode 9 7 Ncatcode 9 7 def 1 37 resettitles immediate
72. 1 SB ptmain Once we ve reached a non space token in the title we consume the remainder of the title as is except that space tokens should be trimmed from the end of each title 982 newcommand SB ptmain 983 ifcat noexpand SB next noexpand sptoken 984 let SB donext SB ptsp 985 else ifcat noexpand SB next noexpand bgroup 986 let SB donext SB ptbe 987 else ifx SB next SB endparsey 988 global SB titlelist expandafter the SB titlelist 989 let SB donext gobble 990 else 991 ifx SB next 992 SB toks 993 let SB dothis SB pthead 994 ML 995 MletNSBOdonextNSBOptstep 996 fi fi fi 997 NSBOdonext 998 SB ptstep Consume a non space non left brace token and add it to the current song title If any spaces preceded it add those too 999 NnewcommandNSBOpt step 1 7 1000 NglobalWMSBOtitlelistNexpandafterVexpandafterNexpandafteri 1001 expandafter the expandafter SB titlelist the SB toks 1 1002 SB toks 1003 SB ptstart 1004 sB ptbg The next title token is a left brace It should be balanced so consume the entire group and add it along with its surrounding braces as is to the current title 1005 newcommand SB ptbg 1 SB ptstep 1 80 SB ptsp The next title token is a space We won t know whether to include it in the title until we see what follows it Strings of spaces followed by the title delimiter token or that conclude a title argument should be strippe
73. 20 advance SB dimeniii SB dimeniv 21 MR 22 else 23 advance SB dimeniii SB dimeniv 24 fi 25 ifdim SB dimeniv gt 2 p repeatyZ 26 setbox SB box box voidbOx 27 setbox SB boxii box voidb x Finally typeset the results based on the quantities computed above 28 SB multiline relax 29 Create a paragraph containing text X Y where X is the content of SB temp Y is the content of SB tempii and Y is restricted to width SB dimen but may span multiple lines of that width Dimen register SB dimenii must be set with the expected width of the final line of X The first argument contains any parameter definitions that should be in effect when X is processed Note that the expansion of SB tempii which may contain SB idxitemsep depends on SB dimen Therefore the redefinition of SB dimen at the start of this macro must not be removed 30 newcommand SB multiline 1 31 begingroup 32 SB dimen SB dimen 33 advance SB dimen hsizey 34 SB dimenii SB dimeniiZ 35 advance SB dimenii SB dimen 147 SB idxitemsep idxblock idxentry idxaltentry SB lgidx SB smidx 3136 1 hskip 5cm relax SB temp unskip nobreak 3137 SB maxmin SB dimenii lt 1 5em 3138 leftskip 5cm rightskip2em plus1fil7 3139 interlinepenalty OM 3140 leaders hbox to 5em hss hss hskip SB dimenii plus1fi117 3141 nobreak SB tempii kern 2em 3142 par global SB cnt badness 3143 Nendgroup A 3144
74. 2275 NSBOchnorm 2276 N aN Fi MEM iNEi Mi Mi 2277 119 SB chnorm SB chtrymacro SB chother First check to see if the lyric token is a letter Since that s the most common case we do this check first for speed 2278 newcommand SB chnorm 2279 ifcat noexpand SB next A 2280 SB testtrue SB lettertests 2281 MifSBOtest 2282 NSBOchespaceM etNSBOdonextNSBOchstep 2283 else 2284 let SB donext SB chdone 2285 M s 2286 else 2287 SB chtrymacro 2288 fi 2289 Next check to see if it s a macro or active character We do these checks next because these are the only cases when the token might be Nouter Once we eliminate that ugly possibility we can write the rest of the code without having to worry about putting SB next in places where outer tokens are illegal 2290 newcommand SB chtrymacro 7 2291 ifcat noexpand SB next relax 2292 SB chmacro 2293 else 2294 SB chother 2295 fik 2296 The token is not a letter macro or active character The only other cases of interest are spaces braces and hyphens If it s one of those take the appropriate action otherwise end the lyric here Since we ve eliminated the possibility of macros and active characters we can be sure that the token isn t outer at this point 2297 newcommand SB chother 2298 ifcat noexpand SB next noexpand sptoken 2299 SB chexpspace 2300 else ifcat noexpand SB next noexpand bgroup 2
75. 2957 3011 3068 3072 3082 3084 3086 3252 3255 3259 3349 3350 SB topempty 2718 2766 2855 2718 2766 2718 2766 1851 1854 1870 SB trackch 2643 SB trackchfalse 2669 2676 SB trackchtrue 2659 SB transposefactor 778 1714 1761 1762 1765 1774 1783 1795 1846 1885 1888 2795 SB trend 1813 1882 2061 2753 1821 1883 2683 2756 3006 NSBOtopO XNSBOtopX SB tracc 1802 1836 1939 SB trgroup 1808 1820 SB trmain 1801 1806 1906 SB trnote 1832 1843 SB trnotestep Mv 1845 1861 SB trscan 1802 1805 1822 1825 1828 1864 1907 SB trskip 1811 1814 1824 SB trspace 1824 SB trstep 1816 1827 SB trtrans 1848 1857 1867 1870 1871 SB two 2092 SB txtout 3622 3623 3644 3646 3648 3651 3653 3659 3672 3674 3680 3686 SB uncombine 2960 SB updatepage 309 329 407 SBOUTFtest 2092 2120 2351 SBO UTFtester 2092 SB Warn 3365 3388 SB warnre 250 269 3387 SB wordendsfalse 2516 SB wordendstrue 2516 sbarheight 103 145 368 369 531 532 664 675 677 810 811 831 834 1548 1549 1554 1558 scantokens 1511 scitehere 1611 1617 scleardpage 690 sclearpage 687 scripindent 1654 scripoutdent 1654 scripture environment UN HE 1594 scripturefont 43 1604 scriptureoff 139 232 scriptureon 232
76. 301 SB chespace let SB donext SB chbgroup 2302 else ifcat noexpand SB next noexpand egroup 2303 NSBOchespaceM et NSBOdonextNSBOchegroup 2304 NelseMifxNVSBOnext 2305 SB numhyps ne relax 2306 SB lyricnohyp expandafter the SB lyric 2307 let SB dothis SB chhyph 2308 SB chespace let SB donext SB chstep 2309 else ifcat noexpand SB next 2310 SB testtrue SB othertestsh 2311 ifSB test 2312 SB chespace let SB donext SB chstep 2313 else 120 SB chmacro SB chgetname SB chmacro 2314 let SB donext SB chdone 2315 Mi 2316 else 2317 NSBOchespaceM etNSBOdonextNSBOchstep 2318 fi fi fi fi fi 2319 The lyric scanner has encountered a macro or active character If it s outer it should never be used in an argument so stop here 2320 newcommand SB chmacro 2321 MSBOtestfalse 2322 expandafter SB outertest expandafter meaning SBOnext 2323 ifSB test 2324 let SB donext SB chdone 2325 else 2326 let SB donext SB chgetname 2327 fik 2328 We ve encountered a non outer macro or active character Use string to get its name but insert the token back into the input stream since we haven t decided whether to consume it yet 2329 newcommand SB chgetname 1 7 2330 edef SB nextname string 1 2331 SB chmacro SB donext 1 2332 The lyric scanner has encountered a non outer macro or active character Its stringified name has been stored in SB n
77. 4 SB chorustopfalse 1448 SB chorustoptrue 1322 SB chother 2294 2297 SB chothermac oes inea 2352 2358 SB chscan 2239 2250 2372 2383 2426 2437 SB chspcdone 2417 2481 SB chstart 2238 2255 SB chstep 2265 2267 2269 2282 2308 2312 2317 2365 2370 2392 2415 2432 SB chstepfour IOCIS PRSE 2355 2370 SB chstepthree 2354 2370 SB chsteptwo 2353 2370 2287 2290 SB clearbskeys 734 755 SB cleardpage 516 590 691 SB clearlig 2502 2539 2554 2562 SB clearpage 240 507 517 539 589 610 688 SB closeall 727 749 750 752 844 1240 1280 1321 1361 1541 1542 1545 1568 1572 1573 1576 1590 1599 SB cmark 636 645 1236 1306 SB cmarkclass 635 644 800 1236 1292 1341 1433 SB cnt 24 238 239 242 378 385 387 392 405 414 416 435 436 438 458 459 4173 475 477 478 480 481 484 511 513 1177 1180 1762 1765 1847 1850 1853 1856 1866 1872 1881 1885 1887 1892 1898 1911 2109 2111 2113 2115 2121 2352 2361 2362 2553 2559 2572 2754 2760 2785 2845 2850 2851 2873 2874 2876 3115 3142 3253 3254 3257 3265 3287 3292 3293 3298 SB cntii 24 411 412 420 421 425 426 430 431 434 443 446 448 455 457 463 472 2874 2876 SB colbox 291 292 351 360 364 365 377 379 380 509 526 SB colnum 289 338 351 352 357 411 436 459 472 473 480 512 SB colon 1633 1634 1635
78. 4 Song thesongnum space might be missing ah 3395 n protect endsong space line 3396 3397 newcommand SB errbor 3398 SB Error Encountered protect beginsong space without seein 3399 g an protect endscripture space for the preceding scriptur 3400 e quotation A scripture quotation appearing after son 3401 g thesongnum space might be missing a 3402 n protect endscripture space line 3403 3404 NnewcommandNSBOerreov1i 3405 SB Error Encountered protect endsong space without seein 3406 g an protect endverse space for the preceding verse Son 3407 g thesongnum space has a protect beginverse space 3408 line with no matching protect endverse space line 3409 3410 newcommand SB erreoc 3411 SB Error Encountered protect endsong space without seein 3412 g an protect endchorus space for the preceding chorus Son 3413 g thesongnum space has a protect beginchorus space 3414 line with no matching protect endchorus space line 3415 155 SB erreor SB erreot SB errbvv SB errbvc SB errbvt SB errevc 3416 newcommand SB erreor 3417 SB Error Encountered protect endsong space without seein 3418 g an protect endscripture for the preceding scripture quot 3419 e A scripture quote appearing before song thesongnum space 3420 ended with protect endsong space instead of wit 3421 h protect endscripture 3422 3423 newcommand SB erreot 3424 SB Error Encount
79. 431 1483 1497 1949 2508 ifSB insong 722 749 793 1227 1274 1314 1356 1428 1541 1568 1572 1590 ifSB intersong 722 750 844 1542 1553 1573 1579 1610 1618 1636 1649 1655 ifSB inverse 149 217 228 722 794 1131 1228 1275 1315 1374 1481 1495 1948 2508 ifSB measurespec 169 183 197 ifSB needkey 1759 1888 ifSB nohat 2074 2692 ifSB omitscrip 1561 1581 3581 8 3599 if SB pdf ifSB preamble 16 141 188 202 240 ifSB prefshrps 1758 1891 ifSB prevverse 799 1132 1134 1202 1235 1327 ifSB songsenv 257 722 2904 ifSB stanza 1126 1129 1485 1499 ifSB test 18 510 2281 2311 2323 2364 2381 2456 2516 2537 ifSB trackch 2057 2074 2643 ifSB wordends 2040 2522 2565 ifsepindexes 3195 3227 3240 3581 ifslides 38 856 876 888 3581 ifsongindexes 2963 3178 3581 iftranscapos 1769 3581 ifvnumbered 799 1201 1235 1246 1281 includeonlysongs 3 255 3376 3377 745 3015 163 166 166 indexentry indexesoff indexeson indexsongsas indextitleentry M 746 3023 input 2968 3208 3249 interlinepenalty 2x 105 1177 1178 1180 1189 1190 3139 intersong environment 1540 vxo ee eg 1212 1207 1208 1206 item itemindent itemsep 2202 jobname 2937 2968 3623 justifycenter 136 138 153 justifyleft 51 52 147 L NEA ieee mV AE 2199 M yz eo Sh e 2198 LARGE 70 117 2893 2901 ALarge dc o dose 38
80. 6 let SB ch SB ch off 56 showmeasures nomeasures Mneasureson measuresoff SB measureson SB measuresoff transposecapos noscripture scriptureon scriptureoff 197 NMifSBOmeasurespec 198 NMifmeasuresMSBOmeasuresonNVelseMSBOmeasuresoffMfi 199 else 200 SB measuresoff 201 fi 202 ifSB preamble let colbotglue z skip fi 203 SB setbaselineskip 204 Default showmeasures if chorded nomeasures otherwise Determines whether measure bars and meter notes should be shown Option can be set in the usepackage line or toggled elsewhere with the measureson and measuresoff macros 205 DeclareOption showmeasures measureson 206 DeclareOption nomeasures measuresoff 207 newcommand measureson SB measurespectrue SB measureson 208 newcommand measuresoff SB measurespectrue SB measuresoff 209 newcommand SB measureson 210 measurestrue 211 let SB mbar SB makembar 212 ifchorded 213 let SB mch SBOmch ony 214 else 215 let SBO mch SBOmch m 216 Mi 217 ifSB inverse SB loadactives fi4 218 ifSB inchorus SB loadactives fi4 219 220 newcommand SB measuresoff 221 measuresfalse 222 let SBOmbar gobbletwo 223 ifchorded 224 let SB mch SB ch on 225 else 226 let SB mch SBOch of f 227 Mif 228 NifSBOinverseMSBOloadactivesNMfi 229 NifSBOinchorus M SBOloadactivesMfi 230 Default off If set the Ncapo macro transposes the song instead of printing a note t
81. 64 1665 2050 2210 2213 2215 2629 2632 2638 2639 MAE ane sees 2193 Nae ubBRPR RM 2192 Nafterpreludeskip visse Vida 82 825 Nalphascale 1755 arabic 66 69 AtBeginDocument 283 AtEndDocument 2974 authbyword 3031 authignoreword 3031 authsepword 3031 B ND aed cadena ts 2189 badness 1408 1414 1420 3142 baselineadj 86 862 baselineskip 54 89 90 850 853 854 857 860 862 947 1256 1262 1345 1605 1606 1983 2018 2025 2033 3159 Bcolon 1633 beforepostludeskip 82 673 828 beginchorus 1312 3413 3450 3472 3479 3481 3485 3487 3498 3500 3541 3563 3677 beginscripture 1594 1638 1650 1656 3527 3529 3534 3682 beginsong 747 1231 1318 3392 3398 3425 3427 3443 3463 3486 3506 beginverse 1214 3407 3430 3436 3442 3444 3455 3457 3475 3493 3540 3562 3666 bfseries 70 117 121 123 951 2893 2901 break 356 384 391 398 597 598 3274 NDEE Aas 1427 3688 brkpenalty 106 1434 1442 1447 1452 c page 424 437 518 602 c section 818 2984 NCapO Lu ev bs 1768 catcode 1065 1068 1075 1664 1665 2050 2051 2210 2213 2215 2362 2629 2632 2638 2639 2790 2967 3051 3625 3626 3628 3629 3639 3641 Ncbarwidth 101 144 1182 1381 1382 1387 1396 1432 ccpenalty 106 278 1134 Ncentering 154 897 2893 2901 Nch 2260
82. 65 2566 2567 2568 2569 2570 2571 2572 2573 2574 if SB wordendsy ifdim wd SB lyricbox gt z else nobreak fi4 else penalty ifnum SB numhyps gt z exhyphenpenalty else ifSB brokenword hyphenpenalty else M fi fi spacefactor SB cnt ML Finally end the macro with some code that handles the special case that this chord is immediately followed by a chord over ligature macro The code above 128 SB accidental sharpsymbol flatsymbol shrp Mt DeclareFlatSize sets SB temp to the portion of the ligature that should come after this chord but before the chord that tops the ligature This text must be inserted here 2575 SB temp 2576 Typeset an accidental symbol as a superscript within a chord Since chord names are often in italics but math symbols like sharp and flat are not we need to do some kerning adjustments before and after the accidental to position it as if it were italicized The pre adjustment is just a simple italic correction using The post adjustment is based on the current font s slant per point metric 2577 newcommand SB accidental 1 2578 MA 2579 m th 1 2580 SB dimen fontdimen ne font 2581 NadvanceMSBOdimen 088142NpQ 2582 ifdim SB dimen lt ze 2583 kern f size SBO dimeny 2584 Mif 2585 3 When changing the sharp or flat symbol change these macros rather than changing shrp or flt This will ensure that other shortcuts like and amp will
83. 867 877 880 1137 1486 1500 vfuzz 406 630 1405 1958 3214 3266 3287 vnumbered 1201 vnumberedfalse 1218 1223 1323 vnumberedtrue 1215 1224 vrule 834 1256 1262 1345 1396 1558 2005 2027 2029 2036 2038 2701 2713 2729 175 SMe Su M 356 vsplit 305 632 643 652 1960 3168 3216 vvpenalty 106 277 279 280 1132 vsize write 2939 2957 3042 3644 3646 3648 3651 3653 3659 3672 3674 3680 3686
84. 9 fi 400 f i 401 This is the entrypoint to the song positioning algorithm It gets defined by songpos to either SB selectcol below or relax when song positioning is turned off 402 newcommand SB selectcol Songs should be squeezed in wherever they fit but breaking a column or page within a song should be avoided The following macro outputs zero or more column breaks to select a good place for SB songbox to be contributed to the current or the next page The number of column breaks is determined by temporarily setting SB updatepage to SB droppage and then calling the SB mkpage algorithm under various conditions to see how many columns it would contribute if we start the current song at various positions 403 newcommand SB selectcol 404 begingroup 405 SB cnt z 406 vbadness OM vfuzz maxdimen 407 let SBOQupdat epage SB droppage 408 SB dimen textheight7 409 ifinner else advance SB dimen pagetotal fi 410 setbox SB boxii vbox SB putboxes unvcopy 63 SB spbegnew SB spextold SB spextnew SB spdblpg 411 SB cntii SB colnumy 412 SB mkpage SB boxii SB cntii SB dimen 413 SB spos 414 global SB cnt SB cnt 415 endgroup 416 SB nextcol SB cnt colbotglue 417 Begin a trial typesetting of the current song on a fresh page to see if it fits within a page 418 newcommand SB spbegnew 419 setbox SB boxiii copy SB songbox 420 SB cntii zes 421 SB mkpage
85. A C m B7 Did we in our own strength confide E7 A Our striving would be los ing C m B7 E Were not the right Man on our side D A E7 A The Man of God s own choosing B7sus4 B7 E Dost ask who that may be A E G F m Christ Jesus it is He B7 E Lord Sabaoth His Name m C From age to age the same D A E7 A And He must win the bat tle Public Domain Figure 1 Sample page from a chord book transposecapos noindexes indexeson indexesoff nopdf index noscripture scriptureon scriptureoff noshading includeonlysongs Transposition The transposecapos option changes the effect of the macro Normally using Ncapot n within a song environment produces a tex tual note in chord books that suggests the use of a guitar capo on fret n How ever when the transposecapos option is active these textual notes are omitted and instead the effect of capo n is the same as for transposef n That is chords between the macro and the end of the song are automatically transposed up by n half steps This can be useful for adapting a chord book for guitarists to one that can be used by pianists who don t have the luxury of capos See and for more information on the and macros Indexes The noindexes option suppresses the typesetting of any in document indexes Display of indexes can also be turned on or off using the indexeson and indexesoff macros The nopdfindex option suppresses the creation of t
86. BOendchorus 7 356 NifSBOinsong 357 ifSB inchorus 358 unpenalty 359 endgroup egroup 360 SB inchorusfalse 361 def SB closeall endsong 362 setbox SB box vbox 363 SB chorusbar SB box 364 SB put box unvbox SB box 365 366 ifrepchorus ifSB gotchorus else 367 global setbox SB chorusbox vbox 368 NunvboxNSBOchorusbox 369 Nunvcopy NSBObox 370 Ht 371 fi fi 372 unvbox SB box 373 SB prevversefalse 374 else ifSB inverse SB errecv endversey 375 else SB erreco fi fiZ 376 else 377 SB errect 378 fi 379 Increase leftskip to accommodate the chorus bar if any 380 newcommand SB cbarshift y 381 ifSB inchorus ifdim cbarwidth gt zoy 382 advance leftskip cbarwidth 383 advance leftskip5 p relax 384 fi fiz 385 Create the vertical bar that goes to the left of a chorus Rather than boxing up the chorus in order to put the bar to the left the bar is introduced as leaders directly into the vertical list of the main song box This allows it to stretch and shrink when a column is typeset by the page builder 1386 newcommand SB chorusbar 1 1387 ifdim cbarwidth gt zo 1388 SB dimen ht 17 1389 SB dimenii dp 1 1390 advance SB dimen 1391 ifSB chorustop if chorded else2 fi fi SB dimenii7 92 392 NSBOskipNSBOdimenNrelax 393 SB computess SB skip1 plus 1 394 SB computess SB skip 1 minus 1 395 nointerlineskip nul1 nobreak 396 l
87. Char aa 95 DeclareLyricChar AA 96 DeclareLyricChar o 97 DeclareLyricChar 0 98 NDeclareLyricCharMl 99 DeclareLyricChar L 00 DeclareLyricChar ss 01 DeclareLyricChar i 02 DeclareLyricChar j 03 DeclareLyricChar 04 DeclareLyricChar 05 DeclareLyricChar discretionary We declare par to be lyric ending without introducing hyphenation The par macro doesn t actually appear in most verses because we use obeylines but we include a check for it in case the user says par explicitly somewhere 06 DeclareNoHyphen par SB bracket This macro gets invoked by the macro whenever a chord begins It gets rede 22 fined by code that turns chords on and off so its initial definition doesn t matter 07 newcommand SB bracket SB chord Begin parsing a chord macro While parsing the chord name argument we set SB begincname SB endcname 22 22 22 22 22 22 22 22 22 22 22 some special catcodes so that chord names can use and amp for sharps and flats 08 newcommand SB chord SB begincname SB chord While parsing a chord name certain characters such as and amp are temporarily set active so that they can be used as abbreviations for sharps and flats To accomplish this SB begincname must always be invoked before any macro whose argument is a chord name and SB endcname must be invoked at the start of the body of any macro whose argument is a chord name To aid in debugging we also temporarily set retu
88. For example to cause the word T to be moved to the end of title index entries one could say titleprefixword I 35 Nauthsepword authbyword authignoreword songmark versemark chorusmark The first use of titleprefixword overrides the defaults so if you also want to continue to move The and A to the end of entries you must also say titleprefixword The and titleprefixword A explicitly This macro may only be used in the document preamble but may be used multiple times to declare multiple prefix words Special Words In Song Info When parsing author index entries the word and is recognized by the songidx program as a conjunctive that separates au thor names To override this default and specify a different conjunctive use the authsepword macro one or more times in the document preamble For example to instead treat und as a conjunctive you could say authsepword und The first use of authsepword and each of the following macros overrides the default so if you also want to continue to treat and as a conjunctive you must also say authsepword and explicitly The authsepword macro and each of the following macros may only be used in the document preamble but may be used multiple times to declare multiple special words When parsing author index entries the word by is recognized as a keyword signaling that the index entry should only include material in the current list
89. Index Numbers underlined refer to the code line where the corresponding entry is defined numbers in roman refer to the code lines where the entry is used Symbols onlypreamble 2943 Nt Ape sean oes 2179 3633 2945 2947 3056 3059 NE ras 2586 3637 par 1173 Ne Codice eua 2967 3051 sanitize 1505 b EE 3638 seccntformat NPP UA Rene dns 2177 3632 2888 2889 NG ane d obo le 1081 2892 2896 2897 2900 NTE DN Ede aue 2204 sptoken 974 983 Xi tese do vs 2182 3633 1047 1812 2298 2510 1702 1708 2203 2578 startsection NU Sin eae eens 1081 los 2890 2898 NS ul 3ImMS 2181 3632 viiipt 2596 2597 centercr 1204 viipt 2595 2596 2724 cnp ond e sd vipt 2594 2595 2745 ushglue 59 lU ds Sei aio EN evpt it Pe foe as 2593 684 685 776 809 1602 xiipt 2600 2601 2741 ifnextchar 756 759 xipt 2993372000 2654 2665 3015 3024 xivpt 2601 2602 NQifstar s sna xviipt 2602 2603 684 688 691 1223 NOxxpt 2603 2604 ixpt 2597 2598 xxvpt 2604 2216 2256 2469 2470 2477 2478 2616 2623 2640 3642 695 697 779 965 967 988 991 1204 2075 2650 2662 3084 3207 3247 Ne ese domes 2178 2210 2215 3625 3626 3632 Wy nae es 2176 3632 MEN ACE 2180 3633 Nite ake EE 71 116 2346 A NER cis Sem efe 2195 Naat elip dudes tage 2194 Acolon 1633 NXactive cii 1065 1068 1075 16
90. O dimen hfil box SB box hfil Yh nointerlineskip hbox to SBO dimen hfil MooxNSBOboxii hfil Yh nointerlineskip hbox to SBO dimen hfil vrule width 5 p height SB dimenii hfil F 110 2008 4 2009 mbar The mbar macro invokes SB mbar which gets redefined by macros and options that turn measure bars on and off 2010 newcommand mbar SB mbar measurebar Make a measure bar using the most recently defined meter Then set the meter to nothing so that the next measure bar will not display any meter unless the meter changes 2011 newcommand measurebar 2012 MnbarNSBOmetertopNSBOmeterbot 2013 Mneter HA 2014 SB repcolon Create the colon that preceeds or follows a repeat sign 2015 newcommand SB repcolon 2016 usefont 0Ti cmss m n selectfont 2017 ifchorded 2018 baselineskip 5 SB dimen 2019 vbox hbox hbox kern 5 p 2020 else 2021 raise 5 p hbox 2022 fi 2023 lrep Create a begin repeat sign 2024 newcommand lrep 7 2025 SB dimen baselineskip 2026 advance SB dimen 2 p0 2027 vrule width1 5 p height SB dimen depth po 2028 Nkerni 5NpQ7 2029 vrule width 5 p Cheight SB dimen depth pO 2030 SB repcolon 2031 rrep Create an end repeat sign 2032 newcommand rrep 2033 SB dimen baselineskip 2034 advance SB dimen 2 p0 2035 SB repcolon 2036 vrule width 5 p Cheight SB dimen depth pO
91. RE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU SHOULD THE PROGRAM PROVE DEFECTIVE YOU ASSUME THE COST OF ALL NECESSARY SERVICING REPAIR OR CORRECTION IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRIT ING WILL ANY COPYRIGHT HOLDER OR ANY OTHER PARTY WHO MAY MODIFY AND OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE BE LIABLE TO YOU FOR DAMAGES INCLUDING ANY GENERAL SPECIAL INCIDENTAL OR CONSEQUEN TIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INAC CURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 46 ifSB etex ifSB pdf 16 Implementation The following provides the verbatim implementation of the songs PTFX package along with commentary on how it works In general macro names that contain a symbol are not intended to be directly accessible by the outside world they are for purely internal use All other macros are intended to be used or redefined by document authors Most of the macros likely to be of real interest to song book authors can be found in To find the implementation of any particular macro the index at the end of this document should prove helpful The unwary TgXer may wonder at the rather large size of the implementa tion The volume
92. SB boxiii SB cntii textheight 422 Tentatively extend the song previously typeset on the current even page to the next odd page to see if it fits on a double page If the current page is odd numbered do nothing since extending the song to the next page would introduce a page turn 423 newcommand SB spextold 424 ifodd c page else 425 SB cntii z 426 SB mkpage SB boxii SB cntii textheight 427 fih 428 Extend the trial typesetting started with SB spbegnew to a second page to see if the song fits on a fresh double page 429 newcommand SB spextnew 430 NSBOcntiiVzQ 431 NSBOmkpageNVSBOboxiiiNSBOcntiiNtextheight 432 Compute the number of column breaks required to shift the current song to the next double page if the result of the last test run fits within its page as indicated by counter SB cntii Otherwise leave the requested number of column breaks set to zero 433 newcommand SB spdblpg 434 ifnum SB cntii lt SB numcols 435 NSBOcntNSBOnumcols7 436 advance SB cnt SB colnum 437 if twoside ifodd c page else 438 advance SB cnt SB numcols 439 fi fiz 440 f ih 441 64 SB sposi SB sposii SB sposiii This is the level 1 song positioning algorithm It moves songs to the next double page only if doing so would avoid a page turn that would otherwise appear within the song 442 newcommand SB sposi 443 ifnum SB cntii lt SB numcols else if twoside 444 SB spe
93. SB displayindex 3177 3318 3353 3363 SB doEOLfalse 3654 3676 3681 3687 SB doEOLtrue 3658 3667 3678 3685 SB dolq 1663 SB donext 958 984 986 989 995 997 1048 1050 1052 1054 1056 1058 1060 1099 1104 1115 1808 1811 1814 1816 1818 1828 1837 1841 1845 1848 1851 1854 1857 1859 2245 2246 2254 2257 2259 2261 2263 2265 2267 2269 2282 2284 2301 2303 2308 2312 2314 2317 2324 2326 2331 2335 2337 2343 2345 2353 2355 2365 2367 2392 2394 2397 2398 2414 2415 2419 2420 2430 2432 2684 2687 2690 SB dorq 1663 SB dothis 958 968 972 978 993 1801 1805 1832 1906 2238 2254 2274 2307 SB dotranspose 1776 1784 1789 1799 SB droppage 345 407 SB echo 1504 SB ellipspread 3064 3311 3315 3347 3359 SB emitchord 2490 2495 2507 SB emptylist 693 SB endchorus 1312 1355 SB endcname 2209 2227 2615 2622 2788 SB endparse 969 987 1011 1034 1053 SB endscripture ticus 1594 1609 SB endsong tuere as 747 792 3657 SB endverse 1216 1219 1273 SB errbcc 1316 3478 SB errbct 1318 3484 SB errbcv 1315 3471 SB errboo 749 3391 SB errbor 750 3397 SB errbro 1541 1572 3508 SB errbrr 1542 1573 3514 SB errbvc 1229 3435 SB errbvt 1231 3441 SB errbvv 1228 3429 SB errchord 2508 3537 SB errdup 2651 3553
94. SB numcols gt z hsize SB colwidth fi7 8 ifdim sbarheight gt z 7 9 hrule height sbarheight width hsize 550 nobreak 551 ML 552 H 553 ifSB intersong 554 ifdim sbarheight gt z 555 ifhmode par fiz 556 SB skip lastskip 557 unskip nobreak vskip SB skip 558 hbox vrule height sbarheight width hsize 559 ML 97 SB srbox scripture beginscripture 565 566 567 568 569 570 endgroup egroup MifSBOomitscrip setbox SB songbox box voidb x else SB submitsongh ML SB intersongfalse else ifSB insong SB errero SB closeall else SB errert fi ML The starred form contributes page spanning vertical material directly to the top of the nearest fresh page 571 newenvironment intersong 572 NMifSBOinsongNSBOerrbroNSBOcloseallMf if 573 NifSBOintersongNSBOerrbrrNSBOcloseallMf if 574 NsetboxMSBOchorusbox box voidbOx 575 SB intersongtrue 576 def SB closeall end intersong 577 setbox SB songbox vbox bgroup begingroup 578 Hh 579 ifSB intersongh 580 endgroup egroup 581 ifSB omitscripy 582 setbox SB songbox box voidb x 583 else 584 def SB stype SB styppage 585 NSBOsubmitsong 586 def SB stype SB stypcol 587 M 588 SB intersongfalse 589 else 590 ifSB insong SB errero SB closeall else SB errert fis 591 fik 592 The following box register holds the citation information that is to be typeset at the end of a scripture quot
95. SB temp 1 145 SB balancerows 3068 SBO toks 2 3069 setbox SB box hbox 3070 NSBOtemp 3071 leaders hbox to 5em hss hss hskip2em plus1fil 3072 the SB toks 3073 th 3074 ifdim wd SB box gt hsize 3075 SB balancerows 3076 else 3077 hbox to hsize unhbox SB box par 3078 fik 3079 endgroup 3080 Typeset an index entry of the form X Y that doesn t fit on one line where X is the content of macro SB temp and Y is the content of token register SB toks First we must pre compute the width w of the final line of X when X is typeset as a left justified paragraph storing it in SB dimenii This is necessary because in order to force TEX to typeset the first line of Y at some chosen width w2 we must insert leaders of width c w ws into the paragraph between X and Y where c is the column width Computing this width w4 is a bit tricky We must tell TEX that the last line of X must not be so long that it does not even have room for the first item of Y Thus we must strip off the first item of Y and add it or a non breaking space of equivalent width to the end of X to typeset the paragraph Then we use lastbox to pull off the final line and check its width 3081 newcommand SB balancerows 3082 edef SBGtempii the SB toks 3083 setbox SB box vbox 3084 SB toks expandafter expandafter the SB toks 3085 NSBOlopNSBOtoksNSBOtoks 3086 NsettowidthNSBOdimen NtheNSBOtoks
96. SB temp SBO two 2109 SB cnt tw 2110 else ifx SB temp SB three 2111 NSBOcntNthr0Q 2112 else ifx SB temp SBOfour 2113 SB cnt4 2114 else 2115 SB cnt zo 2116 fi fi f i 2117 When scanning the lyric text that follows a chord it is necessary to distinguish accents and other intra word macros which should be included in the under chord lyric text from other macros which should be pushed out away from the text The following macros allow users to declare a token to be lyric continuing or lyric ending 2118 newcommand SB declare 3 2119 afterassignment iffalse let SB next 3 relax fi 114 2120 NexpandafterNSBOUTFtestNexpandafter MneaningNSBOnext 2121 NifcaseNSBOcnt 2122 ifcat noexpand 3 relax 2123 SB addNtest SBOmacrotests 1 2 3 2124 else ifcat noexpand 3 7 2125 SB addDtest SBO othertests 1 2 3 2126 else ifcat noexpand 3A 2127 SB addDtest SB lettertests 1 2 3 2128 else 2129 SB addDtest relax0 2 3 2130 fi fi fiz 2131 or 2132 SB addNtest SBOmacrotests 1 2 3 2133 else 2134 SB addMtest SBOmultitests 1 2 3 2135 fik 2136 2137 newcommand DeclareLyricChar SB declare SB testtrue0 2138 newcommand DeclareNonLyric 7 2139 NSBOdeclareNSBOtestfalseNSBOtestfalse 2140 2141 newcommand DeclareNoHyphen 2142 NSBOdeclareNSBOtestfalseNSBOtesttrue 2143 SB lettertests For speed token tests introduced by DeclareLyricChar and friends are
97. The songs package Kevin W Hamlen March 17 2012 Abstract The songs package produces songbooks that contain lyrics and chords but not full sheet music It allows lyric books chord books overhead slides and digital projector slides to all be maintained and generated from a single IXTEX source document Automatic transposition guitar tablature diagrams handouts and a variety of specialized song indexes are supported 1 Introduction The songs IA3TEgX package produces books of songs that contain lyrics and op tionally chords A single source document yields a lyric book for singers a chord book for musicians and overhead or digital projector slides for corporate singing The software is especially well suited for churches and religious fellowships desiring to create their own books of worship songs Rather than purchasing a fixed hymnal of songs the songs package allows worship coordinators to maintain a constantly evolving repertoire of music to which they can add and remove songs over time As the book content changes the indexes spacing and other formatting details automatically adjust to stay consistent Songs can also be quickly selected and arranged for specific events or services through the use of scripture indexes automatic transposition and handout and slide set creation features 2 Terms of Use The songs package is free software you can redistribute it and or modify it under the terms of the GNU General Public
98. X treats as punctuation you can use the DeclareLyricChar macro to instruct the songs package to treat the symbol as non chord ending so that it is included under chords by default just like an alphabetic character DeclareLyricChar token Here token must be a single TEX macro control sequence active character letter something TEX assigns catcode 11 or punctuation symbol something TEX assigns catcode 12 For example by default Fmaj7 Fmaj7 s dag range produces s frange because dag is not recognized as an alphabetic symbol but if you first type 12 DeclareNonLyric DeclareNoHyphen MultiwordChords shrp flt DeclareLyricChar dag then instead you will get Fmaj7 Fmaj7 s dag range produces strange Likewise you can type DeclareNonLyric token to reverse the above effect and force a token to be lyric ending Such tokens are pushed out away from long chord names so that they never fall under a chord and hyphenation is added to the resulting gap To declare a token to be lyric ending but without the added hyphenation use DeclareNoHyphen token instead Such tokens are pushed out away from long chord names so that they never fall under the chord but hyphenation is not added to the resulting gap Extending Chords Over Adjacent Words The MultiwordChords macro forces multiple words to be squeezed under one chord by default Normally a long chord atop a short lyric pushes subsequent lyric
99. ace 683 newcommand nextcol 7 684 ifstar SB nextcol ne flushglue 685 ifpartiallist else SB nextcol ne flushglue fi 686 Move to the next page if the current page is nonempty 687 newcommand sclearpage 71 scleardpage SB lop SB lop SB emptylist SB ifempty SB titlelist SB titletail songtitle resettitles nexttitle 688 ifstar SB clearpage ifpartiallist else SB clearpage fi 689 Move to the next even numbered page if the current page is odd or nonempty 690 newcommand scleardpage 691 ifstar SB cleardpage ifpartiallist else SB cleardpage fi 692 16 5 Songs The following macros handle the parsing and formatting of the material that begins and ends each song The following macros were adapted from Donald Knuth s The TEXbook for ma nipulating lists of the form item1 item2 itemN 693 NnewcommandNSBOlop 1 NexpandafterNSBOOlopNthest 1NSBOOlopit1 694 newcommand SB lop 695 def SB lop 1 2 SBO lop 3 4 global 3 2 global 4 1 696 newcommand SB emptylist 697 def SB emptylist 698 newcommand SB ifempty 3 699 edef SB temp the 1 700 ifx SB temp SBGemptylist 2 else 3 fiz 701 These registers hold the full list of titles for the current song and the tail list of titles that has not yet been iterated over 702 newtoks SB titlelist 703 newtoks SB titletail The songtitle macro will initially hold the primary title
100. ak vskip2 p plus po nointerlineskip hbox vrule height sbarheight width hsize Mid n SB insongfalse edef SB sgroup thesongnum global SB groupcnt zo SB submitsongy ifnum SB grouplv1 z let SB sgroup Gempty fi stepcounter songnum else ifSB intersong SB erreor SB closeall else SB erreot fih M Set the Nbaselineskip to an appropriate line height 848 newcommand SB setbaselineskip 7 SB dimen f size p h baselineskip SB dimen relax ifchorded setbox SB box hbox printchord ABCDEFG shrp f1t j7 3 advance baselineskip ht SB box advance baselineskip2 p0 M ifslides advance baselineskip 2 SB dimen plus 5 SB dimen minus 2 SB dimen else advance baselineskip z plus 1 SB dimen relax M advance baselineskip baselineadj 76 SB setversesep Set the Nversesep to an appropriate amount if has not already been explicitly set by the user makeprelude 864 newcommand SB setversesep 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 SB dimen123456789sp edef SB temp the SB dimen 7 NedefNSBOtempii NtheNversesep MifxNSBOtempNSBOtempi iA begingroup Myricfont SB dimen f size po Mifchorded setbox SB box hbox printchord ABCDEFG shrp f1lt j7 advance SB dimen ht SB box Mid ifslides global versesep1 2 SB dimen plus 3 SB dimen minus 3 SB dimen else global vers
101. ame 1 Chord re 3551 play registers must be declared with protect newchords 3552 SB errdup 3553 newcommand SB errdup 1 3554 SB Error Duplicate definition of chord replay register 3555 1 protect newchords space was used to declare the sa 3556 me chord replay register twice 3557 159 SB errmbar 3558 newcommand SB errmbar 3559 SB Error Song thesongnum space seems to have measur 3560 e bars that appear outside of any verse or chorus All mea 3561 sure bars produced with protect mbar space or must ap 3562 pear between protect beginverse space an 3563 d protect endverse or between protect beginchorus spacef 3564 and protect endchorus 3565 SB errtab 3566 NnewcommandNSBOerrtabi 3567 SB Error Invalid argument to protect gtab space macro R 3568 eplacing it with protect 0 Valid arguments consist onl 3569 y of X 0 0 1 2 3 or 4 3 3570 SB errnoidx 3571 newcommand SB errnoidx 1 3572 SB Error Unknown index identifier 1 This index identifie 3573 r was never declared using protect newindex 3574 SB erridx 3575 newcommand SB erridx 1 3576 SB Error protect idxaltentry space not allowed in 1 index 3577 This error should not occur The index generation routines ha 3578 ve malfunctioned Try deleting all temporary files and then re 3579 compiling 3580 16 17 Option Processing ifchorded Reserve conditionals for all of the var
102. ame sbx 3250 unskip 32501 HA Next we split the box into columns and pages until the last page is reached 3252 SB toks SB makeidxcolumn 3253 SB cnt 1 relax 3254 loop ifnum SB cnt gt ne 3255 SB toks expandafter the SB toks 3256 kern columnsep SB makeidxcolumn 3257 advance SB cnt m ne 3258 repeat 3259 edef SB oneidxpage the SB toks 3260 unvbox SB idxtitlebox 3261 vskip 2in relax 3262 nointerlineskip 3263 null 3264 nointerlineskip 3265 SB cnt vbadness vbadness OM 3266 SB dimenii vfuzz vfuzz maxdimeny 3267 looph 3268 SB dimen textheight 3269 ifinner else kern z advance SB dimen pagetotal fiz 3270 global setbox SB boxii copy SB box 3271 global setbox SB boxiii hbox SB oneidxpage 3272 ifdim ht SB box gt ze 3273 box SB boxiiis 3274 vfil break 3275 repeat The final page of the index should have all equal height columns instead of a few full columns followed by some short or empty columns at the end To achieve this 151 we re typeset the final page trying different column heights until we find one that causes the material to span an equal percentage of all the columns on the page 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 SB dimenii ht SB boxiiZ divide SB dimenii 1 relax SB maxmin SB dimen gt SB dimenii Loop global setbox SB box copy SB boxiif global setbox SB boxiii hbox SB oneidxpage
103. an is possible with TpX s built in algorithm 792 newcommand SB endsong 793 ifSB insong 794 ifSB inverse SB erreov endverse fif 795 ifSB inchorus SB erreoc endchorus fif 796 global SB skip versesep 797 unskip 798 ifrepchorus ifvoid SB chorusbox else 799 ifSB prevverse ifvnumbered 800 marks SB cmarkclass SB lastcmark 801 fi fik 802 fi fizZ 803 endgroup egroup 804 setbox SB songbox vbox 805 Nsongmark 806 unvbox SB songwrites 807 ifnum SB numcols gt z hsize SB colwidth fifz 808 leftskip z skip rightskip z skip 809 parfillskip flushglue parskip z skip parindent zo 810 ifdim sbarheight gt z 811 hrule height sbarheight width hsize 812 nobreak vskip5 p 813 ML 814 NMifpdfindex Mbegingroup 815 ifx pdfbookmark undefined else 816 ifx pdfbookmark relax else 75 SB setbaselineskip 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 zg Toast oye Ss 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 resettitles pdfbookmark ifnum c section z 1 else2 fi thesongnum songtitle song theSB songsnum thesongnum MNT endgroup fi vbox makeprelude nobreak vskip SB skip vskip afterpreludeskip relax unvbox SB songbox nobreak vskip SB skip vskip beforepostludeskip relax nointerlineskip vbox makepostlude ifdim sbarheight gt z 7 nobre
104. an write the following IATEX code renewcommand chordlocals catcode Nactive catcode active catcode active newcommand smraise 1 raise2pt hbox small 1 newcommand myslash smraise newcommand myopenparen smraise newcommand mycloseparen smraise chordlocals global let myopenparen global let mycloseparen global let myslash This sets the and symbols as active characters whenever they appear within chord names See 416 2 for documentation of the chordlocals hook Each active character is defined so that it produces a smaller raised version of the original symbol The result is as follows Gsus4 D Gsus4 D Overstrike fixed produces Overstrike fixed As you can see the low hanging symbols have been elevated so that they sit above the baseline correcting the overstrike problem 38 shiftdblquotes songauthors songrefs songcopyright songlicense songtitle resettitles nexttitle foreachtitle Scripture Font Quotation Marks The songs package compensates for a kerning problem in the Zaph Chancery font used to typeset scripture quotations by redefining the and token sequences to be active characters that yield double quotes shifted 1 1 points and 2 points left respectively of their normal positions If you use a different font size for scripture quotations then you can use the Nshiftdblquotes macro when redefining to change thi
105. and complexity of the code stems mainly from the following challenging features e Putting chords above lyrics fully automatically requires building an entire lyric parser in IATEX see 816 10 e Avoiding page turns within songs without prohibiting column breaks re quires building a completely new page breaking algorithm see 16 4 e The package must be able to generate an astonishing number of document variants from a common source lyric only books chorded books digital slides transparency slides selected song subsets transposed songs and com binations of the above This is like putting six or more packages into one e Song book indexes are far more complex than those for a prose book See 16 15 for some of the difficulties involved 16 1 Initialization The code in this section detects any TEX versioning or configuration settings that are relevant to the rest of the song book code Numerous enhancements are possible when using an amp e TEX compatible version of IXTEX We start by checking to see if e TEX primitives are available 1 newif ifSB etex 2 ifx eTeXversion undefined else 3 ifx eTeXversion relax else 4 SB etextrue 5 IfFileExists etex sty RequirePackage fetex 6 Mi 7 fi Detect whether we re generating a pdf file since this affects the treatment of hyperlinks and bookmark indexes 8 newif ifSB pdf SB pdffalse 9 ifx pdfoutput undefined else 10 ifx pdfoutput relax else 4T ifSB
106. arsesrefs 741 1031 1597 3665 SB parsetitles 753 963 SB pdffalse 8 SB pdftrue 12 SB pgbox 292 335 339 340 355 509 SB prcomma 1052 1064 SB prcpy 1041 1058 1062 SB preamblefalse 286 SB preambletrue 17 SB prefshrpsfalse 1772 1913 1916 1922 1926 1928 1931 1935 SB prefshrpstrue 1771 1912 1914 1918 1920 1924 1927 1929 1933 SB prevversefalse ste PG nt 657 1373 SB prevversetrue T 655 670 782 1282 SB prgr 1056 1062 SB prhyphen 1050 1064 SB printEOL 3627 3636 3660 3686 SB prloop 1034 1038 1062 1063 1066 1069 1073 SB prspace 1048 1070 SB prstep 1038 SB ptbg 986 1005 SB pthead 968 973 993 SB ptmain 978 979 982 SB ptsp 975 984 1006 SB ptstart 969 972 1003 1008 SB ptstep 995 999 1005 SB putbox 656 1158 1278 1364 SB putboxes 363 410 526 SB quotesactive 1663 1677 1683 172 SB raggedright 777 915 947 1196 SB rawrefs 728 740 741 785 3650 3651 SB rdqleft 1663 SB rdgqright 1663 SB rechord 181 195 2625 2679 SB repcolon 2015 2030 2035 SB replay 2665 SB scanlq 1663 SB scanrq 1663 SB scripdent 1654 SB selectcol 402 490 493 496 499 525 SB setbaselineskip 189 203 790 848 1491 SB setchord 2048 2236 SB setkeysig 1888 1909 SB setversesep 284 864 SB sgroup 546 550 552
107. ation 1593 newbox SB srbox Begin a scripture quotation We first store the reference in a box for later use and then set up a suitable environment for the quotation Quotations cannot typically be reworded if line breaking fails so we set emergencystretch to a relatively high value at the outset 1594 newenvironment scripture beginscripture SB endscripture 1595 newcommand beginscripture 1 1596 1597 1598 begin intersong SB parsesref s 1 setbox SB srbox hbox printscrcite songrefs 98 SB endscripture scitehere 599 def SB closeall endscripture 600 nobreak vskip5 po 601 SB parindent parindent parindent z 602 parskip z skip parfillskip flushglue 603 leftskip SB parindent rightskip SB parindent relax 604 scripturefont 605 baselineskip f size p plus p relax 606 advance baselineskip p relax 607 emergencystretch 3em 608 End a scripture quotation 609 newcommand SB endscripture 610 ifSB intersong 611 scitehere 612 ifhmode par fi 613 vskip 3 p 614 end intersong 615 f i 616 Usually the scripture citation should just come at the endscripture line but at times the user might want to invoke this macro explicitly at a more suitable point A good example is when something near the end of the scripture quotation drops TEX into vertical mode In such cases it is often better to issue the citation before leaving horizontal mode In
108. ations To cite scripture references for the song use the keyval sr refs where refs is a list of scripture references In dex entries are added to all scripture indexes associated with the current environment for each such reference The songidx index generation program ex pects refs to be a list of references in which semicolons are used to separate references to different books and commas are used to separate references to to different chapters and verses within the same book For example one valid scrip ture citation is sr John 3 16 17 4 1 5 Jude 3 The full formal syntax of a valid refs argument is given in Figure In those syntax rules chapter and verse stand for arabic numbers denoting a valid chapter number for the given book and a valid verse number for the given chapter respectively Note that when referencing a book that has only one chapter one should list only its verses after the book name rather than 1 verses 7 2 Verses and Choruses Starting A Verse Or Chorus Between the and endsong lines of a song can appear any number of verses and choruses A verse begins and ends with beginverse endverse repchoruses norepchoruses refs ref many chptr book nothing ref su ref i su ref many chptr book chapters one chptr book verses Genesis Exodus Leviticus Numbers Obadiah Philemon 2 John 3 John Jude chref u chref u chref chapter
109. because some of these tokens might end up being arguments to multi byte unicode character macros rather than being expanded directly The inputenc package only cares about the character codes not the category codes so modifying only the category codes should be safe 1031 newcommand SB parsesrefs 1 1032 begingrouph 1033 SB toks begingroup SB sractives 1034 SB prloop 1 SB endparse 1035 xdef songrefs the SB toks endgroup 1036 endgroup 1037 The main loop of the scripture reference scanner identifies each space hyphen and comma for special treatment 038 newcommand SB prloop futurelet SB next SB prstep 039 newcommand SB prstep 040 ifcat noexpand SB next A 041 expandafter SB prcpy 042 else 043 NexpandafterNSBOOprstep 044 Mti 045 046 newcommand SB prstep 047 ifcat noexpand SB next noexpandMOsptoken 048 let SB donext SB prspace 049 else ifx SB next 050 let SB donext SB prhyphen 051 else ifx SB next 052 let SB donext SB prcomma 053 else ifx SB next SB endparse 054 let SB donext gobble 055 else ifcat noexpand SB next bgroup 056 let SB donext SB prgr 057 else 058 let SB donext SB prcpy 82 1059 fi fi fi fi fi 1060 SB donext 1061 SB prcepy Anything that isn t one of the special tokens above and anything in a group is SB prgr copied without modification 062 newcommand SB prcpy 1 SB toks expandafter the SB toks 1 SB prloop
110. beginsong 1 767 SB beginsong 768 Begin typesetting a song Beginning a song involves typesetting the title and other info adding entries to the indexes and setting up the environment in which verses and choruses reside 769 newcommand SB beginsong 770 global SB stanzafalse 771 setbox SB chorusbox box voidb x 772 MSBOgotchorusfalse 773 setbox SB songbox vbox bgroup begingroup 774 ifnum SB numcols gt z hsize SB colwidth fi7 775 leftskip z skip rightskip z skip 74 SB endsong 776 parfillskip flushglue parskip z skip TIT MSBOraggedright 778 global SB transposefactor z 779 global SB cr 780 protected edef currentlabel p songnum thesongnum 781 setcounter versenum 1 782 SB prevversetrue 783 meter44 784 resettitles 785 SB addtoindexes songtitle SB rawrefs songauthors 786 nexttitle 787 foreachtitle expandafter SB addtotitles expandafter songtitle 788 resettitles 789 Myricfont 790 NSBOsetbaselineskip 791 Ending a song involves creating the song header with makeprelude creat ing the song footer with Nnakepostlude and then assembling everything to gether into the SB songbox The box is then submitted to the page builder via SB submitsong We do things this way instead of just contributing material di rectly to the main vertical list because submitting material song by song allows for a more sophisticated page breaking algorithm th
111. broken at all Placing brk on a line by itself within a chorus stops the chorus and its vertical bar inserts a valid breakpoint and then restarts the chorus with no intervening space so that if the breakpoint isn t used there will be no visible effect Placing it on a line by itself within a verse just inserts a breakpoint 93 SB boxup Placing brk between songs forces a column or page break but only if gen erating a non partial list of songs When generating a partial list brk between songs is ignored 427 newcommand brk 428 NifSBOinsong 429 ifhmode penalty 5 else 430 unpenalty 431 ifSB inchorus 432 ifdim cbarwidth z0 433 ifrepchorus marks SB cmarkclass fi4 434 SB breakpoint brkpenalty 435 else 436 endgroup egrouph 437 ifrepchorus ifSB gotchorus else 438 global setbox SB chorusbox vbox 439 unvbox SB chorusbox 440 SB chorusbar SB box 441 unvcopy SB box 442 SB breakpoint brkpenalty 443 th 444 fi fi 445 SB chorusbar SB box 446 unvbox SB box 447 SB breakpoint brkpenalty 448 SB chorustopfalse 449 SB beginchorus 450 ML 451 Velsef 452 SB breakpoint brkpenalty 453 ML 454 ML 455 else 456 ifpartiallist else SB nextcol ne colbotglue fi 457 Ni 458 Typeset a shaded box containing a textual note to singers or musicians We first try typesetting the note on a single line If it s too big then we try again in paragraph mode
112. by using braces To exclude text that would normally be drawn under the chord use a pair of braces that includes the chord macro For example G A e ternal produces e ternal Without the braces the syllables ternal would not be pushed out away from the chord This might be used to indicate that the chord transition occurs on the first syllable rather than as the second syllable is sung Contrastingly braces that do not include the chord itself can be used to include text under a chord that would otherwise be excluded For example Gmaj7sus4 Gmaj7sus4 th eternal produces th eternal Without the braces the word eternal would be pushed out away from the chord so that the chord would appear only over the partial word th Chords Without Lyrics Sometimes you may want to write a line of chords with no lyrics in it at all such as for an instrumental intro or solo To make the chords in such a line sit on the baseline instead of raised above it use the nolyrics macro For example nolyrics Intro G N A D produces Intro G A D Note the enclosing braces that determine how long the effect should last Multiple lines can be included in the braces Instrumental solos should typically not appear in lyric books so such lines should usually also be surrounded by Nifchorded and fi see q11 4 Symbols Under Chords If you are typesetting songs in a language whose alphabet contains symbols that LXTE
113. cate that the given numbered finger is to be used to hold down that string Here are some examples to illustrate A xo o gtab A X02220 001230 produces II 23 C sus4 XX gtab C sus4 4 XX3341 produces 4 io B te e gtab B amp X13331 produces II By default tablature diagrams always consist of at least 4 fret rows more if the strings argument contains a number larger than 4 To change the minimum number of fret rows change the value of minfrets For example typing minfrets 1 causes tablature diagrams to have only as many rows are required to accommodate the largest digit appearing in the strings argument 10 Automatic Transposition You can automatically transpose some or all of the chords in a song up by n half steps by adding the line transpose n 23 preferflats prefersharps trchordformat somewhere between the song s line and the first chord to be trans posed For example if a song s first chord is D and the line transpose 2 appears before it then the chord appears as an E in the resulting document Specifying a negative number for n transposes subsequent chords down instead of up The transpose macro affects all chords appearing after it until the Nendsong line If two transpose macros appear in the same song their effects are cumu lative When the option is act
114. censing info lyric index entries and alternate title index entries respectively 740 newsongkey sr def SB rawrefs gdef songrefs 741 def SB rawrefs 1 SB parsesrefs 1 742 newsongkey by def songauthors def songauthors 1 743 newsongkey cr def songcopyright def songcopyright 1 744 newsongkey li setlicense setlicense 1 745 newsongkey index indexentry 1 746 newsongkey ititle indextitleentry 1 Parse the arguments of a beginsong macro The beginsong macro supports two syntaxes The preferred syntax takes the song title s as its first argument and an optional keyval list in brackets as its second argument A legacy syntax supports four arguments all enclosed in braces which are the title s scripture references authors and copyright info 747 newenvironment song beginsong SB endsong 748 newcommand beginsong 1 749 ifSB insong SB errboo SB closeall fi7 750 ifSB intersong SB errbor SB closeall fiZ 751 MSBOinsongtrue 752 def SB closeall endsong 753 SB parsetitles 1 7 754 global setbox SB songwrites box voidb x 755 NSBOclearbskeys 756 NOifnextchar MSBObskvfmtNSBOObeginsong 757 758 NnewcomnandNSBOObeginsong 759 ifnextchar bgroup SB bsoldfmt SBO beginsongy 760 761 newcommand SB bsoldfmt 3 762 SB bskvfmt sr 1 by 92 cr 3 763 764 newcommand SB bskvfmt 765 def SB bskvfimt 1 766 setkeys
115. ces 3 When a space token is encountered but not the very first token after the chord macro it is set equal to SB chendspace again so that SB chendspace is invoked once the sequence of one or more space tokens is finished 2399 newcommand SB chespace 2400 newcommand SB chendspace 7 2401 let SB chdone SB chlyrdone 2402 def SB chexpspace SB chbspace SB chexpspace 2403 def SB chimpspace SB chbspace SB chimpspace 2404 def SB chespace 2405 The SB chbspace macro gets invoked when MultiwordChords is active and the lyric scanner has encountered a space token that was immediately preceded by a non space token Before processing the space we add all lyrics seen so far to the SB lyricbox and check its width If we ve seen enough lyrics to match or exceed the width of the chord a space stops the lyric scanning process This is important because it minimizes the size of the chord box providing as many line breakpoints as possible to the paragraph formatter 123 Otherwise we begin scanning space tokens without adding them to the lyric until we see what the next non space token is If the next non space token would have ended the lyric anyway roll back and end the lyric here reinserting the space tokens back into the token stream If the next non space token would have been included in the lyric the lyric scanner proceeds as normal 2406 NnewcommandNSBOchbspacet 2407 setbox SB lyricbox hbox 2408 Nunhbo
116. chapter chapter chapter verses one chptr book chapters chref chapter verse chapter verse verses vref vref vref vref verse verse verse Figure 2 Formal syntax rules for song scripture references and a chorus begins and ends with beginchorus endchorus Verses are numbered unless noversenumbers has been used to suppress verse numbering whereas choruses have a vertical line placed to their left To create an unnumbered verse begin the verse with Nbeginverse instead This can be used for things that aren t really verses but should be typeset like a verse e g intros endings and the like A verse that starts with beginverse should still end with endverse not endverse Within a verse or chorus you should enter one line of text for each line of lyrics Each line of the source document produces a separate line in the resulting document like I3TEX s obeylines macro Lines that are too long to fit are wrapped with hanging indentation of width parindent Repeating Choruses When making overhead slides it is often convenient to repeat the song s chorus after the first verse on each page so that the projector operator need not flip back to the first slide each time the chorus is to be sung You can say repchoruses to automate this process This causes the first chorus in each song to be automatically repea
117. chorded lyrics fully automatically Extra hyphenation must be introduced in chord books wherever a chord is wider than the syllable it sits above With the standard IATEX chord syntax such hyphenation must be introduced manually by the user usually via a special hyphenation macro but the songs package does this automatically Fourth and finally some other packages allow the user to use b in a chord to produce a flat symbol whereas the songs package requires an amp instead Using b is more intuitive but prevents the use of b for any other purpose within a chord such as to produce a literal b or to type another macro name like Nhbox that contains a b Consequently the songs package uses the less obvious amp symbol to produce flat symbols Song Structure The songs package provides a relatively small number of macros for typesetting high level song structure including verses choruses tex tual comments and conditional macros that indicate that certain sections should go in chord books but not lyric books These can be combined to typeset more sophisticated structures such as intros bridges brackets endings and the like This is done in lieu of providing a specific macro for each of these structures since it results in greater flexibility and fewer macros for users to learn Multiple columns The songs package was designed from the ground up to produce song books with many songs per page arranged i
118. chords followed by new chords in parentheses so that musicians who use capos and those who don t can play from the same piece of music Such typesetting is possible by redefining the following macro to something like 1 2 instead of 2 1804 newcommand trchordformat 2 2 SB trscan This is the entrypoint to the code that scans over the list of tokens comprising a SB trmain chord and transposes note names as it goes Start by peeking ahead at the next symbol without consuming it 1805 newcommand SB trscan futurelet SB next SB dothis Test to see if the token was a begin brace end brace or space These tokens require special treatment because they cannot be accepted as implicit arguments to macros 806 newcommand SB trmain 807 ifx SB next bgroup 808 let SB donext SB trgroup else ifx SB next egroup SB toks expandafter the SB toks egroup let SB donext SBOtrskip else ifcat noexpand SB next noexpand sptoken SB appendsp SB toks let SB donext SB trskip else let SB donext SBOtrsteph fi fi fik SB donext oo e Re Qo 00 00 00 00 OO OO OO o 0o NOAA PWN eH oc MSBetrgroup A begin group brace lies next in the input stream Consume the entire group as an argument to this macro and append it including the begin and end group tokens to the list of tokens processed so far No transposition takes place within a group they are copied verbatim because they probably conta
119. command SB srspacing 1081 nonfrenchspacing sfcode 1500 sfcode 1250 relax 1082 SB srcomma Commas not already followed by whitespace are appended with a thin non SB srcomma breaking space 1083 newcommand SB srcomma futurelet SBOnext SB srcomma 1084 newcommand SB srcomma 1085 ifx SB next SB srspace else 1086 nobreak thinspace 1087 fi 1088 83 SB srhyphen SB srhyphen SB srdash SB srdash SB srspace SB srspace SB srcso SB srcso Hyphens that are not already part of a ligature an en or em dash become en dashes 089 newcommand SB srhyphen futurelet SB next SBO srhyphen 090 newcommand SB srhyphen 7 091 ifx SB next SB srhyphen expandafter SB srdash else fif 092 093 newcommand SB srdash 1 futurelet SB next SBO srdash 094 newcommand SB srdash 095 ifx SB next SB srhyphen expandafter gobble else fiZ 096 To compress consecutive whitespace we ignore spaces immediately followed by more whitespace Spaces not preceded by a semicolon or comma become non breaking Most spaces following a semicolon become en spaces with favorable breakpoints but a special case arises for spaces between a semicolon and a digit see SB srcso below 097 newcommand SB srspace futurelet SB next SBO srspace 098 newcommand SB srspace 099 let SB donext relax 100 ifx SB next SB srspace else 101 ifnum spacefactor gt m 102 ifnum s
120. d So rather than add the space token to the title we remember it in a token register for possible later inclusion 1006 newcommand SB ptsp 1007 NSBOappendspNSBOtoks 1008 afterassignment SB ptstart 1009 let SB next SB titlesep While parsing song titles we temporarily assign a non trivial top level expan sion SB titlesep in order to distinguish it from other macros 1010 newcommand SBO titlesep SB titlesep SB endparse The SB endparse token marks the end of a token sequence being parsed If parsing works as intended the macro should never be expanded so produce an error if it is 1011 newcommand SB endparse 1012 SB Error Title parsing failed This error should not occur 1013 sB testdigit The following decides whether a token or let defined control sequence is a digit SB testdigit and sets conditional ifSB test accordingly 014 newcommand SB testdigit 1 015 SB testfalse 016 ifcati noexpand 1 SBQ testdigit 1 fi 017 018 newcommand SB Gtestdigit 1 7 019 ifx0 1 SB testtrue elsey 020 ifxi 1 SB testtrue else 021 ifx2 1 SB testtrue else 022 ifx3 1 SB testtrue else 023 ifx4 1 SB testtrue elsey 024 ifx5 1 SB testtrue elsey 025 ifx6 1 SB testtrue elsey 026 NifxTH1NSBOtesttrueVelse 027 ifx8 1 SB testtrue elsey 028 6 if x9 1 SB testtrue 029 fi fi fi fi fi fi fi fi fi fis 030 SB parsesrefs Assign the songrefs macro a processed version o
121. dNtheNSBOlyric 2496 2497 newcommand SB chdone 2498 let SB chdone SB chlyrdone The following three macros record arguments passed to a ch macro that concludes the lyric text of the macro currently being processed 2499 newcommand SB ligpre 2500 newcommand SB ligpost 2501 NnewcommandNSBOligfulli Clear all ligature chord registers 2502 NnewcommandNSBOclearligi 2503 gdef SB ligpre 2504 gdef SB ligpost 2505 gdef SB ligfull 2506 16 11 Chords The SB emitchord macro does the actual work of typesetting chord text over lyric text introducing appropriate hyphenation when necessary We begin by con sulting SB next which should have been set by the lyric scanning code in 16 10 126 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 to the token that immediately follows the lyric under this chord to determine whether the lyric text ends on a word boundary 07 newcommand SB emitchord 08 MifSBOinverseVelseMifSBOinchorusVelseMSBOerrchordMf iM if 09 SB testfalse NMifcatNnoexpandMSBOnextNnoexpandMOsptokenNSBOtesttrueMfi ifcat noexpand SB next SB testtrue fi MifxNMSBOnextNSBOparNSBOtesttrueMfi ifx SB next egroup SBOtesttrue fi4 ifx SB next endgroup SB testtrue fiZ SBChyphtests ifSB test SB wordendstrue else SBOwordendsfalse fiz aoa FF WN rR CO Next compare the width of the lyric to the width of the c
122. ded documents Column breaks usually need to be in different places in different book types To achieve this use a conditional block from 411 4 For example ifchorded els ifslides else brk fi fi forces a column break only in lyric books but does not affect chord books or books of overhead slides When a partial list of songs is being extracted with includeonlysongs brk nextcol clearpage and cleardpage macros between songs must be followed by a star to have any effect To force a column break at a specific point in a partial book add the word nextcol brk clearpage or cleardpage at the corresponding point in the argument to includeonlysongs 7 6 Echoes and Repeats Echo Parts To typeset an echo part use echo lyrics and chords Echo parts are parenthesized and italicized For example G A Alle G luia echo Alle A luia produces Alleluia Alleluia Repeated Lines To indicate that a line should be sung multiple times by all singers put rep n at the end of the line For example Alleluia rep 4 produces Alleluia X4 To indicate exactly where repeated parts begin and end use lrep and rrep to create begin and end repeat signs For example 16 measurebar meter mbar textnote musicnote TE Mrep G Alleluia rrep rep 4 produces ae x4 Measure Bars Measure bars can be added to chord books in order to help musicians keep time when playing unfamiliar so
123. donext SB traccy 852 else ifx SB next shrp 853 SB cnt ne 854 let SB donext SB traccy 855 else 856 SB cnt zo 857 MletNSBOdonextNSBOtrtrans 858 fi fi fi fih 859 MSBOdonext 860 106 SB trnotestep SB tracc SB trtrans The next token is a letter Consume it and test to see if it is an uppercase letter If so add it to the note name being assembled otherwise reinsert it into the input stream and jump directly to the transposition logic 861 newcommand SB trnotestep 1 7 862 ifnum uccode 1 1 863 expandafter def expandafter SB temp expandafter SBOtemp 1 864 NexpandafterNSBOtrscan 865 else 866 SB cnt z 867 expandafter SB trtrans expandafter 1 868 fik 869 We ve encountered an accidental sharp or flat immediately following a note name Peek ahead at the next token without consuming it and then jump to the trans position logic This is done because the transposition logic might need to infer the key signature of the song and if the next token is an m for minor then that information can help 1870 newcommand SB tracc 1 futurelet SB next SB trtrans We ve assembled a sequence of capital letters in SB temp that might comprise a note name to be transposed If the letters were followed by a shrp then SB cnt is 1 if they were followed by a f1t then it is 1 otherwise it is 0 If the assembled letters turn out to not match any valid note name
124. dxentry and or idxaltentry macros one for each line of the index Again the exact definitions of these macros will vary between index types 3152 newcommand idxentry 2 3153 newcommand idxaltentry 2 Some indexes actually have two definitions for each idxblock environment one for use when there are few enough entries to permit a small style index and another for use in a large style index These macros will be redefined appropriately within the initialization code for each type of index 3154 newenvironment SB lgidx 1 3155 newenvironment SB smidx 1 148 SB idxsetup Set various parameters for a column of an index environment 3156 newcommand SB idxsetup 3157 hsize SB colwidth 3158 parskip z skip parfillskip z skip parindent zQ 3159 baselineskip f size p plus p minus po 3160 lineskiplimit z lineskip p plus p minus po 3161 hyphenpenalty M exhyphenpenalty OM 3162 SB makeidxcolumn Break off enough material from SB box to create one column of the index 3163 newcommand SB makeidxcolumn 3164 ifdim ht SB box z0 3165 hskip hsize relax 3166 else 3167 splittopskip z skip splitmaxdepth maxdepth 3168 vsplit SB box to SB dimen 3169 global setbox SB box vbox 3170 NSBOidxsetup 3171 Nsplitbotmark 3172 unvbox SB box 3173 yh 3174 Mi 3175 SB oneidxpage Construct one full page of the index The definition of SB oneidxpage is gener ated dynamica
125. e brk macro at that point in the line This does not affect lines short enough to fit without breaking For example beginverse This is a brk short line But this is a particularly long line of lyrics brk that will need to be wrapped endverse produces 15 nextcol sclearpage scleardpage echo rep Mrep rrep This is a short line But this is a particularly long line of lyrics that will need to be wrapped Column Breaks Within Songs To suggest a column break within a verse or chorus too long to fit in a single column use brk on a line by itself If there are no brk lines in a long verse it is broken somewhere that a line does not wrap A wrapped line is never divided by a column break If there are no brk lines in a long chorus it overflows the column yielding an overfull vbox warning Column Breaks Between Songs To force a column break between songs use nextcol brk sclearpage or scleardpage between songs The nextcol macro ends the column by leaving blank space at the bottom The brk macro ends the current column in lyric books by stretching the preceeding text so that the column ends flush with the bottom of the page In non lyric books brk is identical to nextcol The sclearpage macro is like nextcol except that it shifts to the next blank page if the current page is nonempty The scleardpage macro is like sclearpage except that it shifts to the next blank even numbered page in two si
126. e a new song key called arr which stores its value in a macro called arranger one could write newcommand arranger newsongkey arr def arranger def arranger Arranged by 1 par Then one could redefine Nextendprelude to print the arranger below the other song header information renewcommand extendprelude showrefs showauthors bfseries arranger A line could then specify the song s arranger as follows The Title arr R Ranger endsong This produces 37 Nchordlocals 1 The Title Arranged by R Ranger For more detailed information about keyvals and how they work consult the documentation for David Carlisle s keyval package which comes standard with most ATEX 2e installations 11 9 Font Kerning Corrections Chord Overstriking In order to conserve space and keep songs readable the songs package pushes chords down very close to the lyrics with which they are paired Unfortunately this can sometimes cause low hanging characters in chord names to overstrike the lyrics they sit above For example Gsus4 D Gsus4 D Overstrike produces Overstrike Note that the parentheses and slash symbols in the chord name have invaded the lyric that sits beneath them The best solution to this problem is to use a font for chord names that min imizes low hanging symbols but if you lack such a font then the following trick works pretty well Somewhere in the preamble of your document you c
127. e data is stored in files named idxfile sxd and idxfile sbx To display the index in the document use showindex columns title id where id is the same identifier used in the Nnewauthorindex or command and where the title is the title of the index which should consist only of simple text no font or formatting macros since those cannot be used in pdf bookmark indexes The columns part is optional if specified it dictates the number of columns if the index can t fit in a single column For example for a 2 column title index write showindex 2 Index of Song Titles mainindex 6 Compiling As with a typical IXTEX document compiling a song book document requires three steps First use IXTEX pdflatex is recommended to generate auxiliary files from the tex file pdflatex mybook tex songs Second use the songidx program to generate an index for each index that you declared with newindex or uewscripindex The syntax of the songidx command is songidx b canon can filename sxd filename sbx where filename is the same filename that was used in the or macro If the index was declared with eT en the b option is used to specify which version of the bible you wish to use as a basis for sorting your scripture index The canon part can be any of the can files provided with the songidx distribution If you are using a Protestant Catholic or Greek Orthodox Christian bible with book nam
128. e nomeasures option to display them use the showmeasures option the default Measure bars can also be turned on or off in the middle of the document by using the measureson or measuresoff macros Worship Songs 1 Doxology Revelation 5 13 Louis Bourgeois and Thomas Ken G D Em Bm EmD Praise God from Whom all blessings G flow GD Em Praise Him all creatures here below Em D GD GC Em Praise Him a bove ye heav nly host D Am Em Praise Father Son and Bio D Gi CG A men Public domain The LORD is my rock and my fortress and my deliverer my God my rock in whom I take refuge my shield and the horn of my salvation my stronghold I call upon the LORD who is worthy to be praised and I am saved from my enemies The cords of death encompassed me the torrents of destruction assailed me the cords of Sheol entangled me the snares of death confronted me In my distress I called upon the LORD to my God I cried for help From his temple he heard my voice and my cry to him reached his ears Psalm 18 2 6 2 A Mighty Fortress Is Our God Martin Luther C m B7 E A mighty Fortress is our God E7 A A bulwark never fail ing C m B7 E Our helper He amid the flood D A E7A Of mortal ills prevailing B7sus4 B7 E For still our an cient foe A E G F m Doth seek to work us woe B7 E His craft and pow r are great Bm And armed with cruel hate On earth is not his e qual
129. e par fi 641 begingroup 642 rightskip SB parindent plus4em 643 advance leftskip2 SB parindent 644 advance parindent 1 SB parindent 645 def par endgraf endgroup 646 obeylines 647 strophe Insert blank space indicative of a strophe division in a scripture quotation 648 newcommand strophe 649 ifSB intersong else 650 SB errscrip strophe beginscripture Unknown 651 fi 652 vskip 9ex plus 45ex minus 68ex relax 653 scripindent Create an indented sub block within a scripture quotation scripoutdent 1654 newcommand SB scripdent 2 SB scripdent 1655 MifSBOintersongVelse 656 SB errscrip 2 beginscripture Unknown 657 f ik 658 ifhmode par fi 659 advance leftskip 1 SB parindent relax 660 661 newcommand scripindent SB scripdent1 scripindent 662 newcommand scripoutdent SB scripdent scripoutdent shiftdblquotes The Zaph Chancery font used by default to typeset scripture quotations seems to SB ldqleft have some kerning problems with double quote ligatures The shiftdblquotes SB ldqright macro allows one to modify the spacing around all double quotes until the current SB rdqleft group ends SBGrdqright 1663 newcommand SB quotesactive SB scanlq 1664 catcode active SB scanrq 1665 catcode active SB dolq SB dorq 100 666 667 newcommand shiftdblquotes 4 668 newcommand SB ldqleft 669 newcommand SB ldqright 670 newcommand SB rd
130. e suppressed within material that would otherwise be transposed by using the Nnotrans macro For example writing G notrans would typeset a transposed G followed by a non transposed G chord This does not suppress note name conversion sce notenames To suppress both transposition and note name conversion just use braces e g G instead of notrans G Transposing Guitar Tablatures The songs package cannot automatically transpose tablature diagrams see q9 Therefore when automatic transposition is taking place only the chord names of macros are displayed and trans posed the diagrams are omitted To change this default redefine the gtabtrans macro whose two arguments are the two arguments to For example to display original tablatures without transposing them even when transposition has been turned on write renewcommand gtabtrans 2 NgtabilNnotrans 31 21 To transpose the chord name but not the diagram under it replace Nnotrans it1 with simply 1 in the above To restore the default behavior write renewcommand gtabtrans 2 transposehere 1 11 Customizing the Book 11 1 Song and Verse Numbering Song Numbering The songnum counter defines the next song s number It is set to 1 at the beginning of a songs environment and is increased by 1 after each It can be redefined anywhere except within a song For example setcounter songnum 3 sets the next song s number to be 3 You can chan
131. each verse is controlled by the placeversenum macro By default each verse number is placed flush left Authors interested in changing the placement of verse numbers should consult 16 2 of the implementation section for more information on this macro 27 Myricfont stitlefont versefont chorusfont notefont notebgcolor snumbgcolor printchord sharpsymbol flatsymbol everyverse everychorus 11 2 Song Appearance Font Selection By default lyrics are typeset using the document default font normalfont and with the document default point size normalsize You can change these defaults by redefining lyricfont For example to cause lyrics to be typeset in small sans serif font you could define renewcommand lyricfont sffamily smal1 Song titles are typeset in a sans serif slanted font by default sans serif up right if producing slides You can change this default by redefining stitlefont For example to cause titles to be typeset in a roman font you could define renewcommand stitlefont rmfont Large You can apply additional font changes to verses choruses and textual notes produced with and by redefining versefont chorusfont and notefont respectively For example to typeset choruses in italics you could define renewcommand chorusfont it The colors of shaded boxes containing textual notes and song numbers can be changed by redefining the notebgcolor and snumbgcolor
132. eaders vrule width cbarwidth vskip SB skip 397 ifSB chorustop if chorded else 398 advance SB skip SB dimeniiZ 399 fi fiz 400 nobreak vskip SB skip 401 f i 402 SB computess This computes the stretchability or shrinkability of a vbox and stores the result in the skip register given by arg1 If arg2 1 and arg3 is plus then the stretchability of box arg4 is added to the plus component of arg1 If arg2 1 and arg3 is minus then the shrinkability of the box is added to the minus component of arg1 If the stretchability or shrinkability is infinite then we guess 1fil for that component 403 newcommand SB computess 4 404 begingroup 405 vbadness M vfuzz maxdimen 406 SB dimen4096 pe 407 setbox SB box vbox spread 2 SB dimen unvcopy 4 408 ifnum badness z07 409 global advance 1 z 31fil relax else SB dimenii SB dimen loop SB dimenii 5 SB dimenii ifnum badness lt 100 advance SB dimen SB dimenii else advance SB dimen SB dimenii Mid setbox SB box vbox spread 2 SB dimen unvcopy 4 A A A A A A A A A BL o o 100 0 25 o 420 ifnum badness 100 SB dimenii z fi 421 ifdim SB dimenii gt 1 p repeat 422 ifdim SB dimen lt 1 p SB dimen z fiZ 423 global advance 1 z0 3 SB dimen relaxy 424 ML 425 endgroupy 426 brk Placing brk within a line in a verse or chorus tells TEX to break the line at that point if it needs to be
133. eals its arguments breaking the liga ture with hyphenation Thus the ch macro is only actually expanded when the ligature shouldn t be broken 2612 newcommand ch SB ch 2613 newcommand SB ch 2614 newcommand SB ch on SB begincname SB ch 2615 newcommand SB ch 1 SB endcname SB ch 1 2616 newcommand SB ch 4 SBGnoreplay hphant om 2 1 4 2617 newcommand SB ch of f 4 4 mch The mch macro is like ch except that it also introduces a measure bar SB mch 2618 newcommand mch SB mch SB mch m 2619 newcommand SB mch SB mch on 2620 newcommand SBO mch m 4 2 measurebar 3 SB mch 2621 newcommand SB mch on SB begincname SB mch SB mch 2622 newcommand SB mch 1 SBGendcname SB G mch 1 2623 newcommand SB mch 4 2 measurebar 1 3 130 SB activehat This macro must always contain the current definition of the chord replay active character in order for the lyric scanner to properly identify it and insert proper hyphenation when necessary 2624 NnewcommandNSBOactivehat i 2625 2626 Mifmmode NVelseNVexpandafterNSBOrechordMfi SB loadactives It s cumbersome to have to type Nshrp flt and mbar every time you want a sharp flat or measure bar so within verses and choruses we allow the hash ampersand and pipe symbols to perform the those functions too It s also cumber some to have to type something like chord Am lyric to produce each chord As a
134. either Acolon or Bcolon A colons are typeset flush with the left margin while B colons are indented Any lines too long to fit are wrapped with double width hanging indentation For example beginscripture Psalm 1 1 Acolon Blessed is the man Bcolon who does not walk in the counsel of the wicked Acolon or stand in the way of sinners Bcolon or sit in the seat of mockers endscripture produces Blessed is the man who does not walk in the counsel of the wicked or stand in the way of sinners or sit in the seat of mocKers Psalm 1 1 strophe Stanzas Biblical poetry is often grouped into stanzas or strophes each of which is separated from the next by a small vertical space You can create that vertical space by typing strophe For example 21 scripindent scripoutdent beginscripture Psalm 88 2 3 Acolon May my prayer come before you Bcolon turn your ear to my cry strophe Acolon For my soul is full of trouble Bcolon and my life draws near the grave endscripture produces May my prayer come before you turn your ear to my cry For my soul is full of trouble and my life draws near the grave Psalm 88 2 3 Indented Blocks Some bible passages such as those that mix prose and po etry contain indented blocks of text You can increase the indentation level within a scripture quotation by using Nscripindent and decrease it by using scripoutdent For example beginscripture Hebrews 10 17 18
135. enalty interlinepenalty 1191 f i 1192 SB par This replacement definition of par restores the SB par definition of par and then ends the paragraph 193 newcommand SB par let par SB par par SB parindent Reserve a length to remember the current parindent 194 newdimen SB parindent SB everypar Reserve a control sequence to hold short term changes to everypar 195 newcommand SB everypar SB raggedright Perform raggedright except don t nuke the parindent 196 newcommand SB raggedright 197 SB parindent parindent 198 Nraggedright 199 parindent SB parindent 200 vnumbered The following conditional remembers whether this verse is being numbered or not i e it distinguishes between beginverse and beginverse 1201 newif ifvnumbered ifSB prevverse Reserve a conditional to remember if the previous block in this song was a verse 1202 newif ifSB prevverse Before replacing the little used verse environment with a new one issue a warning if the current definition of verse is not the IATEX default one This may indicate a package clash 203 NCheckCommand verset 204 NletNNNOcentercr 20506 list 206 itemsep z 207 itemindent 1 5em 208 listparindent itemindent 209 rightmargin leftmarginy 210 advance leftmargin1 5em 211 HA 212 item relax 213 87 verse verse beginverse SB beginverse Begin a new verse This can be done by beginni
136. enaltyNelseNcvpenalty Mf i 133 Velsef 134 MifSBOprevverseWcpenaltyNelseNccpenalty Mf iA 135 MEL 136 th 137 NskipNversesep 138 Mif 139 Insert a valid breakpoint into the vertical list comprising a song 140 newcommand SB breakpoint 1 141 begingroup 142 Mifnumiti NOM A 143 SB skip colbotglue relax 144 SB skip SB skip 145 else 146 SB skip z skip 147 ML 148 advance SB skip lastskip 149 unskip 150 nobreak 151 ifnum 1 lt 0M 152 NskipNcolbotglueNVrelax 153 penalty 17 154 Mi 155 vskip SB skip 156 endgroup 157 85 SB putbox SB obeylines SB par Unbox a vbox and follow it by vertical glue if its depth is unusually shallow This ensures that verses and choruses will look equally spaced even if one of them has a final line with no letters that dangle below the baseline 158 newcommand SB putbox 2 159 begingroup 160 SB dimen dp 2 161 11427 162 setbox SB box hbox lyricfont p 163 ifdim SB dimen lt dp SB box 164 advance SB dimen dp SB box 165 vskip SB dimen 166 Mi 167 setbox SB box box voidb x 168 Nendgroup 169 Within verses and choruses we would like to use obeylines so that each return in the source file ends a paragraph without having to say par explicitly The ETEX base code establishes the convention that short term changes to par will restore par by setting it equal to par Long term i e environm
137. ence the and howrefs macros display author and scripture reference information as a pre formatted paragraph the way it appears in the default song header blocks See for how to define new keyvals and use them in extendprelude For complete control over the appearance of the header and footer material that precedes and concludes each song you can redefine the macros makeprelude and makepostlude When typesetting a song the songs package code in vokes both of these macros once after processing all the material between the N eginsong and lines placing the results within vboxes The resulting vboxes are placed atop and below the song content By default Nnakeprelude displays the song s titles authors and scripture references to the right of a shaded box containing the song s number and makepostlude displays the song s copy right and licensing information in fine print Page and Column breaking Page breaking and column breaking within songs that are too large to fit in a single column page is influenced by the values of several penalties Penalties of value Ninterlinepenalty are inserted between con secutive lines of each verse and chorus penalties of value vvpenalty Nccpenalty vcpenalty and cvpenalty are inserted into each song between consecutive verses between consecutive choruses after a verse followed by a chorus and after a chorus followed by a verse respectively and penalties of value Nbrkpenalty are inserted
138. endverse 1 beginverse he second verse has the same chords endverse produces G CG This is the first verse The second verse has the same chords Normal chords can appear amidst replayed chords without disrupting the se quence of chords being replayed Thus a third verse could say beginverse he third verse has a Cm new chord endverse i to produce C CmG The third verse has a new chord Replaying can be used in combination with automatic transposition to produce modulated verses See 10 for an example By default chords are replayed from the current song s first verse but you can replay the chords of a different verse or chorus by saying memorize at the beginning of any verse or chorus whose chords you want to later replay Subsequent verses or choruses that use replay chords from the most recently memorized verse or chorus Selective Memorization It is also possible to inject unmemorized chords into a memorized verse so that they are not later replayed To suppress memorization of a chord begin the chord s name with a hat symbol For example beginversd menorize The G third C chord will Cm not be re G played endverse beginverse l 5 o B H o B H p cq H H 09 the unmemorized chord is skipped endverse 14 newchords replay brk produces G C Cm G The third chord will not be replayed G C G When replayin
139. ent long changes to par should therefore redefine par to restore the desired long term definition The following code starts a long term redefinition of par adhering to these conventions and extends that definition to return as well 1170 NnewcommandNSBOobeylinesi 1171 let par SB par 1172 Nobeylines 1173 let par SB par 1174 The following replacement definition of par constructs paragraphs in which page breaks are disallowed since no wrapped line in a song should span a page or column break It then inserts an interlinepenalty after the paragraph so that such penalties will appear between consecutive lines in each verse Note The endgraf macro must not be uttered within a local group since this prevents parameters like hangindent from being reset at the conclusion of each paragraph 175 NnewcommandNSBOpar 7 176 ifhmode 177 SB cnt interlinepenalty 178 interlinepenalty OMy 179 endgraf 180 interlinepenalty SB cnt 181 ifSB inchorus 182 ifdim cbarwidth gt z nobreak else SB ilpenalty fiZ 183 else 184 SB ilpenalty 185 ML 186 fi 187 86 SB ilpenalty By default breaking a vertical list between paragraphs incurs a penalty of zero Thus we only insert an explicit penalty between lines if interlinepenalty is non zero This avoids cluttering the vertical list with superfluous zero penalties 1188 newcommand SB ilpenalty 1189 ifnum interlinepenalty z else 1190 p
140. enumstyle macro is obsolete and exists only for backward compatibility 67 renewcommand theversenum versenumstyle versenum 68 newcommand versenumstyle 69 let versenumstyle arabic Define the printing style for the large boxed song numbers starting each song 70 newcommand printsongnum 1 sffamily bfseries LARGE 1 Define the printing style for the verse numbers to the left of each verse 71 newcommand printversenum 1 lyricfont 1 Verse numbers are placed flush left This is achieved by inserting horizontal glue that reverses both the leftskip and the parindent The single argument to this macro is an hbox containing the verse number 72 newcommand placeversenum 1 73 hskip leftskip hskip parindent relax 7A box 1 75 The following hooks allow users to insert material at the head of each verse or chorus 76 newcommand everyverse 77 newcommand everychorus Define the printing style for chords 78 newcommand printchord 1 sffamily slshape large 1 This hook is expanded at the start of the scoping group that surrounds every chord name Thus it can be used to set any catcodes or definitions that should be local to chord names 79 newcommand chordlocals 50 versesep afterpreludeskip bef orepostludeskip baselineadj clineparams parindent idxheadwidth songnumwidth versenumwidth Specify the vertical distance between song verses This gets set to a sentinel val
141. eptance of this License to do so and all its terms and conditions for copying distributing or modifying the Program or works based on it Each time you redistribute the Program or any work based on the Program the recipient automatically receives a license from the original licensor to copy distribute or modify the Program subject to these terms and conditions You may not impose any further restrictions on the recipients exercise of the rights granted herein You are not responsible for enforcing compliance by third parties to this License If as a consequence of a court judgment or allegation of patent infringement or for any other reason not limited to patent issues conditions are imposed on you whether by court order agreement or otherwise that contradict the conditions of this License they do not excuse you from the conditions of this License If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations then as a consequence you may not distribute the Program at all For example if a patent license would not permit royalty free redistribution of the Program by all those who receive copies directly or indirectly through you then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program If any portion of this section is held invalid or unenforceable under any particular circumstance the balance of t
142. er 6 8 di mch G f fi ffi cult produces diflficult The macro sets the new time signature which appears above the next measure bar in this case the measure bar produced by the mch macro Chords and measure bars produced with 7 or I are safe to use in ligatures Thus dif ficult requires no special treatment it leaves the ffi ligature intact when measure bars are not being displayed 19 intersong intersong songgroup beginscripture endscripture 8 Between Songs Never put any material directly into the top level of a songs environment Doing so will disrupt the page builder usually producing strange page breaks and blank pages To safely put material between songs use one of the environments described in this section 8 1 Intersong Displays To put column width material between the songs in a songs environment use an intersong environment begin intersong end intersong Material contributed in an intersong environment is subject to the same column breaking rules as songs see q11 5 but all other formatting is up to you By de fault XTX inserts interline glue below the last line of an intersong environment To suppress this end the intersong content with par nointerlineskip To instead put page width material above a song use an intersong envi ronment begin intersong end intersong This starts a new page if the current page already has column width material in it By defaul
143. er macros that follow SB next might be a macro declared outer This means that it must never be passed as an argument to a macro and it must never explicitly appear in any untaken branch of a conditional If it does the TEX parser will complain of a runaway argument when it tries to skip over an outer macro while consuming tokens at high speed We begin lyric scanning with two special cases 1 If the chord macro is immedi ately followed by another chord macro with no intervening whitespace drop out of the lyric scanner and reenter it when the second macro is parsed The chord texts will get concatenated together above the lyric that follows 2 If the chord macro is immediately followed by one or more quote tokens then consume them all and output them before the chord This causes the chord to sit above the actual word instead of the left quote or left double quote symbol which looks better 2255 newcommand SB chstart 2256 ifx SB next 2257 let SB donext relax 2258 else ifx SB next SB activehat 2259 let SB donext relax 2260 else ifx SB next ch 2261 let SB donext relax 2262 else ifx SB next mch 2263 let SB donext relax 2264 else ifx SB next 2265 let SB donext SB chstep 2266 else ifx SB next 2267 let SB donext SB chstep 2268 else ifx SB next 2269 let SB donext SB chstep 2270 else 2271 the SB lyrich 2272 SB lyric 2273 SB firstchordtrue 2274 MletNSBOdothisNSBOchnorm
144. ered protect endsong space with no matchin 3425 g protect beginsong Before song thesongnum space there wa 3426 s an protect endsong space with no matchin 3427 g protect beginsong 3428 3429 NnewcommandNSBOerrbvvi 3430 SB Error Encountered protect beginverse space without seein 3431 g an protect endverse space for the preceding verse Son 3432 g thesongnum space might have a verse that has n 3433 o protect endendverse space line 3434 3435 NnewcommandNSBOerrbvci 3436 SB Error Encountered protect beginverse space without seein 3437 g an protect endchorus space for the preceding chorus Son 3438 g thesongnum space might have a chorus that has n 3439 o protect endchorus space line 3440 3441 newcommand SB errbvt 3442 SB Error Encountered protect beginverse space without firs 3443 t seeing a protect beginsong space line Before son 3444 g thesongnum there is a protect beginverse space line no 3445 t contained in any song 6 3446 3447 newcommand SB errevc 3448 NSBOError Encountered protect endverse space while process 3449 ing a chorus Song thesongnum space might hav 3450 e a protect beginchorus space concluded by a 3451 n protect endverse space instead of an protect endchorus 3452 156 SB errevo 3453 newcommand SB errevo 3454 SB Error Encountered protect endverse space without firs 3455 t seeing a protect beginverse Song thesongnum
145. es in English then the bible can canon file should work well For other bibles you should create your own can file by copying and modifying one of the existing can files For example if your song book tex file contains the lines newindex titleidx titlfile newauthorindex authidx authfile newscripindex scripidx scrpfile then the commands to generate indexes sorted according to a Christian English bible are songidx titlfile sxd titlfile sbx songidx authfile sxd authfile sbx songidx b bible can scrpfile sxd scrpfile sbx Once the indexes are generated generate the final book by invoking IATEX one more time pdflatex mybook tex 7 Songs 7 1 Beginning a Song Song Sets Songs are contained within songs environments Each songs envi ronment begins and ends with begin songs indexes VendlsongEn indexes is a comma separated list of index identifiers the id s specified with newindex one identifier for each index that is to include songs in this song set Between the begin songs and end songs lines of a song section can appear only songs see below or inter song environments see 48 No text in a songs environment may lie outside of these environments beginsong Songs A song begins and ends with endson by 8 beginsong titles otherinfo endsong Songs should appear only within environments see above unless you are supplying your own page builder see 411 5
146. esep 75 SB dimen plus 25 SB dimen minus 13 SB dimen Mid endgroup M Generate the material that begins each song This macro is invoked at endsong so that its code can access song info defined throughout the song 886 newcommand makeprelude 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 resettitles ifslides hbox to hsize hfil stitlefont songtitle hfil 33 vskip5 po hbox to hsize hfil vbox divide hsize tw parskip p relax centering small extendprelude n hfil F else ifdim songnumwidth gt z07 setbox SB boxii hbox SB colorbox snumbgcolor hbox to songnumwidth printsongnum thesongnum hfil Ht 33H TT makepostlude showauthors 908 909 o o o o o Oo OO Oo oO o o 100 PWN er o Ne N 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 ao e WN FO 947 948 949 M setbox SB box vbox ifnum SB numcols gt z hsize SB colwidth fiz ifdim songnumwidth gt zo advance hsize wd SB boxii advance hsize 3 po Mid NSBOraggedrightVoffinterlineskipMlineskip M pQ stitlefont songtitle par nexttitle foreachtitle songtitle par ifdim prevdepth z kern p fiZ parskip p relax tiny extendprelude NkernNz 07 n MifdimNsongnumwidth NzQ hbox ifdim ht SB boxii gt ht SB box NboxNSBOboxii kern3 p vtop b
147. etwidth 2711 advance SB dimen 4 p0 2712 hfil 2713 vrule width SB dimen Cheight 4 p0 depth zo 2714 hfil 205 2716 nointerlineskip 2717 SB topempty Above a string in a tablature diagram there can be nothing an x or an o SB topX 9718 newcommand SB topempty SB atopfret relax SB top0 2719 newcommand SB topX SB atopfret 2720 hbox 2721 kern 2 p0 2722 fontencoding 0MS fontfamily cmsy 2723 fontseries m fontshape n 7 2724 fontsize viipt O viipt selectfont char twO 2725 kern 2 p0 2720 YA 2727 2728 newcommand SB top0 SB atopfret 2720 vrule width z GCheight4 3333 p depth 8333 pe 2730 lower 74 p hbox 2731 fontencoding 0MS fontfamily cmsy 2732 fontseries m fontshape n 2733 fontsize xpt xpt selectfont char14 2734 YA 2735 MSBOfretempty On a string in a fret diagram there can be nothing or a filled circle SB frethit 9736 newcommand SB fretempty SB onfret relax 2737 newcommand SB frethit SBO onfret y 2738 hbox 2739 fontencoding 0MS fontfamily cmsy 2740 fontseries m fontshape n 2741 fontsize xiipt xiipt selectfont char15 2742 HA 2743 SB finger If we re including fingering info in the tablature diagram then below each string there might be a number 2744 newcommand SB finger 1 2745 SB atopfret sffamily fontsize Ovipt Ovipt selectfont 1 2746 134 MifSBOgettabind NSBOtabindent SB tar
148. ex 95 newlength idxheadwidth 96 setlength idxheadwidth 1 5cm Set the width of the song number boxes that begin each song We guess a suitable width by typesetting the text 999 97 newlength songnumwidth 98 settowidth songnumwidth printsongnum 999 Set the width that is reserved for normal sized verse numbers Verse numbers wider than this will indent the first line of lyrics 99 newlength versenumwidth 100 settowidth versenumwidth printversenum 9 kerniem 51 Ncbarwidth sbarheight vvpenalty ccpenalty vcpenalty cvpenalty brkpenalty spenalty songmark versemark chorusmark This dictates the width of the vertical line placed to the left of choruses Setting it to Opt eliminates the line entirely 101 newlength cbarwidth 102 setlength cbarwidth p This dictates the height of the horizontal line placed between each pair of songs Setting it to Opt eliminates the line entirely 103 newlength sbarheight 104 setlength sbarheight p Column and page breaks should typically not occur within a verse or chorus unless they are unavoidable Thus we set the interlinepenalty to a high number 1000 105 interlinepenalty m The following count registers define the line breaking penalties inserted between verses between choruses after a verse followed by a chorus after a chorus followed by a verse and at brk macros respectively The default value of 200 was chosen based on the f
149. extname Test to see if it s a known macro or the beginning of a multibyte encoded international character If the former dispatch some macro specific code to handle it If the latter grab the full multibyte sequence and include it in the lyric 2333 newcommand SB chmacro 2334 ifx SB next SB activehat 2335 let SB donext SB chdone 2336 else ifx SB next SB pary 2337 let SB donext SB chdone 2338 else ifx SB next measurebar 2339 NSBOchmbar 2340 else ifx SB next mbar 2341 SB chmbar 2342 else ifx SB next ch 2343 SB chespace let SB donext SB chligy 2344 else ifx SB next mch 2345 SB chespace let SB donext SB mchlig 2346 else ifx SB next 2347 SB chimpspace 2348 else ifx SB next SB nbsp 2349 SB chimpspace 121 2350 else 2351 expandafter SBOUTFtest expandafter meaning SB next 2352 ifcase SB cnt SB chothermac 2353 or or SB chespace let SB donext SB chsteptwof 2354 or SB chespace let SB donext SB chstepthree 2355 NorNSBOchespaceM etNSBOdonextNSBOchstepfourMf if 2356 fi fi fi fi fi fi fi fi 2357 SB chothermac The lyric scanner has encountered a macro or active character that is not outer not a known macro that requires special treatment and not a multibyte inter national character First check the macro s name stored in SB nextname to see if it begins with a non escape character If so it s probably an accenting or punctuation character made acti
150. f a scripture reference in which the following adjustments have been made 1 Spaces not preceded by a comma or semicolon are made non breaking For example 2 John 1 1 and Song of Solomon 1 1 become 2 John i1 1 and Song of Solomon 1 1 respec tively 2 Spaces between a semicolon and a book name are lengthened to en spaces 3 Single hyphens are lengthened to en dashes 4 Non breaking thin spaces are appended to commas not followed by a space For 81 SB prloop SB prstep SB prstep example John 3 16 17 becomes John 3 16 nobreakNthinspacei7 5 Every thing within an explicit group is left unchanged allowing the user to suppress all of the above as desired To achieve this we must change all commas hyphens and spaces in the scrip ture reference into active characters Unfortunately the catcodes of everything in the text were set back when the full keyval list was digested as an argument to beginsong so we must unset and reset the catcodes One obvious solution is to use Nscantokens from e TEX to do this but that doesn t allow us to suppress the re catcoding process within groups and we d like to avoid intoducing features that require e TEX anyway for compatibility reasons Therefore we build the following small scanner instead The scanner walks through the text token by token replacing each important token by its active equivalent No character codes are modified during this process and no tokens are inserted
151. f these is the Songbook package by Christopher Rath http rath ca Misc Songbook Most of the differences between other packages and this one are intentional the following is a summary of where I ve adopted various differing design decisions and why Ease of Song Entry Much of the songs package programming is devoted to easing the burden of typing chords With most TFX song book packages the user types chords using a standard IATEX macro syntax like chord chord lyric The songs package uses a less conventional chord lyric syntax for several reasons detailed below First macros in the standard IATEX syntax require more key presses than macros in the songs package s syntax This can become become very taxing when typing up a large book Chords often appear as frequently as one per syllable especially in hymns so keeping the syntax as brief as possible is desirable Second the standard I4TEX macro syntax requires the user to estimate how much of the lyric will lie below the chord because the lyric part must be enclosed in braces whereas the songs package s syntax does not Estimating this accurately can be quite difficult since in many cases the lyric part must include punctuation or multiple words to get proper results The songs package automates this for the user significantly easing the task of chord entry 41 Third unlike the standard IATEX chord syntax the songs package s syntax handles all hyphenation of
152. for the vertical bar left of choruses if used in a chorus 147 newcommand justifyleft 148 leftskip parindent 149 ifSB inverse advance leftskip versenumwidth fi7 150 SB cbarshift 151 parindent parindent 152 The justifycenter macro sets up an environment in which lyrics are centered on each line Verse numbers continue to be placed flush left but placeversenum is temporarily redefined to keep the rest of the line containing a verse number centered 153 newcommand justifycenter 154 centering SB cbarshift rightskip leftskip 155 def placeversenum 1 156 hskip leftskip hskip parindent relax 157 hangindent wd 1 hangafter m ne 158 box 1 hfil 159 3 160 Default off Several macros provided by the songs package are by default declared Nouter to aid in debugging However unusual documents may need to use these macros within larger constructs To do so use the unouter option to prevent any of the macros supplied by this package from being declared Nouter 161 newcommand SB outer outer 162 DeclareOption unouter let SB outer relax Default off Instead of generating a document this dumps a text version of the song book to a file This option can only be set in the usepackage line because it dictates many top level macro definitions Turning rawtext on turns off the indexes by default but this can be overridden by explicitly setting index options Note Using rawtext with indexes
153. g the unmemorized chord is skipped This is useful when the first verse of a song has something unique like an intro that won t be repeated in subsequent verses but has other chords that you wish to replay Memorizing Multiple Chord Sequences By default the songs package only memorizes one sequence of chords at a time and replays chords from that most recently memorized sequence However you can memorize and replay multiple independent sequences using the macros described in the following paragraphs Memorized or replayed chord sequences are stored in chord replay registers To declare a new chord replay register type newchords regname where regname is any unique alphabetic name Once you ve declared a register you can memorize into that register by pro viding the regname as an optional argument to Nnemorize memorize rename Memorizing into a non empty register replaces the contents of that register with the new chord sequence To replay chord from a particular register type replay regname Subsequent uses of El reproduce chords from the sequence stored in register regname Register contents are global so you can memorize a chord sequence from one song and replay it in others You can also use replay multiple times in the same verse or chorus to replay a sequence more than once 7 5 Line and Column Breaks Line Breaking To cause a long line of lyrics to be broken in a particular place put th
154. g that are also located here The options are not actually processed until because some of the macros defined here refer to macros that have not yet been defined Default off Turning this option on generates a book of overhead slides one for each song It really just amounts to changing various parameter settings Else where in the code we also consult ifslides to determine a few default parameter settings and to use a different song preamble structure All the parameter changes below are local to the current scope so to undo slides mode just put slides within a group and end the group wherever you want the slides settings to end 131 DeclareOption slides slides 132 newcommand slides 133 slidestrue 134 def lyricfont normalfont huge 135 def chorusfont slshape 136 def versejustify justifycenter 137 let chorusjustify versejustify 138 def placenote 1 justifycenter noindent 1 par 139 scriptureoff 140 onesongcolumny 141 ifSB preamble ifSB chordedspec else SB chordsoff fi fih 142 spenalty M 143 let colbotglue flushglue 144 setlength cbarwidth zo 145 NsetlengthNsbarheight zQ 146 54 justifyleft justifycenter unouter SB outer rawtext nopdf index noshading The justifyleft macro sets up an environment in which lyrics are left justified with hanging indentation equal to parindent It reserves spaces for verse num bers if used in a verse and reserves space
155. ge the song numbering style for a song section by redefining thesongnum For example to cause songs to be numbered A1 A2 etc in the current song section type renewcommand thesongnum A arabic songnum The expansion of thesongnum must always produce plain text with no font for matting or unexpandable macro tokens since its text is exported to auxiliary index generation files where it is sorted To change the formatting of song numbers as they appear at the beginning of each song redefine the printsongnum macro which expects the text yielded by as its only argument For example to typeset song numbers in italics atop each song define 26 songnumwidth nosongnumbers versenum theversenum printversenum versenumwidth noversenumbers placeversenum renewcommand printsongnum 1 it LARGE 1 The songnumwidth length defines the width of the shaded boxes that contain song numbers at the beginning of each song For example to make each such box 2 centimeters wide you could define setlength songnumwidth 2cm If songnumwidth is set to zero song numbers are not shown at all To turn off song numbering entirely type nosongnumbers This inhibits the display of the song number atop each song but song numbers are still be displayed elsewhere such as in indexes The same effect can be achieved by setting songnumwidth to zero Verse Numbering The versenum counter defines the next verse
156. gfret SB targstr SB targfing SB csify SB csify NSBOgttop SB gtinit SB gtinc SB gtset Lyrics under tablature diagrams look odd if they aren t aligned with the leftmost string of the diagram To accomplish this the following two macros record the amount by which a lyric under this tablature diagram must be indented to position it properly 2747 newif ifSB gettabind SB gettabindfalse 2748 newdimen SBO tabindent Reserve some macro names in which to store the three pieces of the second argu ment to the gtab macro The first is for the fret number the second is for the strings info and the last is for the fingering info 2749 newcommand SB targfret 2750 newcommand SB targstr 2751 newcommand SB targfing In general gtab macros often appear inside chord macros which means that their arguments have already been scanned by the time the gtab macro itself is expanded This means that catcodes cannot be reassigned without resorting to e TEX We therefore adopt the alternative strategy of converting each token in the strings and fingering arguments of a gtab macro into a control sequence us ing csname We can then temporarily assign meanings to those control sequences and replay the arguments to achieve various effects Convert all tokens in the first argument to control sequences and store the resulting sequence into the macro given by the first argument Store the length in tokens into counter reg
157. gram we must identify the maximum fret number in the strings argument This is accomplished by using the following macro in combination with SB gtset above 2785 newcommand SB gtmax 1 ifnum SB cnt lt 1 SBO cnt 1 fi A Ngtab macro begins by setting catcodes suitable for parsing a chord name as its first argument This allows tokens like and amp to be used for sharp and flat even when gtab is used outside a chord macro Colon is reset to a non active character while processing the second argument to avoid a potential conflict with Babel French 2786 newcommand gtab SB begincname SB gtab 2787 newcommand SB gtab 1 2788 SB endcname 2789 Nbegingroup 2790 catcode 12 relax 2791 SB gtab 1 2792 Y If transposition is currently taking place allow the user to customize the behavior by redefining gtabtrans Using gtab within gtabtrans should go directly to SB gtab otherwise an infinite loop would result 2793 newcommand SB gtab 2 2794 Nendgroup A 2795 ifnum SB transposefactor z0 2796 SB gtab 1 2 2797 else 2798 Nbegingroup 2799 let gtab SBO gtab 2800 gtabtrans 1 2 2801 endgroup 2802 fi 2803 136 gtabtrans 28 SBQ gtab 28 28 28 28 28 28 28 28 28 28 28 28 28 28 N N Qo O0 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 By default transposed guitar tablatures just display the transposed c
158. h However if the first mark is a SB lastcmark it means that this chorus should go after the last verse in the song There is no valid breakpoint there so to get a chorus into that spot we have to do a rather ugly hack We pull the bottom material off the box with unskip unpenalty and lastbox then insert the chorus then put the bottom material back on This works because the high level structure of the bottom material should be static Even if the user redefines makepostlude the new definition gets put in a single box that can be manipu lated with lastbox However if we ever change the high level structure we need to remember to change this code accordingly 660 else ifx SB temp SB lastcmark 661 global setbox 1 vbox 662 unvbox 1 663 unskip 664 ifdim sbarheight gt zo 665 setbox SB box lastbox 666 unskip unpenalty 667 ML 668 setbox SB box lastbox 669 unskip unskip 670 SB inversefalse SB prevversetrue SB stanzabreak 671 marks SB nocmarkclass SB nocmark 672 unvcopy SB chorusbox 673 vskip versesep vskip beforepostludeskip relax 674 nointerlineskip box SB box 675 ifdim sbarheight gt z0 676 nobreak vskip2 p plus p07 677 hrule height sbarheight width SB colwidth7 678 ML 679 yh 680 fi fizZ 681 Mi 682 End the current column inserting vertical space as needed This differs from column breaks produced with brk which does not introduce any empty vertical sp
159. hate eA 134 hyperlink 3193 3194 hyphenchar 2551 hyphenpenalty OAREN 2570 3161 I Nl Ag tne eatin bcos 2201 idxaltentry 3152 3314 3352 3362 3576 idxauthfont 121 3359 idxbgcolor 48 3304 idxblock environment pit Pd iin eh d 3151 idxbook 123 3337 idxcont 124 3330 idxentry 3152 3310 3346 3358 idxheadfont 117 3305 idxheadwidth 95 3305 idxlyricfont 119 3315 idxrefsfont 122 3312 3316 3348 3360 idxscripfont 120 3347 idxtitlefont 118 3311 if filesw 2934 if twoside 437 443 448 461 518 ifchorded 212 223 851 872 1256 1262 1343 1391 1397 1491 1503 2017 2638 3581 IfFileExists 5 3192 iflyric i222 82s 3581 ifmeasures 184 198 2429 2639 3581 Mifnolyrics 2536 3581 ifpartiallist VR iut 573 584 685 688 691 1456 3581 165 ifpdfindex ifrawtext 814 3581 176 3581 3621 ifrepchorus 250 311 559 798 1233 1326 1341 1366 1433 1437 3581 ifSB brokenword 2040 2542 2570 ifSB chordedspec 141 169 ifSB chorustop 1289 1391 1397 ifSB colorboxes 3581 3600 ifSB convertnotes 1715 1775 1782 ifSB doEOL 3624 3627 ifSB etex 1 267 1292 1504 ifSB firstchord 2066 2224 2228 MifSBOgettabind 2747 2822 2831 MifSBOgotchorus 1291 1327 1366 1437 ifSB inchorus 218 229 722 795 1181 1229 1283 1316 1357 1381 1
160. he most ordinary way to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty or else saying that you provide a warranty and that users may redistribute the program under these conditions and telling the user how to view a copy of this License Exception if the Program itself is interactive but does not normally print such an announcement your work based on the Program is not required to print an announcement These requirements apply to the modified work as a whole If identifiable sections of that work are not derived from the Program and can be reasonably considered independent and separate works in themselves then this License and its terms do not apply to those sections when you distribute them as separate works But when you distribute the same sections as part of a whole which is a work based on the Program the distribution of the whole must be on the terms of this License whose permissions for other licensees extend to the entire whole and thus to each and every part regardless of who wrote it Thus it is not the intent of this section to claim rights or contest your rights to work written entirely by you rather the intent is to exercise the right to control the distribution of derivative or collective works based on the Program In addition mere aggregation of another work not based on the Program with the Program or with a work based on the Program on a volume
161. he pdf bookmark index that is normally included in pdf files If not generating a pdf file this option has no effect Scripture Quotations The noscripture option omits scripture quotations see 8 2 from the output You can also turn scripture quotations on or off in the middle of the document by using scriptureon or scriptureoff respectively Shaded Boxes The noshading option causes all shaded boxes such as those that surround song numbers and textual notes to be omitted You might want to use this option if printing such shaded boxes causes problems for your printer or uses too much ink Partial Song Sets Often it is useful to be able to extract a subset of songs from the master document e g to create a handout or set of overhead slides for a spe cific worship service To do this you can type includeonlysongs songlist in the document preamble i e before the begin document line where songlist is a comma separated list of the song numbers to include For example includeonlysongs 37 50 2 creates a document consisting only of songs 37 50 and 2 in that order Partial books generated with includeonlysongs omit all scripture quota tions 88 2 and ignore uses of nextcol Nork Nsclearpage and between songs unless they are followed by a star e g To force a column or page break at a specific point in a partial book add the word nextcol brk sclearpage or scleardpage at the corresponding point in the
162. he section is intended to apply and the section as a whole is intended to apply in other circumstances It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system it is up to the author donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice This section is intended to make thoroughly clear what is believed to be a conse quence of the rest of this License 45 10 11 12 If the distribution and or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries so that distribution is permitted only in or among countries not thus excluded In such case this License incorporates the limitation as if written in the body of this License The Free Software Foundation may publish revised and or new versions of the General Public License from time to time Such new versions will be
163. hfont idxrefsfont idxbook idxcont colbotglue To just add some fields to the existing makeprelude or makepostlude with out having to redefine them entirely users can redefine extendprelude or extendpostlude By default the prelude has the scripture references followed by the authors and the postlude has the copyright info followed by the licensing info 115 newcommand extendprelude showrefs showauthors 116 newcommand extendpostlude songcopyright songlicense unskip Users can redefine idxheadfont to affect the font in which each capital letter that heads a section of a title index is rendered 117 newcommand idxheadfont sffamily bfseries LARGE Users can redefine idxtitlefont to affect the font in which song title index entries are rendered 118 newcommand idxtitlefont sffamily slshape Users can redefine idxlyricfont to affect the font in which notable lines of lyrics are rendered in a title index 119 newcommand idxlyricfont rmfamily Users can redefine idxscripfont to affect the font in which scripture references are rendered in a scripture index 120 newcommand idxscripfont sffamily small slshape Users can redefine idxauthfont to affect the font in which contributor names are rendered in an author index 121 newcommand idxauthfont small bfseries Users can redefine idxrefsfont to affect the font in which the list of song refer ences on the right hand side of an index entry is
164. hopefully allowing processing to continue 727 newcommand SB closeall The current song s scripture references authors copyright info and copyright license information are stored in these macros 728 newcommand SB rawrefs 729 newcommand songauthors 730 newcommand songcopyright 731 newcommand songlicense When the user asks for the song s scripture references rather than give them the raw token list that the author entered we return a prettier version in which spaces dashes and penalties have been adjusted The prettier version is stored in the following control sequence 732 newcommand songrefs The user sets the licensing info for the current song with this command 733 newcommand setlicense gdef songlicense Defining a new key for beginsong is just like the keyval package s define key macro except that we must also define some initializer code for each key This provides an opportunity to clear registers before each song Otherwise when a key wasn t specified we d inherit the old values from the previous song 734 newcommand SB clearbskeys 735 newcommand newsongkey 2 736 expandafter gdef expandafter SB clearbskeys expandafter 737 SB clearbskeys 2 7 738 define key beginsong 1 739 Y 73 song beginsong SB beginsong SB bsoldfmt SB bskvfmt SB beginsong Define keys sr by cr 1i index and ititle for scripture references authors copyright info li
165. hord name and omit the diagram Transposing a tablature diagram requires manual judgment calls for most stringed instruments so we can t do it automatically 04 newcommand gtabtrans 2 transposehere 1 Typeset a full tablature diagram Text arg1 is a chord name placed above the diagram Text arg2 consists of a colon separated list of 1 an optional fret number placed to the left of the diagram 2 a sequence of tokens each of which can be X to place an x above the string 0 or 0 to place an o above the string or one of 1 through 9 to place a filled circle on that string at the fret of the given number and 3 an optional sequence of tokens each of which is either O no fingering information for that string or one of 1 through 4 to place the given number under that string 05 newcommand SB gtab 2 06 let SB targfret empty 07 let SB targstr Gempty 08 let SB targfing empty 09 NXSBOtabargsit2 NSBOtabargs 0 ifx SB targstr Cempty 1 def SB targstr 0 0 0 0 0 0 2 Mil 3 ifvmode leavevmode fif 4 vbox 5 normalfont normalsize 6 setbox SB box hbox 7 thinspace printchord transposehere 1 strut thinspace 8 th 9 setbox SB boxii hbox SB fretnum SB targfret 20 setbox SB boxiii hbox SB gttop SB targstr 21 hsize wd SB box 22 MifSBOgettabind 23 NglobalNSBOtabindent WdNSBOboxii 24 global advance SB tabindent 5NSBOfretwidth 25 global advance SB tabindent
166. hord to determine if hyphenation might be necessary The original lyric text might have ended in a string of one or more explicit hyphens enumerated by SB numhyps If it ended in exactly one the lyric scanning code suppresses that hyphen so that we can here add a new hyphen that floats out away from the word when the chord above it is long If it ended in more than one e g the encoding of an en or em dash then the lyric scanner leaves it alone we must not add any hyphenation or float the dash away from the word There is also code here to insert a penalty that discourages linebreaking imme diately before lyricless chords Beginning a wrapped line with a lyricless chord is undesirable because it makes it look as though the wrapped line is extra indented due to the empty lyric space below the chord It should therefore happen only as a last resort 17 SB dimen wd SB chordbox 18 ifvmode leavevmode fi 19 SB brokenwordfalse 20 ifdim wd SB lyricbox gt ze 21 ifdim SB dimen gt wd SB lyricbox 22 ifSB wordends else SB brokenwordtrue fiZ 23 f i 24 else 25 SB skip lastskip 26 unskip penalty200 hskip SB skip 27 Mif 28 ifnum SB numhyps gt z 7 29 ifnum SB numhyps gt ne 30 SB brokenwordfalse 31 else 32 SB brokenwordtrue 33 f i 34 Mil If lyrics are suppressed on this line e g by using nolyrics then just typeset the chord text on the natural baseline 2535 NSBOtestfalse 2536
167. hould be inserted when repchoruses is active SB lastcmark three kinds of marks are inserted into song boxes SB cmark is used to mark SB nocmark places where a chorus might be inserted between verses and SB lastcmark marks a place where a chorus might be inserted after the last verse of the song Both marks are e TEX marks of class SB cmarkclass to avoid disrupting the use of standard TEX marks Each time a chorus is automatically inserted SB nocmark is inserted with mark class SB nocmarkclass just above it and at the top of each additional page it spans This inhibits future chorus inserts until the already inserted chorus has been fully committed to the output file Otherwise some choruses could get auto inserted multiple times at the same spot possibly even leading to an infinite loop 1306 newcommand SB cmark 1307 def SB cmark SB cmark 1308 newcommand SB lastcmark 1309 def SB lastcmark SB lastcmark 1310 newcommand SB nocmark 1311 def SB nocmark SB nocmark 90 chorus beginchorus SB beginchorus Start a new chorus If repchoruses is active and this is part of the first set of consecutive choruses in the song then include it and its preceding vertical material in the SB chorusbox for possible later duplication elsewhere 312 newenvironment chorus beginchorus SB endchorus 313 newcommand beginchorus 314 ifSB insong 315 ifSB inverse SB errbcv endverse fif 316 ifSB inchorus SB e
168. i 3 2033 2034 if fileswh 2935 ifx SB out relax 2936 newwrite SB out 2937 immediate openout SB out jobname sxc relax 2938 MR 2939 immediate write SB out noexpand SB iwrite 3 2 2940 Ni 2941 Define a new title index The first argument is an identifier for the index used in constructing index specific control sequence names The second argument is a filename root auxiliary file arg2 sxd is where the index data is stored at the end of processing 2942 newcommand newindex SB newindex1 TITLE INDEX DATA FILE 2943 onlypreamble newindex 141 newscripindex Define a new scripture index This is exactly like newindex except that scripture references are added to the auxiliary file instead of titles 2944 newcommand newscripindex SB newindex2 SCRIPTURE INDEX DATA FILE 2945 onlypreamble newscripindex newauthorindex Define a new author index This is exactly like newindex except that author info is added to the auxiliary file instead of titles 2946 newcommand newauthorindex SB newindex3 AUTHOR INDEX DATA FILE 2947 onlypreamble newauthorindex SB cwrite Write index data to a Song indeX Combined sxc auxiliary file The first ar gument is the identifier for the index to which the data ultimately belongs The second argument is the data itself The write is non immediate so that it is only output if its enclosing song is ultimately shipped to the output file 2948 newcommand SB cwrite 2
169. ial is controlled by skips afterpreludeskip and beforepostludeskip This glue can be made stretchable for centering effects For example to cause each song body to be centered on the page with one song per page you could write 1 afterpreludeskip 2pt plus 1fil beforepostludeskip 2pt plus 1fil The vertical distance between the baselines of consecutive lines of lyrics is computed by the songs package based on several factors including the lyric font size the chord font size if in chorded mode and whether slides mode is cur rently active You can adjust the results of this computation by redefining skip register baselineadj For example to reduce the natural distance between base lines by 1 point but allow an additional 1 point of stretching when attempting to balance columns you could define baselineadj 1pt plus 1pt minus Opt To change the vertical distance between chords and the lyrics below them redefine the clineparams macro with a definition that adjusts the ATEX param eters baselineskip lineskiplimit and lineskip For example to cause the baselines of chords and their lyrics to be 12 points apart with at least 1 point of space between the bottom of the chord and the top of the lyric you could write renewcommand clineparams baselineskip 12pt lineskiplimit 1pt Mineskip 1pt The width of the vertical line that appears to the left of choruses is controlled by the cbarwidth length To eliminate the
170. idx 1 renewcommand idxentry 2 7 SB ellipspread idxtitlefont relax ignorespaces 1 unskip idxrefsfont relax 2 F renewcommand idxaltentry 2 152 3315 SB ellipspread idxlyricfont relax ignorespaces 1 unskip 3316 idxrefsfont relax 2 3317 M4 3318 SB displayindex 3319 SB idxcolhead In a scripture index this macro remembers the current book of the bible we re in so that new columns can be headed with Bookname continued 3320 newcommand SB idxcolhead SB idxheadsep Add vertical space following the header line that begins or continues a section of a scripture index 3321 newcommand SB idxheadsep 3322 SB dimen4 p 3323 NadvanceMSBOdimen Nprevdepth 3324 SB maxmin SB dimen lt zo 3325 NSBOdimeniiNSBOdimen 3326 SB maxmin SB dimenii gt po 3327 vskip SB dimen plus p minus SB dimeniiZ 3328 SB idxcont Typeset the Bookname continued line that continues a scripture index section when it spans a column break 3329 newcommand SB idxcont 1 7 3330 hbox to hsize idxcont 1 hfil 3331 nobreak 3332 SB idxheadsep nointerlineskip 3333 SB makescripindex Create a scripture index arg1 is a column count arg1 is the title and arg2 is the index identifier which was passed to newscripindex 3334 NnewcommandNSBOmakescripindexi 3335 renewenvironment SB lgidx 1 3336 gdef SB idxcolhead 1 3337 hbox to hsize idxbook
171. ifdim ht SB box gt z advance SB dimen po repeat box SB boxiiif global setbox SB boxii box voidb x vbadness SB cnt vfuzz SB dimeniiZ showindex Create an index with title arg2 based on the data associated with index identifier arg3 which was passed to newindex Optional argument arg1 specifies the number of columns This macro calls the appropriate index creation macro depending on the type of index that arg3 was declared to be 3289 newcommand showindex 3 0 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 ifundef ined SB idxse10 3 SB errnoidx 3 1 expandafter let expandafter SB temp csname SB idxsel 3 endcsname SB cnt 1 relax ifnum SB cnt lt ne SB cnt SBOtemp232 relax fi4 expandafter SB temp expandafter SB maketitleindex expandafter SB makescripindex expandafter SB makeauthorindex expandafter the SB cnt 2 3 F SB maketitleindex Create a song title index arg1 is a column count arg2 is the title and arg is the index identifier which was passed to newindex 3302 newcommand SB maketitleindex 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 renewenvironment SB lgidx 1 hbox SB colorbox idxbgcolor vbox hbox to idxheadwidth idxheadfont relax 1 hfil 333 nobreak vskip3 p0 plus2 p0 minus2 p nointerlineskip penalty 50 vskip5 p0 plus5 p minus4 po renewenvironment SB sm
172. illy Bob Words separated by a macro space u or tie 7 instead of a regular space are treated as single words by the indexer For example The Vienna Boys Choir is indexed as Choir The Vienna Boys but The ViennaN Boys V Choir is indexed as Vienna Boys Choir The cr li setlicense sr beginverse endverse beginchorus endchorus Copyright Info The cr copyright keyval specifies the copyright holder of the song if any For example cr copyright 2000 ABC Songs Inc Copyright information is typeset in fine print at the bottom of the song Licensing Info Licensing information is provided by 1i license where license is any text Licensing information is displayed in fine print under the song just after the copyright information if any Alternatively writing setlicense license anywhere Pee eee and lines is equivalent to using 1i license in the line When many songs in a book are covered by a common license it is usually convenient to create a macro to abbreviate the licensing information For exam ple if your organization has a music license from Christian Copyright Licensing International with license number 1234567 you might define a macro like newcommand CCLI CCLI 1234567 Then you could write 1i CCLI in the line of each song covered by CCLI Scripture References The songs package has extensive support for scripture citations and indexes of scripture cit
173. in macro code 1820 NnewcommandNSBOtrgroup 1 1821 SB toks expandafter the SBOtoks 1 1822 SB trscanZ 1823 105 SB trspace A space or end brace lies next in the input stream It has already been added to the token list so skip over it 1824 NnewcommandNSBOtrskipi 1825 NafterassignmentNSBOtrscan 1826 let SB next sB trstep A non grouping token lies next in the input stream Consume it as an argument to this macro and then test it to see if it s a note letter or some other recognized item If so process it otherwise just append it to the token list and continue scanning 827 newcommand SB trstep 1 7 828 MletNSBOdonext NSBOtrscan 820 ifcat noexpand SB next A 830 ifnum uccode 1 1 831 def SB temp 1 832 let SB dothis SBO trnotey 833 else 834 SB toks expandafter the SBO toks 1 835 f i 836 else ifx SB next SB trend 837 let SB donext relax 838 else 839 SB toks expandafter the SB toks 1 840 fi fiz 841 SB donext 842 SB trnote We re in the midst of processing a sequence of uppercase letters that might com prise a note name Check to see if the next token is an accidental sharp or flat or yet another letter 843 newcommand SB trnote 844 ifcat noexpand SB next A 845 let SB donext SB trnotestep 846 else ifnum SB transposefactor z0 847 SB cnt ze 848 MletNSBOdonextNSBOtrtrans 849 else ifx SB next f1t 850 NSBOcnt Nn One 851 let SB
174. index ititle indexentry indextitleentry Sing as a two part round Textual notes can be placed anywhere within a song either within verses and choruses or between them Guitar Capos One special kind of textual note suggests to guitarists a fret on which they should put their capos Macro capo n should be used for this pur pose It normally has the same effect as Wusicnote capo n however if the mee is active then it instead has the effect of transposel n F See 810 for more information on automatic chord transposition 7 9 Index Entries Every song automatically gets entries in the current section s title index es How ever you can also add extra index entries for a song to any index Indexing Lyrics For example title indexes often have entries for memorable lines of lyrics in a song in addition to the song s title You can add an index entry for the current song to the section s title index es by adding index lyrics to the song s Nbeginsong line For example beginsong Doxology index Praise God from Whom all blessings flow causes the song to be indexed both as Doxology and as Praise God from Whom all blessings flow in the section s title index es You can use index multiple times in a beginsong line to produce multiple additional index entries Index entries produced with index lyrics are typeset in an upright font instead of in italics to distinguish them from song
175. ious option settings We wait to define these iflyric since if any are used earlier than this it is an error in the package code and we d ifslides rather get an error than continue ifmeasures 3581 newif ifchorded ifpartiallist 3582 newif iflyric lyrictrue ifrepchorus 3583 newif ifslides iftranscapos 3584 newif ifmeasures ifnolyrics 3585 newif ifpartiallist ifrawtext 3586 newif ifrepchorus ifpdf index 3587 newif iftranscapos 3588 newif ifnolyrics 3589 newif ifrawtext 3590 newif ifpdfindex pdfindextrue 3591 newif ifsongindexes songindexestrue ifSB omitscrip 3599 newif ifsepindexes sepindexestrue ifsongindexes ifsepindexes ifSB colorboxes 160 3593 newif ifSB colorboxes SB colorboxestrue 3594 newif ifSB omitscrip nolyrics The nolyrics macro is just shorthand for nolyricstrue 3595 newcommand nolyrics 3596 let nolyrics nolyricstrue Finally we re ready to process all of the package options This is delayed until near the end because the option processing code needs to execute various macros found in the previous sections 3597 SB chordson 3598 ProcessOptions relax If we re not generating a pdf then don t generate the pdf index 3599 if SB pdf else pdfindexfalse fi SB colorbox Include the colors package and define colors if requested 3600 if SB colorboxes 3601 RequirePackage color 3602 definecolor SongbookShade gray 80 3603 newcommand SB colorbox 2 36
176. is best based on penalty settings see and Nspenalty The value of spenalty controls the undesirability of column breaks at song boundaries Usually it should be set to a value between 0 and so that breaks between songs are preferable to breaks between verses within a song By default it is set to 100 When it is 10000 or less breaks between songs are required so that each song always begins a fresh column 11 6 Indexes Index Appearance By default the right hand side of each index entry con tains a list of one or more song numbers To instead list page numbers use the indexsongsas macro indexsongsas id thepage where id is the same identifier used in the Nnewauthorindex or macro that created the index The second argument must al ways be something that expands into raw text without any formatting since this text gets output to auxiliary files that are lexographically sorted by the index generation program To go back to indexing songs by song number use Nchesongnun in place of thepage in the above Indexes are by default typeset on separate pages and when an index is suffi ciently small it is centered on the page in one column To disable these defaults write Nsepindexesfalse This causes indexes to avoid using unnecessary ver tical space or starting unnecessary new pages To re enable the defaults use sepindexestrue To control the formatting of the list of references on the right hand side of index ent
177. ister SB cnt 2752 newcommand SB csify 2 2753 SB toks 2754 SB cnt ze 2755 SB csify 2 SBO csify 2756 edef 1 the SB toks 2757 2758 newcommand SB csify 1 2759 ifx 1 SB csify else 2760 NadvanceNSBOcntNOne7 2761 SB toks expandafter the SB toks csname 1 endcsname 2762 expandafter SBO csify 2763 fi 2764 Different meanings are assigned to digits X s and 0 s depending on whether we are currently typesetting the material overtop the diagram the interior of the diagram or the fingering numbers below the diagram These meanings are set by SB gttop SB gtinit amp SB gtinc and SB gtset respectively 2765 newcommand SB gttop 2766 let X SB topX let 0 SBGtop0 let 0 0 let 1 SB topempty 2767 let 2 1 let 3 1 let 4 1 let 5 1 2768 let 6 1 let 7 1 let 8 1 let 9 1 135 SB gtmax gtab SB gtab SB gtab 2769 2770 newcommand SB gtinit 2771 let X SB fretempty let 0 X let O X let 1 SBO frethit7 2772 let 2 X let 3 X let 4 X let 5 X7 2773 let 6 X let 7 X let 8 X let 9 X7 2774 2775 newcommand SB gtinc 2776 let 9 8 let 8 7 let 7 6 let 6 5 let 5 4 2777 let 4 3 let 3 2 let 2 1 let 1 0 2778 2779 newcommand SB gtset 2 A 2780 let X 1 let 0 X let O X 2781 def 1 21 def 2 22 def 3 23 2782 def 4 24 def 5 25 def 6 26 2783 NdefNT E27 Ndef N8 428 Ndef 9 29 2784 To compute the height of the tablature dia
178. ive the macro acts like transpose See 87 8 for more information Enharmonics When using transpose to automatically transpose the chords of a song the songs package code chooses between enharmonically equivalent names for black key notes based on the first chord of the song For example if transpose 1 is used and if the first chord of the song is an E then all A chords that appear in the song are transcribed as B chords rather than A chords since the key of F major E transposed up by one half step has a flatted key signature Usually this guess produces correct results but if not you can use either preferflats or prefersharps after the transpose line to force all transcription to use flatted names or sharped names respectively when resolving enharmonic equivalents Modulated Verses Automatic transposition can be used in conjunction with chord replaying see to produce modulated verses For example beginverse memorize F This is a B F memorized F verse E amp 7 endverse transpose 2 This verse is modulated up two half steps produces I FH B FR FH Ew This is a memorized verse Ap D A A This verse is modulated up two half steps Both Keys By default when chords are automatically transposed using only the transposed chords are printed However in some cases you may wish to print the old chords and the transposed chords together so that musicians playing transposing and
179. iveness level of the song positioning algorithm See the macros above for what each level does 488 newcommand songpos 1 A 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 ifcase 1 let SB selectcol relaxy let SB spos relax Vor let SB selectcol SB selectcoly let SB spos SB sposiZ Vor let SB selectcol SB selectcoly let SB spos SB sposiif Vor let SB selectcol SB selectcoly let SB spos SB sposiiiZ else SB errspos Mi SB spos The SB spos macro gets redefined by Nsongpos above depending on the current song positioning aggressiveness level By default it is set to level 3 505 newcommand SB spos 506 songpos thr SB clearpage Output all contributed material as a new page unless there is no contributed material In that case do nothing i e don t produce a blank page 507 NnewcomnandNSBOclearpagei 508 509 510 511 512 513 514 515 NSBOtesttrue ifvoid SB pgbox ifvoid SB colbox SB testfalse fi fi4 if SB test SB cnt SBGnumcols advance SB cnt SB colnum SB nextcol SB cnt lastcolglue ML SB cleardpage Like SB clearpage but shift to a fresh even numbered page in two sided doc uments Note that this differs from IATEX s cleardoublepage which shifts to 66 SB stype SB stypcol SB styppage odd numbered pages Song books prefer starting things on even numbered pages because this maximizes the distance until the next page t
180. justified with hanging indentation equal to parindent 51 newcommand versejustify justifyleft 52 newcommand chorusjustify justifyleft Textual notes are fully justified when they are too long to fit in a single line 53 newcommand notejustify 54 advance baselineskip p relax 55 leftskip z skip rightskip z skip 56 parfillskip flushglue parindent zo 57 Textual notes are placed flush left The single argument to this macro is horizontal material that comprises the note Usually it will consist of various hboxes and specials that were produced by colorbox 58 newcommand placenote 1 7 59 leftskip z skip rightskip flushglue SB cbarshift 60 noindent 1 par 61 49 thesongnum songnumstyle theversenum versenumstyle printsongnum printversenum placeversenum everyverse everychorus printchord chordlocals These counters define the current song number and verse number They can be redefined by the user at any time 62 newcounter songnum 63 newcounter versenum By default the song numbering style will simply be an arabic number Redefine thesongnum to change it The songnumstyle macro is obsolete and exists only for backward compatibility 64 renewcommand thesongnum songnumstyle songnum 65 newcommand songnumstyle 66 let songnumstyle arabic By default the verse numbering style will simply be an arabic number Redefine theversenum to change it The vers
181. k that uses the equivalent solfedge names You could achieve this by using the notenamesin macro to tell the songs package which note names you typed in the input file and then using notenamesout to tell the songs package how you want it to typeset each note name in the output file The final code looks like this notenamesin A B C D E F G notenamesout LA SI DO RE MI FA SOL The syntaxes of notenamesin and notenamesout are identical to that of see above except that the arguments of notenamesout can consist of any TX code that is legal in horizontal mode not just uppercase letters To stop converting between note names use Nalphascale solfedge or notenames to reset all note names back to identical input and output scales Transposing Chords In Macros The automatic transposition logic won t find chord names that are hidden inside macro bodies For example if you abbre viate a chord by typing newcommand mychord H shrp sus4 QNshrp eransposepa mychord then the macro fails to transpose it the resulting chord is still an F sus4 C chord To fix the problem you can use transposehere in your macros to explicitly invoke the transposition logic on chord names embedded in macro bodies The above example could be corrected by instead defining 25 notrans gtabtrans songnum thesongnum printsongnum newcommand mychord transposehere H shrp sus4 QNshrp H Transposition can b
182. latSize xiipt xipt 2601 DeclareFlatSize xivpt xiipt 2602 DeclareFlatSize Oxviipt xivpt 2603 NDeclareFlatSizeVOxxptVOxviipt 2604 DeclareFlatSize xxvpt xxpt SB flatsize Select the correct flat symbol size based on the current font size 2605 NnewcommandNSBOflatsizei 2606 ifundefined SB flatsize f size 2607 expandafter fontsize 2608 csname SB flatsize f size endcsname f baselineskip 2609 selectfont 2610 2611 In the following code the ch mch and macros are each defined to be a single macro that then expands to the real definition This is necessary because the top level definitions of each must stay the same in order to allow the lyric scanning code to uniquely identify them yet their internal definitions must be redefined by code that turns chords and or measure bars on and off Such code redefines SB ch SB mch SB bracket and SB rechord to effect a change of mode without touching the top level definitions ch The ch macro puts a chord atop a ligature without breaking the ligature Nor SB ch mally this just means placing the chord midway over the unbroken ligature ig SB ch on noring the third argument completely However when a previous chord macro SB ch encounters it while scanning ahead in the input stream to parse its lyric the ch SB ch macro itself is not actually expanded at all Instead the chord macro scans ahead SB ch off spots the ch macro gobbles it and then st
183. licate process The following does so by consulting Nneaning 2080 newcommand SB outertest 2081 edef SB outertest 1 2082 noexpand SB outertest 1 113 SBOUTFtest SB two SBO three SB f our NSBOUTFtester DeclareLyricChar DeclareNonLyric DeclareNoHyphen SB declare 2083 NstringNouter 2084 noexpand SB outertest 2085 2086 newcommand SB outertest 2087 expandafter def expandafter SBQ outertest 2088 expandafter expandafter1 string outer 2 SB outertest 2089 def SB temp 2 2090 ifx SB temp empty else SB testtrue fi4 2091 To support UTF 8 encoded TEX source files we need to be able to identify multibyte characters during the lyric scanning process Alas the utf8 def file provides no clean way of identifying the macros it defines for this purpose The best solution seems to be to look for any token named UTFviii octets in the top level expansion of the macro 2092 newcommand SBOUTFtest 2093 NedefNSBOUTFtestit 7 2004 noexpand SBOUTFtester 17 2095 string UTFviii zero octets 2096 noexpand SB UTFtester 2097 2098 begingroup 2099 escapechar m ne 2100 xdef SB two string two 2101 xdef SB three string three 2102 xdef SB four string four 2103 xdef SB temp string octets 2104 endgroup 2105 edef SB temp 1 string UTFviiiO 2 SBOtemp 3 2106 expandafter def expandafter SBOUTFtester SB temp SBOUTFtester 2107 def SB temp 2 2108 ifx
184. line entirely and the spacing around it you can set cbarwidth to Opt setlength cbarwidth 0pt The height of the horizontal line that appears between each pair of songs is controlled by the sbarheight length To eliminate the line entirely and the spacing around it you can set sbarheight to Opt setlength sbarheight 0pt 29 extendprelude showauthors showrefs extendpostlude makeprelude makepostlude vvpenalty ccpenalty vcpenalty cvpenalty brkpenalty Song Top and Bottom Material You can adjust the header and footer ma terial that precedes and concludes each song by redefining extendprelude and extendpostlude By default extendprelude displays the song s authors and scripture refer ences using the macros showauthors and showrefs The following definition changes it to also print copyright info renewcommand extendprelude showrefs showauthors bfseries songcopyright par F By default extendpostlude prints the song s copyright and licensing in formation as a single paragraph using Nsongcopyright and songlicense The following definition changes it to also print the words Used with permission at the end of every song s footer information renewcommand extendpostlude songcopyright unskip Used with permission In general any macro documented in d12 can be used in extendprelude and Vextendpostlude to print song information such as and For conveni
185. lly based on the type of index and number of columns 3176 newcommand SB oneidxpage SB displayindex Create an index with title arg2 and with arg1 columns must be a literal constant Input the index contents from external file arg3 which is expected to be a TEX file 3177 newcommand SB displayindex 3 3178 ifsongindexes begingroup 3179 SB colwidth hsize 3180 advance SB colwidth 1 columnsep 3181 advance SB colwidth columnsep 3182 divide SB colwidth 17 3183 setbox SB idxtitlebox vbox 3184 let SB temp songsection 3185 ifx chapter undefined else 3186 ifx chapter relax else 3187 let SBO temp songchapter 3188 f ik 3189 ML 3190 SB temp 2 3191 th 149 The sbx index file might not exist e g if this is the first pass through the TEX compiler If it exists first try typesetting its content as a small index one column centered with no divisions 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 IfFileExists csname SB idxfilename 3 endcsname sbx ifx hyperlink undefined let hyperlink secondoftwo fi ifx hyperlink relax let hyperlink secondoftwo fi Mifsepindexes global setbox SB box vbox null vfil unvcopy SB idxtitlebox vskip 5in minus 3in relax hbox to hsize nfil vbox 7 SB idxsetup renewenvironment idxblock 1 begin SB smidx 1 end SB smidx le
186. macros For example renewcommand notebgcolor red By default chords are typeset in sans serif oblique slanted font You can customize chord appearance by redefining printchord which accepts the chord text as its argument For example to cause chords to be printed in roman boldface font you could define renewcommand printchord 1 rmfamily bf 1 Accidental Symbols By default sharp and flat symbols are typeset using IXTEX s Mt 42 and flat b macros Users can change this by redefining sharpsymbol and flatsymbol For example to use sharp f instead of one could redefine sharpsymbol as follows renewcommand sharpsymbol ensuremath sharp Verse and Chorus Titles The everyverse macro is executed at the begin ning of each verse and everychorus is executed at the beginning of each chorus Thus to begin each chorus with the word Chorus one could type renewcommand everychorus textnote Chorus 28 Nversesep afterpreludeskip bef orepostludeskip baselineadj clineparams cbarwidth sbarheight Spacing Options The vertical distance between song verses and song choruses is defined by the skip register versesep For example to put 12 points of space between each pair of verses and choruses with a flexibility of plus or minus 2 points you could define versesep 12pt plus 2pt minus 2pt The vertical distance between the song s body and its prelude and postlude mater
187. main entrypoint to the lyric scanner code 2225 newcommand SB chord 2226 def SB chord 1 2227 SB endcname 2228 NifSBOfirstchord 2229 setbox SB lyricbox hbox kern SB tabindent 2230 NglobalNSBOtabindentVzQ 2231 SB lyric 2232 SB numhyps z 2233 NSBOspcinit 2234 setbox SB chordbox box voidb xy 2235 fik 2236 SB setchord 1 2237 SB firstchordfalse 2238 let SB dothis SB chstart 2239 SB chscan 2240 MultiwordChords The SB spcinit macro is invoked at the beginning of the lyric scanning process SB spcinit By default it does nothing but if MultiwordChords is invoked it initializes the lyric scanner state to process spaces as part of lyrics 224 224 224 224 224 224 224 224 224 1 2 3 OA Naa A newcommand SB spcinit newcommand MultiwordChords def SB spcinit let SB chdone SB chlyrdone def SB chimpspace let SB donext SB chdone def SB chexpspace let SB donext SB chdone let SB chespace SB chendspace F 118 SB chscan SB chmain SB chstart This is the main loop of the lyric scanner Peek ahead at the next token without consuming it then execute a loop body based on the current state SB dothis and finally go to the next iteration SB donext 2250 newcommand SB chscan 2251 let SB nextname relax 2252 futurelet SB next SB chmain 2253 2254 newcommand SB chmain SB dothis SB donext Warning In the lyric scann
188. memorize 2655 2656 newcommand SB memorize 2657 def SB memorize 1 2658 ifundefined SB cr 1 SB errreg 1 1 2659 SB trackchtrue 2660 global expandafter let expandafter SB cregy 2661 csname SB cr 1 endcsname 2662 global SB creg 2663 4 2664 replay Saying replay stops any memorization and begins replaying memorized chords MSBOreplay 2665 newcommand replay ifnextchar SB replay SB replay SB replay 2666 newcommand SBGreplay 2667 def SB replay 1 2668 ifundefined SB cr 1 SB errreg 1 1 2669 SB trackchfalsey 2670 global expandafter let expandafter SB cregy 2671 csname SB cr 1 endcsname 2672 global SB ctail SB creg 2673 2674 2675 newcommand SB G replay 2676 SB trackchfalse 2677 NglobalNSBOctailNSBOcreg 2678 SB rechord Replay the same chord that was in a previous verse SB rechord 2679 newcommand SB rechord 2680 newcommand SB rechord 2681 SB ifempty SB ctail 2682 SB errreplay 2683 SB toks 2684 let SB donext gobble 2685 HL 2686 NSBOlopNSBOctailNSBOtoks 2687 Met NSBOdonextNSBOchord 132 2688 let SB noreplay gobble 2689 YA 2690 expandafter SB donext the SB toks 2691 ifSB nohat The ifSB nohat conditional is set to false when a chord macro contains a in its argument This suppresses the recording mechanism momentarily so that replays will skip this chord 2692 NnewifNifSBOnohat SB
189. most recently submitted song box The IATEX primitive that should be used to contribute each box is specified in the first argument 363 newcommand SB putboxes 1 364 SB dimen ifnum SB numcols gt z ht SB colbox else p fih 365 1 SB colbox 366 ifdim SB dimen gt z 367 NSBObreakpointNspenalty 368 ifdim sbarheight gt z 369 vskip sbarheight relax 370 M 371 Mif 372 1 SB songbox 373 Force n column breaks where n is given by the first argument The first created column is finished with the glue specified in the second argument When the second argument is flushglue this forces a break that leaves whitespace at the bottom of the column When it s colbotglue it acts like a natural column break chosen by the page breaker However if the current column is empty flushglue is always used so that an empty column will result 62 SB selectcol SB selectcol 374 newcommand SB nextcol 2 375 ifnum 1 gt zo 376 ifnum SB numcols gt z 377 global setbox SB colbox vbox 378 SB cnt 1 relax 379 SB dimen ht SB colboxy 380 unvbox SB colbox 381 unskip 382 ifdim SB dimen gt ze 383 vskip 2 relax 384 break 385 advance SB cnt m ne 386 fi 387 loop ifnum SB cnt gt zo 388 nointerlineskip 389 null 390 vfil 391 break 392 advance SB cnt m ne 393 repeat 394 A 395 SB output 396 else 397 ifnum lastpenalty M null fi 398 breaky 39
190. n easier alternative we here define Am to typeset chords 2627 newcommand SB loadactives 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 catcode amp active catcode active catcode active catcode active global let amp f1t global let shrp global let measurebar global let SB activehat gdef SB loadactives 7 catcode ifchorded active else9 fi catcode ifmeasures active else9 Mi def SB bracket 16 12 Chord Replaying SB trackch While inside a verse where the chord history is being remembered for future verses SB trackch is true 2643 newif ifSB trackch SB cr Reserve token registers to record a history of the chords seen in a verse 2644 newtoks SB cr 2645 newtoks SB ctail sB creg The following control sequence equals the token register being memorized into or replayed from 2646 newcommand SB creg 131 newchords Allocate a new chord replay register to hold memorized chords 2647 newcommand newchords 1 2648 ifundefined SB cro 1 2649 expandafter newtoks csname SB cr 1 endcsname 2650 global csname SB cr 1 endcsname 2651 SBGerrdup 1 2652 memorize Saying memorize throws out any previously memorized list of chords and starts SB memorize memorizing chords until the end of the current verse or chorus 2653 newcommand memorize 2654 ifnextchar SBO memorize SB
191. n multiple columns As a result it includes elaborate support for many features not found in most other packages such as automatic column balancing completely customizable song header and song footer blocks and facilities for adding beautiful scripture quotations to fill in gaps between songs Indexes Another major feature of the songs package is its support for a vari ety of different index types most notably indexes arranged by scripture reference Scripture indexes can be invaluable for planning services around particular ser mons or topics The songs package allows book authors to specify the names and preferred ordering of books of the bible and automatically handles complex issues like overlapping verse ranges to produce an easy to read compact and well ordered index Other supported indexes include those sorted by author by title and by notable lines of lyrics Automatic Transposition The songs package has a facility for automatically transposing songs and even generating chord books that print the chords in mul tiple keys e g so that a pianist and guitarist using a capo can play together from the same book The songs package was developed entirely independently of all other IATEX song book packages I originally developed the set of IATEX macros that eventually became the songs package in order to typeset a song book for the Graduate 42 Christian Fellowship GCF at Cornell University and the Cornell International
192. nd SB chegrpouter SB nextname to its stringified name so that SB emitchord will know whether SB chegrpname SB chegrpdone 124 to add hyphenation Therefore we temporarily consume the end group brace then scan the next token without consuming it and finally reinsert the end group brace and stop 2439 newcommand SB chegroup 2440 let SB nextname relax 2441 NafterassignmentNVSBOchegrpscan 2442 let SB next 2443 newcommand SB chegrpscan j 2444 futurelet SB next SB chegrpmacroh 2445 2446 newcommand SB chegrpmacro 2447 ifcat noexpand SB next relax 2448 expandafter SB chegrpouter 2449 else 2450 expandafter SB chegrpdone 2451 fi 2452 2453 newcommand SB chegrpouter 2454 NSBOtestfalse 2455 expandafter SB outertest expandafter meaning SBO next 2456 ifSB test 2457 expandafter SB chegrpdone 2458 else 2459 expandafter SB chegrpname 2460 fi 2461 2462 newcommand SB chegrpname 1 C 2463 edef SB nextname string 1 2464 SB chegrpdone 1 2465 2466 newcommand SB chegrpdone SB chdone egroup SB chlig We ve encountered a ch chord over ligature macro or an mch measurebar and SB mchlig chord over ligature macro Consume it and all of its arguments and load them into some registers for future processing Part of the ligature might fall into this lyric text or might not depending on if we decide to add hyphenation Then end the lyric text here
193. nd SB nextname Append an explicit space token catcode 10 to a token register This is a useful macro to have around because inlining this code directly into a larger macro is harder than it seems If you write the following code but with an explicit control sequence instead of 1 then the space immediately following the name will get stripped by the TEX parser But invoking the following macro with a control sequence as an argument works fine because in that case the explicit space has already been tokenized when this macro was first defined and won t be stripped as it is expanded 962 newcommand SB appendsp 1 1 expandafter the 1 Parse a list of song titles This just involves removing leading and trailing spaces from around each title in the separated list 963 newcommand SB parsetitles 1 964 begingroup 965 global SB titlelist 966 SB toks 967 let SBCtitlesep 968 let SB dothis SB pthead 969 SB ptstart 1 SB endparse 970 endgroup 971 The iterator of the title parser loop just scans the next token 972 newcommand SB ptstart futurelet SBO next SB dothis 79 SB pthead While processing tokens at the head of a title we skip over all spaces until we reach a non space token 973 newcommand SB pthead 974 ifcat noexpand SB next noexpand sptoken 975 expandafter SB ptsp 976 Nelse 977 SB toks 978 let SB dothis SB ptmain 979 NexpandafterNSBOptmain 980 Mti 98
194. ndexing commands appear within the song The third step allows TEX to drop index entries that refer to songs that do not actually appear in the output e g because of includeonlysongs It also allows index entries to refer to information that is only decided at shipout time such as page numbers The fourth step allows all indexing to be accomplished with at most one write register ATEX provides extremely few write registers so using as few as possible is essential for supporting books with many indexes This macro records the comma separated list of the identifiers of indexes associated with the current book section 2922 newcommand SB indexlist This macro records a comma separated list of all the index identifiers for the entire document 2923 newcommand SB allindexes 2924 let SB allindexes empty SB out The SB out control sequence is reserved for the write register allocated by the package code if one is needed It is allocated at the first index declaration 2925 newcommand SB out 2926 let SB out relax SB newindex Initialize a new title author or scripture index newindex 2927 newcommand SB newindex 4 2928 expandafter newcommand csname SB idxfilename 3 endcsname 4 2929 expandafter newcommand csname SB idxsel 3 endcsname 3 1 2930 expandafter newcommand csname SB idxref 3 endcsname thesongnum 7 2931 xdef SB allindexes 2932 ifx SB allindexes empty else SB allindexes f
195. ndsong ifvnumbered stepcounter versenum fi SB prevversetrue else ifSB inchorus SB errevc endchorus else SB errevo fi fiz else SB errevt Mi ifSB chorustop When a chorus is broken in to several pieces by column breaks via brk the following conditional remembers whether the current piece is the topmost one for this chorus 1289 NnewifNifSBOchorustop 89 SB chorusbox When repchoruses is used the first sequence of consecutive choruses is remem bered in the following box register 1290 newbox SB chorusbox ifSB gotchorus The following conditional remembers whether we ve completed storing the first block of consecutive choruses 1291 newif ifSB gotchorus SB cmarkclass The repeatchoruses feature requires the use of two extended mark classes pro SB nocmarkclass vided by TRX We use the newmarks macro to allocate these classes if it s available If Nnewmarks doesn t exist then that means the user has an e TpX compatible version of ATEX but no etex style file to go with it we just have to pick two mark classes and hope that nobody else is using them 292 if SB etex 293 ifundefined newmarks 294 ifundefined newmark 295 mathchardef SB cmarkclass83 296 mathchardef SB nocmarkclass84 297 H 298 newmark SB cmarkclass 299 newmark SB nocmarkclass 300 301 H 302 newmarks SB cmarkclass 303 newmarks SB nocmarkclass 304 305 fi SB cmark To determine where choruses s
196. nesongcolumn option State O aa a 235 openout 2937 2965 3623 options chorded 171 Tyri 2 ues Gn 171 noindexes 166 nomeasures 205 nopdfindex 164 noscripture 232 noshading 165 onesongcolumn 235 rawtext 163 Showmeasures 205 slides 131 transposecapos 231 twosongcolumns 235 unouter 161 outer 161 2083 2088 P p songnum 780 p versenum 1247 PackageError 3365 PackageWarning 3366 pagetotal 350 409 2910 3269 parfillskip 56 776 809 1602 1627 3158 parindent 56 73 94 148 151 156 809 947 1197 1199 1601 1644 3158 parskip 776 809 896 921 947 1602 3158 Mpartiallisttrue 258 pdfbookmark Sts etic thuc 815 816 818 pdfindexfalse 164 3599 pdfindextrue 3590 Mpdfoutput 9 11 placenote 58 138 1492 Mplaceversenum Vue ases ES 12 155 1257 preferflats 1771 prefersharps 1771 167 printchord 78 852 873 2065 2817 printnoteA 1723 1741 1892 1898 1902 printnoteB 1723 1742 1893 1898 1899 printnoteC 1723 1743 1893 1899 printnoteD 1723 1744 1894 1899 1900 printnoteE 1723 1745 1894 1900 printnoteF 1723 1746 1895 1901 printnoteG 1723 1747 1895 1896 1901 47 1598 printscrcite printsongnum 70 98 905 934 printversenum 71 100 264 1250 3598 ProcessOptions protected edef 780 1247 2977
197. newcommand SB errero 3520 SB Error Encountered an protect endscripture space whil 3521 e processing a song Song thesongnum space ends wit 3522 h protect endscripture space when it should end wit 3523 h protect endsong 3524 158 SB errert 3525 newcommand SB errert 3526 SB Error Encountered an protect endscripture space with 3527 out first seeing a protect beginscripture Before son 3528 g thesongnum there is an protect endscripture space wh 3529 ith no matching protect beginscripture 3530 SB errscrip 3531 newcommand SB errscrip 1 3532 SB Error Encountered a protect 1 space outside a scriptu 3533 re quote protect 1 space can only appear betwee 3534 n protect beginscripture space an 3535 d protect endscripture space lines 3536 SB errchord 3537 newcommand SB errchord 3538 SB Error Song thesongnum space seems to have chord 3539 s that appear outside of any verse or chorus All chords a 3540 nd lyrics should appear between protect beginverse space 3541 and protect endverse or between protect beginchorus space 3542 and protect endchorus 3543 SB errreplay 3544 newcommand SB errreplay 3545 SB Error Replayed chord has no matching chord Son 3546 g thesongnum space uses WMprotect more times than the 3547 re are chords in the previously memorized verse 3548 SB errreg 3549 newcommand SB errreg 1 3550 SB Error Unknown chord replay register n
198. ng 2749 2808 2856 2875 2883 SB targfret 2749 2806 2819 2878 2882 SB targsfing 2853 SB targstr 2749 2807 2810 2811 2820 2846 2849 2870 2872 2879 2884 SB temp 18 326 327 551 552 586 590 596 600 613 633 636 644 645 660 699 700 866 868 1073 1117 1119 1831 1863 1873 1879 1883 1889 1904 1962 1963 2089 2090 2103 2105 2108 2110 2112 2159 2164 2170 2173 2539 2554 2562 2575 2868 2869 2871 2888 2892 2896 2900 2955 2964 2966 2989 2991 2995 2997 3001 3003 3033 3034 3043 3067 3070 3090 3136 3184 3187 3190 3291 3293 3294 3669 3671 MSBOtempii 18 553 554 556 558 560 562 613 615 617 618 623 625 867 868 2954 2955 2977 2978 3003 3004 3006 3009 3040 3041 3082 3141 SB tempiii 18 MSBOtempiv 18 MSBOtempv 18 1785 1787 1790 SB testdigit 1014 SB testfalse 509 1015 2139 2142 2321 2359 2454 2509 2535 SB testtrue 508 1019 1028 2090 2137 2142 2280 2310 2362 2380 2510 2514 2536 SB three 2092 SB titlelist 702 706 965 988 1000 1001 SB titlesep 967 1010 SB titletail 702 706 710 713 SB toks 24 325 327 713 714 966 977 992 1001 1002 1007 1033 1035 1062 1063 1066 1069 1072 1777 1785 1790 173 1800 1834 1890 2686 2761 3008 1810 1839 1904 2690 2956
199. ng a verse environment or by using the beginverse macro The latter must check for a trailing star to determine if this verse should be numbered We use ifstar to scan ahead for the star but this needs to be done carefully because while scanning we might encounter tokens that should be assigned different catcodes once the verse really begins Thus we temporarily invoke SB loadactives for the duration of ifstar so that everything gets the right catcode 214 renewenvironment verse 215 vnumberedtrue SB beginverse 216 SB endverse 217 newenvironment verse 218 vnumberedfalse SB beginverse 219 SB endverse 220 newcommand beginverse 221 begingroup 222 SB loadactives 223 ifstar endgroup vnumberedfalse SB beginverse 224 endgroup vnumberedtrue SB beginverse 225 Start the body of a verse We begin by inserting a mark if repchoruses is active and this verse was preceded by a numbered verse making this an eligible place to insert a chorus later Verse numbering is implemented using everypar so that if there is any ver tical material between the beginverse and the first line of the verse that ma terial will come before the verse number Intervening horizontal material e g textnote can temporarily clear everypar to defer the verse number until later 226 newcommand SB beginverse 227 ifSB insong 228 ifSB inverse SB errbvv endverse fif 229 ifSB inchorus SB errbvc endchorus f if 23
200. ngs To insert a measure bar type either measurebar or type the vertical pipe symbol For example G Alle N G 1uia produces Alleluia In order for measure bars to be displayed the option must be enabled Measure bars are only displayed by default in chord books The first measure bar in a song has meter numbers placed above it to indicate the time signature of the piece By default these numbers are 4 4 denoting four quarter notes per measure To change the default type meter n d somewhere after the Nbeginsong line of the song but before the first measure bar to declare a time signature of n d th notes per measure You can also change meters mid song either by using meter in the middle of the song or by typing mbar n 4 d to produce a measure bar with a time signature of n d For example meter 6 8 beginverse Sing to the heavens ye mbar 4 4 saints of old endverse produces 8 1 Ising to the lheavens ye liiis of lold 7 8 Textual Notes Aside from verses and choruses songs can also contain textual notes that provide instructions to singers and musicians To create a textual note that is displayed in both lyric books and chord books use textnote text To create a textual note that is displayed only in chord books use musicnote text Both of these create a shaded box containing text For example textnote Sing as a two part round produces 17 Ncapo
201. noreplay Sometimes material must be added to a chord but omitted when the chord is replayed We accomplish this by enclosing such material in SBGnoreplay macros which are set to gobble just before a replay and reset to firstofone at other times 2693 newcommand SB noreplay 2694 let SB noreplay firstofone 16 13 Guitar Tablatures The song book software not only supports chord names alone but can also typeset guitar tablature diagrams The macros for producing these diagrams are found here SB fretwidth Set the width of each vertical string in the tablature diagram 2695 newlength SB fretwidth 2696 NsetlengthNSBOfretwidth 6NpO SB fretnum Typeset a fret number to appear to the left of the diagram 2697 newcommand SB fretnum 1 2698 sffamily fontsize xpt xpt selectfont 1 2699 SB onfret Typeset one string of one fret with arg1 typeset overtop of it usually a dot or nothing at all 2700 newcommand SB onfret 1 2701 rlap hbox to SB fretwidth hfil vrule height6 p hfil 2702 hbox to SB fretwidth hfil 1 hfil 2703 Y SB atopfret Typeset material given by arg1 to be placed above a string in the tablature diagram 2704 newcommand SB atopfret 1 2705 hbox to SB fretwidth hfil 1 hfil 2706 133 SB fretbar Typeset a horizontal fret bar of width SB dimen 2707 newcommand SB fretbar 2708 Mnointerlineskip 2709 hbox to SB dimen 2710 NadvanceNSBOdimen NSBOfr
202. nsist of arbitrary text To produce sharp and flat symbols use and amp respectively Any text that immediately follows the macro with no intervening whites pace is assumed to be the word or syllable that is to be sung as the chord is struck and is therefore typeset directly under the chord For example E Am N E amp peace and Am joy produces peace and joy If whitespace a space or return immediately follows then the chord name be typeset without any lyric text below it indicating that the chord is to be struck between any surrounding words For example E Am N E amp peace and Am joy produces peace and joy If the lyric text that immediately follows the chord contains another chord and if the width of the chord name exceeds the width of the lyric text then hyphenation is added automatically For example Ftsus4 A F sus4 e A ternal produces e ternal Sequences of chords that sit above a single word can be written back to back with no intervening space or as a single chord ABEm A B N Em joy produces joy A B Em A B Em joy produces joy 11 nolyrics DeclareLyricChar The only difference between the two examples above is that the chords in the first example can later be replayed separately see 97 4 whereas the chords in the second example can only be replayed as a group You can explicitly dictate how much of the text following a chord macro is to appear under the chord name
203. o use a capo Use this option to generate a chord book for pianists who have trouble transposing or guitarists who don t have capos 231 DeclareOption transposecapos transcapostrue Default off Inhibits the display of scripture quotes This option can also be toggled on and off anywhere with the sciptureon and scriptureoff macros 232 DeclareOption noscripture SB omitscriptrue 233 newcommand scriptureon SB omitscripfalse 234 newcommand scriptureoff SB omitscriptrue 57 onesongcolumn twosongcolumns onesongcolumn twosongcolumns songcolumns includeonlysongs songlist nosongnumbers noversenumbers Default onesongcolumn is the default if generating slides or rawtext twosong columns otherwise The number of columns per page is specified using the following package options and macros In rawtext mode it must remain set to one column per page The entire page making system can be turned off by setting the number of columns to zero This will cause each song to be contributed to the current vertical list without any attempt to form columns the enclosing environ ment must handle the page layout Probably this means that repchoruses will not work since an external package won t know to insert repeated choruses when building pages 235 DeclareOption twosongcolumns SB numcols tw 236 DeclareOption onesongcolumn SB numcols ne 237 newcommand songcolumns 1 238 SB cnt 1 relax 239 ifnum SB cnt
204. of a storage or distribution medium does not bring the other work under the scope of this License You may copy and distribute the Program or a work based on it under Section 2 in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following a Accompany it with the complete corresponding machine readable source code which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange or b Accompany it with a written offer valid for at least three years to give any third party for a charge no more than your cost of physically performing source distribution a complete machine readable copy of the corresponding source code to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange or c Accompany it with the information you received as to the offer to distribute corresponding source code This alternative is allowed only for noncom mercial distribution and only if you received the program in object code or executable form with such an offer in accord with Subsection b above The source code for a work means the preferred form of the work for making modifications to it For an executable work complete source code means all the source code for all modules it contains plus any associated interface definition files plus the scripts used to control compilation and
205. of math mode it retains its usual superscript meaning If memorization is active the chord s token sequence is stored in the current replay register If SB chordbox is non empty the new chord is appended to it rather than replacing it This allows consecutive chords not separated by whitespace to be typeset as a single chord sequence atop a common lyric 2048 newcommand SB setchord 2049 2050 catcode active 2051 catcode 7 2052 gdef SB setchord 1 2053 SB gettabindtrue SB nohattrue 2054 setbox SB chordbox hbox 7 2055 unhbox SB chordbox 2056 Nbegingroup 2057 ifSB trackch 2058 def SB activehat ifmmode else global SB nohatfalse fil 2059 else 2060 def SB activehat 2061 ifmmode else SB lop SB ctail SB toks the SB toks fi 2062 th 2063 MR 2064 let SB activehat 2065 printchord 2066 ifSB firstchord else kern 15em fiZ 2067 vphantom 2068 transposehere 1 2069 kern 2em 2070 yh 2071 endgroup 2072 th 2073 SB gettabindfalse 2074 ifSB trackch ifSB nohat 2075 global SB creg expandafter the SB creg 1 2076 fi fiz 2077 let SB noreplay firstofone 2078 2079 The lyric scanning code must preemptively determine if the next token is a macro declared outer before it tries to accept that token as an argument Otherwise TEX will abort with a parsing error Macros declared Nouter are not allowed in arguments so determining if a token is outer is a de
206. of the current song The user can iterate over titles using nexttitle or foreachtitle 704 newcommand songtitle Initialize the title list iterator 705 newcommand resettitles 706 global SB titletail SB titlelist 707 nexttitle 708 Advance the title list iterator to the next title 709 newcommand nexttitle y 710 NSBOifemptyNSBOtitletail A 711 global let songtitle relax 712 H 713 SB lop SB titletail SB toks 714 edef songtitle the SB toks 715 HM 716 T2 foreachtitle ifSB insong ifSB intersong ifSB inverse ifSB inchorus SB closeall SB rawrefs songauthors songcopyright songlicense songrefs setlicense newsongkey SB clearbskeys Execute a block of code for each remaining title in the title list 717 newcommand foreachtitle 1 718 ifx songtitle relax else 719 loop 1 nexttitle ifx songtitle relax else repeat 720 fik 721 To help the user locate errors keep track of which environments we re inside and immediately signal an error if someone tries to use a song command inside a scripture quotation etc 722 newif ifSB songsenv SB songsenvfalse 723 newif ifSB insong SB insongfalse 724 newif ifSB intersong SB intersongfalse 725 newif ifSB inverse SB inversefalse 726 newif ifSB inchorus SB inchorusfalse If an error is detected using one of the above the following macro will contain a macro sequence sufficient to end the unclosed environment
207. okenword ately followed by whitespace or the remainder of a word If the latter hyphenation might need to be introduced These macros keep track of the need for hyphenation if any 2040 NnewifNifSBOwordends 2041 newif ifSB brokenword SB lyric Lyrics appearing after a chord are scanned into the following token list register 2042 newtoks SB lyric SB numhyps Hyphens appearing in lyrics require special treatment The following counter counts the number of explicit hyphens ending the lyric syllable that follows the current chord 2043 newcount SB numhyps SB lyricnohyp When a lyric syllable under a chord ends in exactly one hyphen the following token register is set to be the syllable without the hyphen 2044 newtoks SB lyricnohyp SB lyricbox The following two boxes hold the part of the lyric text that is to be typeset under SB chordbox the chord and the chord text that is to be typeset above 2045 newbox SB lyricbox 2046 newbox SB chordbox SB chbstok When MultiwordChords is active the following reserved control sequence re members the first space token not yet included into the SB lyricbox box 2047 newcommand SB chbstok 112 SB setchord The following macro typesets its argument as a chord and stores the result in SB outertest SB outertest box SB chordbox for later placement into the document The hat token is redefined so that outside of math mode it suppresses chord memorization but inside
208. ollowing logic Chord books should not yield underfull vbox warnings no matter how short their columns are However we still want to put as much material in each column as possible while avoiding intra song column breaks when they can be avoided Chorded mode therefore sets colbotglue with glue whose stretchability is half of the textheight Such glue will stretch at most twice its stretchability yielding a badness of 800 in the worst case The default vbadness setting starts issuing warnings at badness 1000 so we set the penalties below to 1000 800 200 106 newcount vvpenalty vvpenalty200 107 newcount ccpenalty ccpenalty200 108 newcount vcpenalty vcpenalty200 109 newcount cvpenalty cvpenalty200 110 newcount brkpenalty brkpenalty200 The following penalty gets inserted between songs Setting it to a proper value is a somewhat delicate balancing act It should typically be something between 0 and the default penalties above so for now it defaults to 100 To start each song on a fresh column page set it to 10000 or below 111 newcount spenalty spenalty100 The user can redefine the following macros to add TEX marks for each song each verse or each chorus Such marks are used by TFX to define page headers and footers 112 newcommand songmark 113 newcommand versemark 114 newcommand chorusmark 52 extendprelude extendpostlude idxheadfont idxtitlefont idxlyricfont idxscripfont idxaut
209. olnum Reserve a box register to hold the current column in progress 291 newbox SB colbox Reserve a box register to hold the current page in progress 292 newbox SB pgbox Reserve a box register to hold marks that migrate out of songs as they get split into columns and pages 293 newbox SB mrkbox The following helper macro takes the max or min of two dimensions If arg2 lt it sets arg1 to the maximum of arg1 and arg3 If arg2 gt it sets arg1 to the minimum of arg1 and arg3 294 newcommand SB maxmin 3 ifdim 1 2 3 1 3 fi The following macro is the heart of the page building engine It splits the contents of a box into a page of columns If repchoruses is active the contents of SB chorusbox are additionally inserted into fresh columns created during the spitting process The macro arguments are 1 the box b to split must not be SB box which is used as a temp register 2 a count register equaling column index zero or greater where the content of b is to begin and 3 the desired column height Box b is split and 7 is incremented until i reaches SB numcols or b is emptied whichever occurs first If b is emptied first the final column is not contributed instead it is left in b and i is left equal to the index of the column that would have been added if b had been emptied This allows the next call to reconsider whether to end the current column here or add some or all of the next
210. ox SB box else SB colorbox snumbgcolor vbox to ht SB box hbox to songnumwidth printsongnum thesongnum hfil vf il 31 kern3 p box SB box Md n else unvbox SB box M Mi Generate the material that ends each song 946 newcommand makepostlude SB raggedright baselineskip z skip parskip z skip parindent zQ tiny extendpostlude Display the author line in the prelude 950 newcommand showauthors 951 952 953 setbox SB box hbox bfseries sfcode m songauthors ifdim wd SB box gt z unhbox SB box par fiz 78 showrefs SB next SB donext SBG dothis SB nextname SB appendsp SB parsetitles SB ptstart Display the scripture references in the prelude 954 newcommand showrefs 955 setbox SB box hbox slshape songrefs vphantom 956 ifdim wd SB box gt z unhbox SB box par fih 957 Several macros use futurelet to look ahead in the input stream and then take various actions depending on what is seen In these macros SB next is assigned the token seen SB dothis is assigned the action to be taken on this loop iteration and SB donext is assigned the action to be taken to continue or terminate the loop 958 newcommand SB next 959 newcommand SB donext 960 newcommand SB dothis Sometimes when scanning ahead we stringify the name of the next token When that happens the name is stored in this macro for safekeeping 961 newcomma
211. pacefactor gt 1499 103 if cat noexpand SB next0 104 let SB donext SB srcso 105 else 106 penalty 5 enskip 107 ML 108 Velsef 109 space 110 Mi 111 else 112 nobreak space 113 Mid 114 MfiA 115 NSBOdonext 116 A space between a semicolon and a digit could be within a list of verse references for a common book e g Job 1 1 2 2 or it could separate the previous book from a new book whose name starts with a number e g Job 1 1 1 John 1 1 In the former case we should just use a regular space but in the latter case we should be using an en space with a favorable breakpoint To distinguish between the two we peek ahead at the next two tokens If the second one is a space assume the latter otherwise assume the former 1117 newcommand SB srcso 1 futurelet SB temp SB srcso 1118 newcommand SB srcso 7 1119 ifx SB temp SB srspace 1120 penalty 5 enskip 84 ifSB stanza SB stanzabreak SB breakpoint 1121 else 1122 space 1123 Mti 1124 SB next 1125 16 6 Verses and Choruses The following programming typesets song contents including verses choruses and textual notes The following conditional remembers if we ve seen any stanzas yet in the current song 126 newif ifSB stanza End this song stanza and start a new one 127 newcommand SB stanzabreak 128 ifhmode par fiz 129 ifSB stanzay 130 NSBObreakpointi 131 MifSBOinversef 132 MifSBOprevverseWvp
212. qleft 671 newcommand SBOrdqright 672 newcommand SB scanlq 673 newcommand SB scanrq 674 newcommand SB dolq 675 newcommand SB dorg 676 677 SB quotesactive 678 gdef shiftdblquotes 1 2 3 4 679 def SB ldqleft kern 1 680 def SB ldqright kern 2 681 def SB rdqleft kern 3 682 def SB rdqright kern 4 683 SB quotesactive 684 def futurelet SB next SB scanlq 685 def futurelet SB next SB scanrq 686 687 gdef SB scanlq 688 ifx SB next 689 expandafter SB dolq 690 else 691 NexpandafterMlqgA 692 Mi 693 694 gdef SB scanrq 7 695 MifxNSBOnext 696 expandafter SB dorq 697 else 698 expandafter rq 699 fik 700 701 gdef SB dolq 702 ifvmode leavevmode else fii 703 vadjust 704 SB ldqleft lq lq SB ldqright 705 vadjust 706 707 gdef SB dorq 708 ifvmode leavevmode else fi4 709 vadjust 710 SB rdqleft rq rq SB rdqright7 711 vadjust cia 713 101 SB transposefactor ifSB convertnotes notenameA notenameB notenameC notenameD notenameE notenameF notenameG printnoteA printnoteB printnoteC printnoteD printnoteE printnoteF printnoteG notenamesin 16 8 Transposition The macros that transpose chords are contained in this section This counter identifies the requested number of halfsteps by which chords are to be transposed from 11 to 11 1714 newcount
213. r if the user explicitly says that one should be on or off then switching the other shouldn t affect it To produce this behavior we need two extra conditionals to remember if each of these options has been explicitly specified by the user or if it is still in a default state 169 NnewifNifSBOmeasurespec 170 NnewifNifSBOchordedspec Default chorded Determines whether chords should be shown This option can be set in the usepackage line or toggled elsewhere with the chordson and chordsoff macros Chords cannot be turned on in conjunction with the rawtext option If chords are turned on by the end of the preamble no attempt will be made to balance columns on each page 171 DeclareOption chorded chordson 172 DeclareOption lyric chordsoff 173 newcommand chordson SB chordedspectrue SB chordson 174 newcommand chordsoff SB chordedspectrue SB chordsoff 175 newcommand SB chordson 176 Mifrawtext 177 NSBOerrrtopt 178 else 179 chordedtrue lyricfalse 180 let SBO bracket SB chordy 181 let SB rechord SB rechord 182 let SB ch SB ch on 183 MifSBOmeasurespec 184 ifmeasures SB measureson else SBOmeasuresoff fiZ 185 else 186 SB measureson 187 f i 188 ifSB preamble def colbotglue z plus 5 textheight fi 189 NSBOsetbaselineskip 190 fi 191 192 newcommand SB chordsoff 193 chordedfalse lyrictrue 194 def SB bracket 1 ignorespaces 195 let SB rechord relax 19
214. reflect your change 2586 newcommand sharpsymbol ensuremath 2587 newcommand flatsymbol raise 5ex hbox SB flatsize flat These macros typeset sharp and flat symbols 2588 newcommand shrp SB accidental sharpsymbol 2589 newcommand f1t SB accidental flatsymbol The flat math symbol is too small for properly typesetting chord names Its size was designed for staff notation not textual chord names The correct size for the symbol should be approximately 3096 larger than the current superscript size or 9096 of the base font size b However simply computing 0 95 does not work well because most fonts do not render well in arbitrary sizes To solve the problem we must therefore choose an appropriate size individually for each possible base font size b This is the solution adopted by the rest of ATX for such things For example IXTEX s NDeclareMathSizes macro defines an appropriate superscript size for each possible base font size The macro below creates a similar macro that that defines an appropriate flat symbol size for each possible base font size 2590 newcommand DeclareFlatSize 2 2591 expandafter xdef csname SB flatsize 1 endcsname 2 2592 2593 DeclareFlatSize Qvpt vpt 2594 DeclareFlatSize vipt O vipt 2595 DeclareFlatSize viipt vipt 2596 DeclareFlatSize Qviiipt viipt 2597 DeclareFlatSize ixpt viiipt 129 2598 DeclareFlatSize xpt ixpt 2599 DeclareFlatSize xipt xpt 2600 DeclareF
215. ries redefine idxrefsfont For example to typeset each list in boldface write renewcommand idxrefsfont bfseries Title indexes contain entries for song titles and also entries for notable lines of lyrics The fonts for these entries are controlled by idxtitlefont and idxlyricfont respectively For example to show title entries in boldface sans serif and lyric entries in regular roman font one could define renewcommand idxtitlefont sffamily bfseries renewcommand idxlyricfont rmfamily mdseries To change the font used to typeset the capital letters that start each alphabetic section of a large title index redefine idxheadfont For example to typeset those letters in italics instead of boldface type 34 idxbgcolor idxheadwidth idxauthfont idxscripfont idxbook idxcont titleprefixword renewcommand idxheadfont sffamily it LARGE To change the background color of the shaded boxes that contain the cap ital letters that start each alphabetic sectino of a large title index redefine idxbgcolor For example renewcommand idxbgcolor red The idxheadwidth length defines the width of the shaded boxes that begin each alphabetic block of a large title index For example to set the width of those boxes to 1 centimeter you could define setlength idxheadwidth 1cm The font used to typeset entries of an author index is controlled by idxauthfont For example to typeset such entries
216. rn characters and chord macros outer This will cause TEX to halt with a runaway argument error on the correct source line if the user forgets to type a closing end brace a common typo Colon characters are also set non active to avoid a conflict between the Babel French package and the gtab macro 09 newcommand SB begincname 0 catcode M active 1 gdef SB begincname 2 begingroup 3 catcode active catcode amp activey 4 catcode 12 relax 5 catcode M active SB outer def M 6 SB outer def 7 Nchordlocals 8 117 2219 2220 newcommand SB endcname 2221 let SB endcname endgroup SB nbsp Non breaking spaces should be treated as spaces by the lyric scanner code that follows Although is usually an active character that creates a non breaking space some packages e g the Babel package redefine it to produce accents which are typically not lyric ending To distinguish the real from redefined we need to create a macro whose definition is the non breaking space definition normally assigned to 2222 newcommand SBGnbsp 2223 def SB nbsp nobreakspace SB firstchord The following conditional is true when the current chord is the first chord in a sequence of one or more chord macros 2224 newif ifSB firstchord SBOfirstchordtrue SB chord Finish processing the chord name and then begin scanning the implicit lyric ar gument that follows it This is the
217. rrbcc endchorus fif 317 else 318 SB errbct beginsong Unknown Song 319 Mif 320 MSBOinchorustrue 321 def SB closeall endchorus endsong 322 SB chorustoptrue 323 vnumberedfalse 324 SB stanzabreak 325 Nchorusmark 326 Nifrepchorus 327 NifSBOgotchorusVelseNMifSBOprevverseVelse 328 global setbox SB chorusbox vbox 329 unvbox SB chorusbox 330 SB stanzabreak 331 Nchorusmark 332 yh 333 fi fizZ 334 fik 335 global SB stanzatrue 336 replay 337 NSBOObeginchorus 338 NeverychorusNrelax 339 Begin the body of a chorus or continue the body of a chorus after brk has paused it to insert a valid breakpoint We insert an empty class SB cmarkclass mark here so that this chorus will not be duplicated elsewhere on the same page s where it initially appears 340 newcommand SB beginchorus 341 ifrepchorus marks SB cmarkclass fi4 342 setbox SB box vbox bgroup begingroup 343 ifchorded 344 def SB everypar 345 vrule height baselineskip width z depth zo 346 gdef SB everypar 347 Yh 348 everypar SB everypar everypar 349 ML 350 NchorusfontNchorus justify 351 NSBOloadactives 352 SB obeylines 91 SB endchorus SB cbarshift SB chorusbar 1353 penalty12345 1354 End a chorus This involves creating the vertical line to the left of the chorus and then unboxing the chorus material that was previously accumulated 355 NnewcommandNS
218. rs should not normally need to use any of these macros directly The documentation in this section is therefore provided purely for completeness and for informational purposes For instructions on how to automatically generate indexes when compiling a song book see g6 For info on how to customize the appearance of indexes see Automatic generation of song book indexes is a three stage process 1 Each time a song book IATEX file is compiled an auxiliary file named filename sxd is written out for each filename defined using Nnewindex mewauthorindex or newscripindex newscripindex These sxd files are plain text files that can be viewed using any standard text editor They begin with a line identifying the type of index title author or scripture and then contain triples of lines one triple for each song to appear in the index The first line of a triple has the information by which the song is to be indexed a title author or scripture reference The second line has the song s number in the book yielded by thesongnum The third line is an identifying label for the song used in hyperlinking 2 Once the sxd files have been generated an external program is used to transform each sxd file into a sbx file Since the standard makeindex pro gram provided with ATEX is not powerful enough to sort scripture references distributions of songs package come with a specialized songidx program to do this 3 The sbx files produced
219. rusfalse 772 SB gotchorustrue 1234 SB groupent 548 553 566 567 591 592 604 605 613 626 839 1532 SB grouplvl 841 1530 1534 1536 1537 1539 SB gtab 2786 SB gtinc 2765 2851 SB gtinit 2765 2847 SB gtmax 2785 2846 SB gtset 2765 2846 2855 2765 2820 SB hash 3628 3637 SB hyphtests 2144 2154 2163 2172 2515 SB idxcmd 3031 SB idxcolhead 3320 3336 3349 SB idxcont 3329 3350 SB idxentry 3015 3024 SB idxheadsep 3321 3332 3339 SB idxitemsep 3145 3207 3247 SB idxlineskip 3061 SB idxsetup 3156 3170 3204 3248 SB idxtitlebox 3060 3183 3199 3230 3236 3260 SB ifempty 693 710 1244 2681 SB ilpenalty 1182 1184 1188 SB inchorusfalse 726 1360 1320 SBOgttop SB inchorustrue SB indexlist 2905 2917 2922 2989 2995 3001 3002 3005 3009 3011 3018 SB insertchorus m 312 629 SB insongfalse 723 837 3662 SB insongtrue 751 SB intersongfalse T 724 1566 1588 SB intersongtrue s rt Gay lc 1544 1575 SB inversefalse 655 670 725 1279 SB iwrite 2939 2950 2953 3043 SB lastcmark 660 800 1306 SB ldqleft SB ldgright SB lettertests 2127 2144 2280 SB lgidx environment 3154 SB lgindex 3220 3223 3243 SB ligfull 2470 2478 2499 2505 2539 2562 SB ligpost 2469 2477 2499 2504 2554 SB ligpre 2468 2499 2503 2545 SB loadactives 217 218 228 229
220. s kerning correction For example Weneucomnand Vscripturefont 4 usefont OT1 pzc mb it shiftdblquotes 1pt 2pt 3pt 4pt removes 1 point of space to the left and 2 points of space to the right of left double quote characters and 3 points to the left and 4 points to the right of right double quotes within scripture quotations 12 Informational Macros The macros described in this section can be used to retrieve information about the current song This can be used when redefining Nchorusmark or any other macros that might typeset this information To get the current song s list of authors if any use Nsongauthors This yields the value of the by7 key used in the line To get the current song s list of scripture references if any use Nsongrefs This yields the value of the sr key used in the line but modified with hyphens changed to en dashes and spaces falling within a list of verse numbers changed to thin spaces for better typesetting In addition various penalties have been added to inhibit line breaks in strange places and encourage line breaks in others To get the current song s copyright info if any use Nsongcopyright This yields the value of the cr7 key used in the line To get the current song s licensing information if any use Nsonglicense This yields the value of the iz key used in the Nbeginsong line or whatever text was declared with The songtitle macro yields the current song
221. s away to make room for the chord Gmaj sus4 Gmaj7sus4 my life produces my life But if you first type MultiwordChords then instead you get the more compact Gmaj7sus4 Gmaj7sus4 my life produces my lite Authors should exercise caution when using MultiwordChords because including many words under a single chord can often produce output that is ambiguous or misleading to musicians For example F G Am F G Am me free produces me free This might be misleading to musicians if all three chords are intended to be played while singing the word me Liberal use of braces is therefore required to make MultiwordChords produce good results which is why it isn t the default Accidentals Outside Chords Sharp and flat symbols can be produced with and amp when they appear in chord macros but if you wish to produce those symbols in other parts of the document you must use the shrp and f1t macros For example to define a macro that produces a C chord use newcommand Csharp C shrp 13 memorize 7 4 Replaying Chords Many songs consist of multiple verses that use the same chords The songs package simplifies this common case by providing a means to replay the chord sequence of a previous verse without having to retype all the chords To replay a chord from a previous verse type a hat symbol anywhere you would otherwise use a chord macro For example beginverse G This is the C first Glverse
222. s like a large index except in bold and without the sectioning Large and small indexes will be chosen automatically based on the number of index entries when building a song index The other two types are designated by the user As is typical of IXTEX indexes generation of song book indexes requires two passes of document compilation During the first pass data files are generated with song titles authors and scripture references An external program is then used to produce IATEX source files from those data files During the second pass of document compilation those source files are imported to typeset all the indexes and display them in the document Internally this package code uses a four step process to move the index data from the source tex file to the sxd data files 1 While the current song box is in the midst of construction the data is stored in a box of non immediate write whatsit nodes 2 The whatsits are migrated out to the top of the song box when it is finalized at Nendsong 3 When the song box is shipped out to the output file TEX expands the whatsits causing the data to be written to the sxc auxiliary file 4 At the end document line the sxc is processed multiple times once for each index to split the data into the respective sxd files 140 SB indexlist SB allindexes The first and second steps allow index references to point to the beginning of the song no matter where the i
223. s several different directives SB idxcmd that each dictate various aspects of how index entries are parsed sorted and authsepword displayed Such directives should typically appear at the start of the sxd file just authbyword after the header line that identifies the type of index authignoreword 3931 newcommand SB idxemd 3 titleprefixword 3032 ifx SB out relax else 3033 for SB temp SB allindexes do 7 3034 csname SB idxsel SB temp endcsname 3035 SBO idxcmd 1 SBO idxcmd 2 SBO idxcmd 3 3036 yh 3037 fi 3038 3039 newcommand SB idxcmd 1 3040 def SB tempii 1 3041 ifx SB tempii empty else 3042 immediate write SB out 144 SB idxtitlebox SB idxlineskip SB ellipspread 3043 noexpand SB iwrite SB temp 17 3044 3045 fi 3046 3047 newcommand authsepword 1 3048 newcommand authbyword 1 3049 newcommand authignoreword 1 3050 newcommand titleprefixword 1 3051 catcode 12 3052 gdef authsepword 1 SB idxcmd sep 1 3053 gdef authbyword 1 SB idxcmd after 1 3054 gdef authignoreword 1 SB idxcmd ignore 1 3055 gdef titleprefixword 1 SB idxcmd prefix 1 3056 onlypreamble authsepword 3057 onlypreamble authbyword 3058 onlypreamble authignoreword 3059 onlypreamble titleprefixword Define a box to hold the index title 3060 newbox SB idxtitlebox Set the spacing between lines in an inde
224. similar in Spirit to the present version but may differ in detail to address new problems or concerns Each version is given a distinguishing version number If the Program specifies a version number of this License which applies to it and any later version you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation If the Program does not specify a version number of this License you may choose any version ever published by the Free Software Foundation If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different write to the author to ask for permission For software which is copyrighted by the Free Software Foundation write to the Free Software Foundation we sometimes make exceptions for this Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally NO WARRANTY BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE THERE IS NO WARRANTY FOR THE PROGRAM TO THE EXTENT PERMITTED BY APPLICABLE LAW EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND OR OTHER PARTIES PROVIDE THE PROGRAM AS IS WITHOUT WARRANTY OF ANY KIND EITHER EXPRESSED OR IMPLIED INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE THE ENTI
225. space SB chexpspace SB chespace SB chendspace SB chbspace SB chgetspace 2385 expandafter SB chmstop 2386 fi 2387 2388 newcommand SB chmstop expandafter SB chdone SB next We ve encountered a hyphen Continue to digest hyphens but terminate as soon as we see anything else 2389 newcommand SB chhyph 2390 ifx SB next 2391 advance SB numhyps ne relax 2392 let SB donext SB chstep 2393 else 2394 let SB donext SB chdone 2395 Mtis 2396 We ve encountered an implicit or explicit space Normally this just ends the lyric but if MultiwordChords is active these macros both get redefined to process the space 2397 newcommand SB chimpspace let SB donext SB chdone 2398 newcommand SB chexpspace let SB donext SB chdone The SB chespace macro gets invoked by the lyric scanner just before a non space token is about to be accepted as part of an under chord lyric Normally it does nothing however if MultiwordChords is active it gets redefined to do one of three things 1 Initially it is set equal to SB chendspace so that if the very first token following the chord macro is not a space the lyric scanner macros are redefined to process any future spaces encountered Otherwise the very first token is a space and the lyric ends immediately 2 While scanning non space lyric tokens it is set to nothing since no special action needs to be taken until we encounter a sequence of one or more spa
226. t SB submitsong This macro controls whether songs submitted to the page builder are actually contributed to the final document when using includeonlysongs to generate a partial list If SB sgroup is empty then the song is silently dropped Otherwise it is contributed only if SB sgroup is a member of songlist 546 newcommand SB sgroup 547 let SB sgroup empty This counter assigns a unique integer to each item of a group Environments that come before the group s song are numbered decreasingly from 1 The song itself has number 0 Environments that come after the song are numbered increasingly from 1 548 newcount SB groupcnt When a song completes and we re generating a partial list save the song in a box so that it can be submitted at the end of the section in the order specified by includeonlysongs 549 newcommand SB submitpart 550 ifx SB sgroup empty else 551 for SB temp songlist do 7 552 ifx SB temp SB sgroup 553 edef SB tempii SB sgroup the SB groupcnt 554 expandafter newbox csname songbox SB tempii endcsname 555 global expandafter setbox 556 csname songbox SB tempii endcsname box SB songbox 557 global expandafter let7 558 csname stype SB tempii endcsname SB stypeh 559 ifrepchorus ifvoid SB chorusbox else 560 expandafter newbox csname chbox SB tempii endcsname 561 global expandafter setbox 562 csname chbox SB tempii endcsname box SB chorusbox 563 fi fik
227. t SB idxitemsep input csname SB idxfilename 3 endcsname sbx n hfil F vskip z plus2fil relax o Test whether the resulting small index fits within one page If not re typeset it as a large index 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 vbadness M vfuzz maxdimen NsplitmaxdepthWnaxdepthNsplittopskipNzOskip global setbox SB boxii vsplit SB box to textheight ifvoid SB box NboxNSBOboxii else SB lgindex 1 3 Md else SB lgindex 1 3 Mid If the sbx file doesn t exist then instead typeset a page with a message on it indicating that the document must be compiled a second time in order to generate the index 3226 3227 Mifsepindexes 3228 vbox to textheight 3229 vfil 3230 NunvboxNSBOidxtitlebox 3231 vskip1em relax 150 SB lgindex 3232 hbox to hsize hfil Index not yet generated hfil 3233 vskip z plus2fil relax 3234 Yh 3235 Velsef 3236 unvbox SB idxtitlebox 3237 hbox to hsize hfil Index not yet generated hfil 3238 ML 3239 yh 3240 ifsepindexes clearpage fif 3241 endgroup fi 3242 Typeset a large style index We begin by typesetting the entire index into a box 3243 newcommand SB lgindex 2 7 3244 global setbox SB box vbox 3245 renewenvironment idxblock 1 3246 begin SB lgidx 1 end SB lgidx 3247 let SB idxitemsep 3248 SB idxsetup 3249 input csname SB idxfilename 2 endcsn
228. t all intersong displays are omitted when generating a partial book with includeonlysongs You can force them to be included whenever a partic ular song is included by using a songgroup environment begin songgroup end songgroup Each songgroup environment may include any number offintersong intersong or scripture quotations see 48 2 but must include exactly one song When using Mincludeonlysongs the entire group is included in the book if the enclosed song is included otherwise the entire group is omitted 8 2 Scripture Quotations Starting a Scripture Quotation A special form of intersong block typesets a scripture quotation Scripture quotations begin and end with 20 Nbeginscripturei ref endscripture where ref is a scripture reference that is typeset at the end of the quotation The ref argument should conform to the same syntax rules as for the ref arguments passed to beginsong macros see 7 The text of the scripture quotation between the beginscripture and endscripture lines are parsed in normal paragraph mode For example beginscripture James 5 13 Is any one of you in trouble He should pray Is anyone happy Let him sing songs of praise endscripture produces Is any one of you in trouble He should pray Is anyone happy Let him sing songs of praise James 5 13 Acolon Tuplets To typeset biblical poetry the way it appears in most bibles begin Bcolon each line with
229. t on a single line is controlled by the notejustify macro By default it sets up an environment that fully justifies the note i e all but the last line of each paragraph extends all the way from the left to the right margin Authors interested in changing this behavior should consult 416 2 of the implementation section for more information about this macro A textual note that is shorter than a single line is placed flush left by default or is centered when in slides mode This placement of textual notes is controlled by Nplacenote Authors interested in changing this behavior should consult of the implementation section for more information about this macro 11 3 Scripture Appearance By default scripture quotations are typeset in Zaph Chancery font with the document default point size normalsize You can change these defaults by redefining Nscripturefont For example to cause scripture quotations to be typeset in sans serif italics define renewcommand scripturefont sffamily it By default the citation at the end of a scripture quotation is typeset in sans serif font at the document default point size normalsize You can customize the appearance of the citation by redefining printscrcite which accepts the citation text as its argument For example to cause citations to be printed in roman italics font define renewcommand printscrcite 1 rmfamily it 1 31 Mies songcolumns
230. ted after the first verse on each subsequent page of the song unless that verse is already immediately followed by a chorus If the first chorus is part of a set of two or more consecutive choruses then the whole set of choruses is repeated A set of choruses is assumed to consist of things like pre choruses that should always be repeated along with the chorus Choruses are not automatically inserted immediately after unnumbered verses i e verses that begin with Nbeginverse Unnumbered verses are assumed to be bridges or endings that aren t followed by a chorus The above covers the common cases but some songs have more complex forms that demand a manual approach Before a song with irregular form say norepchoruses to turn automatic chorus repeating off Then at points within 10 the song where you want a chorus to be repeated on the overhead slides type a construction like ifslides beginchorus fi and copy and paste the desired chorus into the middle This inserts a repeated chorus at that point when generating slides but not when generating a lyric book or chord book After the song is concluded type ifslidedhrepchoruseshti to turn automatic chorus repeating back on if desired 7 3 Chords Between the and lines or between the beginchorus and endchorus lines chords can be produced using the macro chordname Chords only appear in chord books they are omitted from lyric books The chordname may co
231. that are output by the transposition logic 740 newcommand notenamesout 7 741 def printnoteA 1 2 def printnoteB 2 3 def printnoteC 3 4 def printnoteD 4 5 def printnoteE 5 746 def printnoteF 6 7 def printnoteG 7 8 NSBOconvertnotestrue 9 notenames Set an identical input name and output name for each scale degree 750 newcommand notenames 7 751 notenamesin 1 2 3 4 5 6 7 752 notenamesout 1 2 3 4 5 6 7 753 SB convertnotesfalsey 754 Y alphascale Predefine scales for alphabetic names and solfedge names and set alphabetic scales solfedge to be the default 1755 newcommand alphascale notenames ABCDEFG 1756 newcommand solfedge notenames LA SI DO RE MI FA SOL 1757 alphascale ifSB prefshrps When a transposed chord falls on a black key the code must choose which en harmonically equivalent name to give the new chord For example should C transposed by 1 be named C or Db A heuristic is used to guess which name is most appropriate The following conditional records whether the current key signature is sharped or flatted according to this heuristic guess 1758 NnewifNifSBOprefshrps ifSB needkey The first chord seen is usually the best indicator of the key of the song Even when the first chord isn t the tonic it will often be the dominant or subdominant which usually has the same kind of accidental in its key signa
232. the end of the section and then output all the songs we saved in boxes in the order specified 583 NnewcommandNcommitsongsi 584 585 586 587 588 604 605 606 607 608 609 610 611 ifpartiallist ifnum SB numcols gt z for SB temp songlist do ifx SB temp SB songlistnc SB nextcol ne flushglue else ifx SB temp SB songlistbrk SB nextcol ne colbotglue else ifx SB temp SB songlistcp SB clearpage else ifx SB temp SB songlistcdp SB cleardpage else SB groupcnt m ne SBOfinlooph SB groupcnt z SBOfinloop MiMiMiMil n else for SB temp songlist do ifx SB temp SB songlistnc vfil break else ifx SB temp SB songlistbrk break else ifx SB temp SB songlistcp clearpage else ifx SB temp SB songlistcdp clearpage ifodd c page null newpage fi4 else SB groupcnt m ne SBOfinlooph SB groupcnt z SBOfinloop MiMiMiMil n fik ML SB clearpage SB finloop While contributing saved material included by includeonlysongs this macro 69 SB insertchorus contributes each series of boxes grouped together as part of a songgroup environ ment 612 newcommand SB f inloop 613 loop edef SB tempii SB temp the SBOgroupcnt 614 expandafter ifx 615 csname songbox SB tempii endcsname relax else 616 setbox SB songbox expandafter box 617 csname songbox SB tempii endcsname 618 expandafter ifx csname chbox SB tempii endcsname relax 619 repchorusfalse 620 else
233. thesongnum space there is a protect beginchorus space 3488 line outside of any song 3489 157 SB errecv 3490 newcommand SB errecv 3491 SB Error Encountered an protect endchorus space while proc 3492 essing a verse Song thesongnum space might hav 3493 e a protect beginverse space concluded by protect endchorus 3494 space instead of protect endverse 3495 SB erreco 3496 newcommand SB erreco 3497 SB Error Encountered protect endchorus space without firs 3498 t seeing a protect beginchorus Song thesongnum space m 3499 ight have an protect endchorus space with no match 3500 ing protect beginchorus 3501 SB errect 3502 newcommand SB errect 3503 SB Error Encountered an protect endchorus space outside 0o 3504 f any song Before song thesongnum there is a 3505 n protect endchorus space line not preceded b 3506 y a protect beginsong space line 3507 SB errbro 3508 newcommand SB errbro 3509 SB Error Missing protect endsong 35 35 35 35 SB errbrr 35 35 35 35 SB errero 35 0 Nested song and intersong environments are not supported 1 Song thesongnum space might be missing a 2 n protect endsong space line 3 4 newcommand SB errbrr 5 SB Error Nested intersong environments are not supported 6 A scripture quote or other intersong environment before s 7 ong thesongnum space is missing its ending line 8 9
234. tures as the actual key This conditional remembers if the current chord is the first one seen in the song and should therefore be used to guess the key of the song 1759 NnewifNifSBOneedkey transpose The transpose macro sets the transposition adjustment factor and informs the transposition logic that the next chord seen will be the first one in the new key 760 newcommand transpose 1 761 advance SB transposefactor by 1 relax 762 NSBOcntNSBOtransposefactor 763 divide SB cnt12 764 multiply SB cnt12 765 advance SB transposefactor SB cnt 766 SB needkeytrue 767 103 capo Specifying a capo normally just causes a textual note to musicians to be typeset but if the transposecapos option is active it activates transposition of the chords 1768 newcommand capo 1 7 1769 iftranscapos transpose 1 else musicnote capo 1 fi 1770 prefersharps One of these macros is called after the first chord has been seen to register that preferflats we re transposing to a key with a sharped or flatted key signature 1771 newcommand prefersharps SB prefshrpstrue SB needkeyfalse 1772 newcommand preferflats SB prefshrpsfalse SB needkeyfalse transposehere If automatic transposition has been requested yield the given chord transposed by the requested amount Otherwise return the given chord verbatim 773 newcommand transposehere 1 7 774 ifnum SB transposefactor z0 775 ifSB convertnotes 776 SB
235. turned on doesn t actually work yet but might be added in a future revision 163 DeclareOption rawtext rawtexttrue indexesoff Default off Inhibit the creation of the bookmark index in pdf files This op tion can only be set in the Nusepackage line because initializing the pdfbookmark library at all causes a possibly empty bookmark index to be created 164 DeclareOption nopdfindex pdfindexfalse Default off Inhibit all shaded boxes e g if the color package is unavailable This option can only be set in the Nusepackage line because the color package must be loaded in the preamble if at all Note In a future release this might be extended to be modifiable throughout the preamble 165 DeclareOption noshading SB colorboxesfalse 55 noindexes indexeson indexesoff ifSB measurespec ifSB chordedspec chorded lyric chordson chordsoff SB chordson SB chordsoff Default off Suppress generation of index files and displaying of in document indexes The indexeson and indexesoff macros can be used elsewhere to toggle display of indexes Index regeneration will occur if indexes are turned on by the end of the document 166 DeclareOption noindexes indexesoff 167 newcommand indexeson songindexestrue 168 newcommand indexesoff songindexesfalse The showmeasures and chorded options interact in the sense that by default switching one of them on or off switches the other on or off as well Howeve
236. typeset 122 newcommand idxrefsfont normalfont normalsize Users can redefine idxbook to dictate the book name header in a scripture index that begins each book of the bible 123 newcommand idxbook 1 small bfseries 1 Users can redefine idxcont to dictate the column header in a scripture index after a column break falls within a book of the bible 124 newcommand idxcont 1 small textbf 1 continued Glue of size colbotglue is inserted at the bottom of each column We use a macro instead of a glue register so that this can be redefined in terms of variable quantities such as textheight 125 newcommand colbotglue 126 let colbotglue z skip 53 lastcolglue minfrets SB colwidth slides slides Glue of size lastcolglue is inserted at the bottom of the last column 127 newcommand lastcolglue 128 let lastcolglue flushglue Define the minimum number of fret rows that should appear in tablature diagrams 129 newcount minfrets minfrets4 Define a length to store the computed width of each column in a multi column song page The user shouldn t set this one directly but some users might want to refer to it in calculations 130 newdimen SB colwidth 16 3 Package Options This section defines code associated with the various option settings that can be specified on the usepackage line Many of these options can also be turned on or off subsequent to the usepackage line so macros for doin
237. ue by default if the user doesn t redefine it by the end of the document preamble it gets redefined to something sensible based on other settings 80 newskip versesep 81 versesep123456789sp relax Users can specify the amount of vertical space that separates song prelude and postlude material from the body of the song by adjusting the following two macros 82 newskip afterpreludeskip 83 afterpreludeskip 2 p0 plus4 p 84 newskip beforepostludeskip 85 beforepostludeskip 2 p plus4 p Define an adjustment factor for the vertical distance between consecutive lyric baselines Setting this to zero accepts the default baseline distance computed by the songs package 86 newskip baselineadj 87 baselineadj z skip The spacing between chords and the lyrics below them can be adjusted by chang ing the values of baselineskip lineskiplimit and lineskip within the following macro By default baselineskip is set to 2 points smaller than the height of the current lyric font and lineskiplimit and lineskip are set so that chords intrude at most 2 points into the lyric below them This helps to keep chords tight with lyrics 88 newcommand clineparams j 89 baselineskip f size po 90 advance baselineskip 2 p0 91 lineskiplimit 2 po 92 lineskip 2 pe 93 The parindent length controls how far broken lyric lines are indented from the left margin 94 parindent 25in Specify the width of the head boxes in a large ind
238. unter newdimen 24 27 130 1194 2748 newenvironment 747 1217 1312 1529 1540 1571 1594 2903 3151 3154 3155 newif 1 8 16 18 169 170 722 726 1126 1201 1202 1289 1291 1715 1758 1759 2040 2041 2224 2643 2692 2747 3581 3594 3624 newindex 2942 3573 newlength 95 97 99 101 103 2695 newmark 1298 1299 newmarks 1302 1303 newpage 602 newscripindex 2944 newskip 34 80 82 84 86 newsongkey 734 740 742 746 newtoks 81 702 703 2042 2044 2644 2645 2649 newwrite nextcol nexttitle 2936 3622 683 707 709 719 786 918 3645 2223 nobreakspace noindexes option nolyrics nolyricstrue 3595 166 3694 3596 nomeasures option nonfrenchspacing nopdfindex option norepchoruses normalfont 36 122 134 normalsize 36 122 noscripture option noshading option nosongnumbers notebgcolor notefont notejustify notenameA 1716 notenameB 1716 notenameC 1716 notenameD 1716 notenameE 1716 notenameF 1716 notenameG 1716 notenames 1750 notenamesin notenamesout notrans 205 1081 164 267 2815 2815 232 165 262 48 1492 40 1460 1755 1730 1740 noversenumbers o obeylines 1172 obeyspaces 1646 1071 53 1470 3655 1075 NOES sre mes 2191 NOG nantgs Ades 2190 onesongcolumn 140 235 o
239. urn 516 newcommand SB cleardpage 517 MSBOclearpage 518 if twoside ifodd c page 519 SB nextcol SB numcols flushglue 520 fi fix 521 There are two song content submission types column and page submissions Page submissions are page width and go atop fresh pages unless the current page has only page width material so far Column submissions are column width and start a new page only when the current page is full This macro gets set to the desired type for the current submission Mostly it stays set to the default column submission type 522 newcommand SB stype SB stypcol Column submissions contribute the contents of SB songbox to either the current column or the next column or page depending on where it best fits 523 newcommand SB stypcol 7 524 ifnum SB numcols gt ze 525 SB selectcol 526 global setbox SB colbox vbox SB putboxes unvbox 527 SB output 528 else 529 unvbox voidb x 530 SB breakpoint spenalty 531 ifdim sbarheight gt z 532 vskip sbarheight relax 533 ML 534 NunvboxNSBOsongbox 535 fik 536 Page submissions go directly to the top of the nearest fresh page unless the current page has all page width material so far 537 newcommand SB styppage 538 ifnum SB numcols gt zo 539 SB clearpage 540 unvbox SB songbox 541 null nointerlineskip 542 Nelsef 543 unvbox SB songbox 544 fik 545 67 SB sgroup SB groupcnt SB submitpar
240. usage however Many can be used throughout the document to switch styles for different sections or different songs Define the font style to use for formatting song lyrics 36 newcommand lyricfont normalfont normalsize 48 stitlefont versefont chorusfont notefont scripturefont printscrcite snumbgcolor notebgcolor idxbgcolor versejustify chorusjustify notejustify placenote Define the font style to use for formatting song titles 37 newcommand stitlefont 38 ifslides sffamily Huge else sffamily slshape Large fit 39 By default verses choruses and textual notes just allow the lyricfont style to continue 40 newcommand versefont 41 newcommand chorusfont 42 newcommand notefont Define the font style to use for formatting scripture quotations defaults to Zapf Chancery 43 newcommand scripturefont 44 usefont 0Ti pzc mb it 45 shiftdblquotes 1 1 p z 2 pO zo 46 Define the printing style for the citation at the end of a scripture quotation 47 newcommand printscrcite 1 sffamily small 1 Define the background color used for shaded boxes containing song numbers tex tual notes and index section headers respectively To turn off all shading for a box type use def macroname 48 newcommand snumbgcolor SongbookShade 49 newcommand notebgcolor SongbookShade 50 newcommand idxbgcolor SongbookShade Verses and choruses are both left
241. ve by the inputenc or babel packages Most such characters should be included in the lyric so include it by default otherwise ex clude it by default The user can override the defaults using DeclareLyricChar and friends 2358 NnewcommandNSBOchothermaci 2359 NSBOtestfalse 2360 afterassignment iffalse 2361 SB cnt expandafter SB nextname x fi 2362 ifnum the catcode SB cnt z0 else SBGtesttrue fi4 2363 SB macrotests 2364 ifSB test 2365 SB chespace let SB donext SB chstep 2366 else 2367 let SB donext SB chdone 2368 fi 2369 SB chstep We ve encountered one or more tokens that should be included in the lyric text SB chsteptwo More than one means we ve encountered a multibyte encoding of an international SB chstepthree character Consume them as arguments to this macro and add them to the list SB chstepfour of tokens we ve already consumed SB chmulti 2370 newcommand SB chstep 1 SB chmstop 2371 SB lyric expandafter the SB lyric 1 2372 SB chscan 2373 2374 newcommand SB chsteptwo 2 SB chmulti 1 2 2375 newcommand SB chstepthree 3 SB chmulti 1 2 3 2376 newcommand SB chstepfour 4 SB chmulti 1 2 3 4 2377 newcommand SB chmulti 1 A 2378 def SB next 1 2379 let SB nextname relax 2380 NSBOtesttrueNSBOmultitests 2381 ifSB test 2382 SB lyric expandafter the SB lyric 1 2383 expandafter SB chscan 2384 else 122 SB chhyph SB chimp
242. wcommand norepchoruses repchorusfalse The following penalty settings cause verses and choruses to be separated onto dif ferent slides when in slides mode except that consecutive choruses remain together when they fit 276 newcommand sepverses 277 vvpenalty M 278 ccpenalty100 279 vcpenalty vvpenalty 280 cvpenalty vvpenalty 281 let colbotglue flushglue 282 Some option settings margins and other lengths are finalized at the end of the preamble That code is below 283 AtBeginDocument If the user hasn t set the versesep set it to the default 284 SB setversesep Initialize page layout algorithm 285 songcolumns SB numcols Macros used after this point occur outside the preamble 286 SB preamblefalse 287 16 4 Page builder The following macros handle the building of pages that contain songs They compute where best to place each song e g whether to place it in the current column or move to the next column or page The output routines for generating a partial list of songs in a specified order also can be found here The most recently processed song or scripture quotation is stored in this box 288 newbox SB songbox 59 SB numcols SB colnum SB colbox SB colbox SB mrkbox SB maxmin SB mkpage Reserve two count registers to hold the total number of columns and the current column number respectively 289 newcount SB numcols SB numcols tw 290 newcount SB c
243. wherever is used on a line by itself The higher the penalty the less likely TEX is to place a page or column break at that site If any are set to 30 sepverses versejustify chorusjustify justifyleft justifycenter notejustify placenote scripturefont printscrcite 10000 or lower breaks are forced there By default interlinepenalty is set to 1000 and the rest are set to 200 so that breaks between verses and choruses are preferred over breaks within choruses and verses but are not forced Saying sepverses sets all of the above penalties to 10000 except for ccpenalty which is set to 100 This is useful in slides mode because it forces each verse and chorus to be typeset on a separate slide except for consecutive choruses which remain together when possible This default reflects an expec tation that consecutive choruses typically consist of a pre chorus and chorus that are always sung together These defaults can be changed by changing the relevant penalty register directly For example to force a page or column break between consecutive choruses type Nccpenalty 10000 Text Justification To cause verse or chorus text to be justified flush left or centered set Nversejustify or Nchorusjustify to justifyleft or justifycenter respectively For example to cause choruses to be centered one could type renewcommand chorusjustify justifycenter Justification of textual notes too long to fi
244. x 3061 newcommand SB idxlineskip 1 3062 vskip 1 p plus 1 p Gminus 1 pe 3063 When rendering an index entry X Y that is too long to fit on one physical line we must break text X and or Y up into multiple lines Text X should be typeset as a left justified paragraph with a right margin of about 2em however it s final line must not be so long that it cannot fit even the first item of list Y Text Y should be typeset as a right justified paragraph whose first line begins on the last line of X However breaking Y up the way paragraphs are normally broken up doesn t work well because that causes most of Y to be crammed into the first few lines leaving the last line very short This looks strange and is hard to read It looks much better to instead break Y up in such a way that the portion of Y that is placed on each line is of approximately equal width subject to the constraint that we don t want to introduce any more lines than are necessary This makes it visually clear that all of these lines are associated with X The following code performs the width computations that do this horizontal balancing of text Typeset an index entry of the form X Y In the common case the entire entry fits on one line so we just typeset it in the usual way If it doesn t fit on one line we call SB balancerows for a more sophisticated treatment 3064 newcommand SB ellipspread 2 3065 Nbegingroup 3066 SB dimen z 3067 def
245. xNSBOlyricbox 2409 the SB lyrich 2410 H4 2411 SB lyric 2412 ifdim wd SB lyricbox lt wd SB chordbox 2413 let SB chbstok MSBOnext 2414 def SB chexpspace let SB donext SB chgetspace 2415 def SB chimpspace let SB donext SB chstep 2416 let SB chespace SB chendspace 2417 let SB chdone SB chspcdone 2418 else 2419 def SB chimpspace let SB donext SB chdone 2420 def SB chexpspace let SB donext SB chdone 2421 fi 2422 2423 newcommand SB chgetspace 2424 SB appendsp SB lyric 2425 let SB nextname relax 2426 NafterassignmentNSBOchscan 2427 let SB next SB chmbar We ve encountered a measure bar Either ignore it or end the lyric text depending on whether measure bars are being displayed 2428 newcommand SB chmbar 2420 Mifmeasures 2430 let SB donext SB chdone 2431 else 2432 SB chespace let SB donext SB chstepy 2433 fi 2434 SB chbgroup We ve encountered a begin group brace Consume the entire group that it begins and add it to the list of tokens including the begin and end group tokens 2435 newcommand SB chbgroup 1 2436 SB lyric expandafter the SB lyric 1 2437 SB chscan 2438 SB chegroup We ve encountered an end group brace whose matching begin group brace must SB chegrpscan have come before the chord macro itself This forcibly ends the lyric text SB chegrpmacro Before stopping we must set SB next to the token following the brace a
246. xtold 445 fi fik 446 ifnum SB cntii lt SB numcols else 447 SB spbegnew 448 ifnum SB cntii lt SB numcols else if twoside 449 NSBOspextnew 450 fi fi 451 SB spdblpg 452 fik 453 This is the level 2 song positioning algorithm It moves songs to the next page or double page if doing so avoids a page break or page turn that would otherwise appear within the song 454 newcommand SB sposii 455 ifnum SB cntii lt SB numcols else 456 NSBOspbegnew 457 ifnum SB cntii lt SB numcols 458 SB cnt SB numcols 459 advance SB cnt SB colnum 460 else 461 if twoside 462 SB spextold 463 ifnum SB cntii lt SB numcols else 464 NSBOspextnew 465 SB spdblpg 466 fi 467 Mi 468 fi 469 Mti 470 Y This is the level 3 song positioning algorithm It moves songs to the next column the next page or the next double page if doing so avoids a column break page break or page turn that would otherwise appear within the song 471 newcommand SB sposiii 472 NifnumMSBOcntii NSBOcolnum 473 SB cnt SB colnum 474 advance SB cnt ne 475 ifnum SB cnt lt SB numcols 476 setbox SB boxiii copy SB songbox ATT SBO mkpage SB boxiii SB cnt SB dimen 478 advance SB cnt m ne 479 f i 65 480 481 482 483 484 485 486 487 ifnum SB cnt gt SB colnum SB cnt ze SB sposiiZ else SB cnt ne f i ML songpos This is the macro by which the user adjusts the aggress
Download Pdf Manuals
Related Search
Related Contents
Service Manual - GT Phelan Tech GEBRUIKSAANWIJZING MODE D`EMPLOI User manual Curera® Positioning Samowar 3L eppendorf - Gemini BV FlexiGuard Portable Box Frame Rail Fall Arrest System Manual Samsung Samsung Rex 70 User Manual Gestão inteligente de documentos eletrônicos Copyright © All rights reserved.
Failed to retrieve file