summaryrefslogtreecommitdiff
path: root/support/pstab/manual.pst
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/pstab/manual.pst
Initial commit
Diffstat (limited to 'support/pstab/manual.pst')
-rw-r--r--support/pstab/manual.pst948
1 files changed, 948 insertions, 0 deletions
diff --git a/support/pstab/manual.pst b/support/pstab/manual.pst
new file mode 100644
index 0000000000..f7ea908598
--- /dev/null
+++ b/support/pstab/manual.pst
@@ -0,0 +1,948 @@
+NewDoc Centred
+(PStab v2.0
+A system for typesetting tablature.
+(c) 1994 Brian Ewins.
+
+Contents)
+NewStyle Text
+(
+Introduction
+Writing PStab files
+The Verbatim Style
+The Centred Style
+The Verses Style
+The ChordPro Style
+The Chords Style
+The Guitar Tablature Style
+The ASCIItab Style
+Getting Control of The Layout
+Writing Tablature Styles
+Writing General Styles
+Copyrights & Copylefts
+About the Author
+)
+NewStyle Centred
+(Introduction:
+or
+Zen and the Art of Programming)
+NewStyle Text
+(
+For me, there are some things you must obey when writing \
+a program:
+*It must be original.
+Well, that rules out most shareware stuff.
+*It must be backwards compatible.
+Hello, Microsoft?
+*It must be portable.
+*If it needs a manual, it sucks.
+Hello, Microsoft (again)?
+
+I have attempted in this program to address all these \
+questions. I've certainly never seen anything like this \
+program before, and it can make sense of ChordPro, and \
+ASCII'd tablature. \
+I chose to write it in PS and not in TeX because some \
+people out there don't have TeX, and I didn't write it \
+in C because some people don't have compilers. However, \
+almost everyone has access to a PS printer, and anyone \
+can get hold of GhostScript for free to view this stuff. \
+In fact, I didn't know PS at all before I wrote this, \
+which shows how seriously I took the choice of language. \
+As for the manual. Well, this is more of an ideal than \
+something you can ever manage to stick to. I did put \
+a lot of thought into the syntax for entering tab, chords, \
+etc, and hopefully this shows through in ease of use. \
+And now, with a tinge of regret, the manual.
+)
+NewStyle Centred
+(Writing PStab files)
+NewStyle Text
+(
+This is the manual for PStab, a program for typesetting tablature. \
+PStab is very flexible, and it's not limited to having only one \
+guitar, or to using guitar tab instead of, say, bass tab. It can also \
+typeset words of songs in a nice way, and is backwards compatible \
+with ChordPro, and can even make ASCII tablature look nice for \
+printing too. As an example of how flexible this program is: \
+since this manual contains many examples of \
+PStab's output, it seemed only natural to use PStab to typeset it, \
+and PStab was up to the task ! O.K. so TeX it ain't, but if you can \
+read this, then you can use PStab --- the program is written in \
+PostScript, and so is more portable than most.
+),
+(PStab is designed somewhat along the line of LaTeX, for those who \
+are familiar with that system.That is to say, there is a core system \
+for typesetting, on top of which you layer 'styles' which use \
+the core functions, to hide the intimate workings of the program \
+from the end user. Since the commands that you 'see' depend on which \
+style you are using, you should read the sections on each style to \
+learn how they work. To make this easy, they all follow pretty much \
+the same design.
+),
+(Firstly, though, I should describe how to write the bare bones of \
+a PStab document. Here is a small document:
+)
+NewStyle
+(GetPageMargins
+/LeftMargin 1 inch smaller
+/RightMargin 1 inch smaller
+/TopMargin 1 inch smaller
+/BottomMargin 1 inch smaller
+0.1 setlinewidth
+NewDoc
+\(Hello World\)
+EndDoc)
+NewStyle Text
+(
+What does this do? GetPageMargins is a command to find out the \
+size of page your printer uses. You don't have to tell PStab that \
+you've got A4 instead of US Letter, or any other size, it figures \
+it out for itself. You must use this command, to give values to \
+the margins. The next step was to move the margins in a bit. They're \
+only a couple of mm in on my printer, so output would look ugly if \
+I left them as they were. If you want to have them some other distance \
+than 1 inch in from the page edge, change the 1 to something else. \
+PostScript doesn't 'know' inches, or 'smaller', I put those in the \
+program to make this easier to understand. 'setlinewidth' is a \
+PostScript command to change the width of lines it draws. \
+The 0.1 sets it to be 1/720 of an inch. Next, I used NewDoc and \
+EndDoc. These set up the program to expect PStab, and clean up \
+afterwards. Notice that Hello World is enclosed in brackets.
+
+To print this '.pst' file, you attatch it to the end of the \
+program, and send the whole thing to the printer. The end of \
+the program in this case would be at the comment saying \
+'DOCUMENT SETUP'. However, you are the only person ever \
+likely to want to adjust your page margins, so '.pst' documents \
+will commonly start with a 'NewDoc' command, and should be \
+tagged on to the program after the 'DOCUMENT' comment. If you \
+look at this file with an editor, this should all become \
+clear, since the manual itself is tagged on in this way.
+
+The example described above \
+gets displayed at the top left of a page in the default style, \
+which looks like this:
+)
+NewStyle Verbatim
+(Hello World)
+NewStyle Text
+(
+This style, which I use in the manual to indicate what you should \
+type, is called Verbatim. It performs simple linebreaking on plain text.\
+In fact, all of the text in this manual uses this style, with the font \
+changed to make the difference between the text and examples clear. \
+How do you change styles then ? Here is an example:
+)
+NewStyle
+(NewStyle Verbatim)
+NewStyle Text
+(
+This cleans up after the last style used, and changes to Verbatim.\
+Generally, you replace Verbatim by the name of the style you want to \
+use. There are seven styles distributed with this program, but I expect \
+others to make up their own for particular documents, just as I did \
+to make the text you're reading appear in this font. I will describe \
+how to write a style towards the end of this document.
+
+Now I'll go on to describe all of the distributed styles individually.
+)
+NewStyle Centred
+(The Verbatim Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc
+NewDoc Verbatim
+NewStyle
+NewStyle Verbatim)
+NewStyle Text
+(
+Any of these commands start up the Verbatim style. \
+Note however that you only use the NewDoc command at \
+the start of a PStab file: repeated use without an \
+accompanying EndDoc will cause an error. The NewStyle \
+command cleans up whats left at the end of each section \
+of a style, and then starts up in the new one. I have \
+put an identical 'commands' section at the start of each \
+style decription, the comments in this paragraph apply \
+to all of them.
+
+The Verbatim style is the is the default, since it displays \
+plain text acceptably. Here is an example of its use:
+)
+NewStyle
+((Hello \\\(),(I break lines wherever I see a comma outside),
+(the brackets ( and ), or at a newline
+in the input, or),
+(I break very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ long lines up if I have to.),
+(the last piece of text has no comma after it.))
+NewStyle Text
+(
+Which displays like this:
+)
+NewStyle
+(Hello \(),(I break lines wherever I see a comma outside),
+(the brackets ( and ), or at a newline
+in the input, or),
+(I break very very very very very very very very very\
+ very very very very very very very very very very very\
+ very very very very very very very very very very very\
+ very very very very very very very very very very very\
+ very very very very very very very very very very very\
+ long lines up if I have to.),
+(the last piece of text has no comma after it.)
+NewStyle Text
+(
+Note the use of backslashes to protect unpaired brackets,\
+while paired brackets are OK. Backslashes also prevent automatic \
+line breaks at newlines in the input, in the styles which do that. \
+The backslash character itself is also has to be protected \
+by a backslash. For more about character escapes, as these \
+are called, you should read 'The PostScript Language Tutorial \
+and CookBook' by Adobe Systems Inc. You shouldn't need to \
+know these for normal use of the program.
+)
+NewStyle Centred
+(The Centred Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc Centred
+NewStyle Centred)
+NewStyle Text
+(
+This is the style which produced the title at the top of this \
+page. It's very similar to the Verbatim style. Here is an \
+example of its use :
+)
+NewStyle
+((Hello),(I break lines wherever I see a comma outside),
+(the brackets ( and ), or at a newline
+in the input, or),
+(I break very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ very very very very very very very very very very very\\
+ long lines up if I have to.),
+(the last piece of text has no comma after it.))
+NewStyle Text
+(
+Which displays like this:
+)
+NewStyle Centred
+(Hello),(I break lines wherever I see a comma outside),
+(the brackets ( and ), or at a newline
+in the input, or),
+(I break very very very very very very very very very\
+ very very very very very very very very very very very\
+ very very very very very very very very very very very\
+ very very very very very very very very very very very\
+ very very very very very very very very very very very\
+ long lines up if I have to.),
+(the last piece of text has no comma after it.)
+NewStyle Text
+(
+I'm kinda pleased with the linebreaking algorithm here, \
+it uses up very little in terms of memory. Not that anyone \
+out there really cares about this - do you ?
+)
+NewStyle Centred
+(The Verses Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc Verses
+NewStyle Verses)
+NewStyle Text
+(
+This style is for printing the verses of songs. It tries to place as \
+many verses as it can alongside each other, and if placing the next \
+would go across the right margin, it moves down to the next available \
+space before printing it. Each verse is contained between a single \
+pair of brackets. Here is an example of its use:
+)
+NewStyle
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!),
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!
+This ones longer than the rest,
+To put my linebreaks to the test.
+Where's the next line? yes, you've guessed,
+I print it in the place that's best!),
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!),
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!)
+NewStyle Text
+(
+Which generates this:
+)
+NewStyle Verses
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!),
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!
+This ones longer than the rest,
+To put my linebreaks to the test.
+Where's the next line? yes, you've guessed,
+I print it in the place that's best!),
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!),
+(I print verses in a row,
+The next line gets put down below,
+Mumble mumble rhymes with grow
+Done this verse, now on we go!)
+NewStyle Centred
+(The ChordPro Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc ChordPro
+NewStyle ChordPro)
+NewStyle Text
+(
+This style is meant to reproduce the output of the ChordPro program \
+directly from chordpro files. If you're not familiar with that \
+program, basically the idea is that you type the text of the \
+song with chord names in square brackets at the point where \
+you change chord. The program's main function is to place \
+these chord names above the text at that position, as you \
+would see in many guitar books. Here's an example:
+)
+NewStyle
+(({title:The Manual Song}
+{st:No-one has yet claimed responsibility}
+[D]I print verses [A7]in a [D]row,
+The next line gets put [A7]down be[D]low,
+Mumble mumble [A7]rhymes with [D]grow [G][G#][A][Bb][C][D]
+Done this verse, now [A7susX]on we [quietly]go!
+
+{c:chorus}
+
+[D]The second verse is [A7]like the [D]first,
+The music poor, the [A7]verse is [D]worse,
+I wrote this since [A7]I'd get [D]sued,
+If I used real songs. [A7]This'll [D]do.
+))
+NewStyle Text
+(
+Which generates this:
+)
+NewStyle ChordPro
+({title:The Manual Song}
+{st:No-one has yet claimed responsibility}
+[D]I print verses [A7]in a [D]row,
+The next line gets put [A7]down be[D]low,
+Mumble mumble [A7]rhymes with [D]grow [G][G#][A][Bb][C][D]
+Done this verse, now [A7susX]on we [quietly]go!
+
+{c:chorus}
+
+[D]The second verse is [A7]like the [D]first,
+The music poor, the [A7]verse is [D]worse,
+I wrote this since [A7]I'd get [D]sued,
+If I used real songs. [A7]This'll [D]do.
+)
+NewStyle Text
+(
+Note how the chord placing is done properly, but other \
+commands are ignored. Whole ChordPro files can be encapsulated \
+this way, and printed without using ChordPro at all. \
+PStab does not automatically generate a chord table, as \
+ChordPro does, even though I could support this. There are very \
+good reasons for not doing so, \
+to do with printer memory, but none for reproducing this \
+feature, other than laziness on your part, I guess.
+
+The style also spaces out the run of chords \
+in the first verse properly, which is there to \
+show you how you're supposed to type sharps and \
+flats. The line after this shows that you can put \
+anything above the text, not just chords.
+)
+NewStyle Centred
+(The Chords Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc Chords
+NewStyle Chords)
+NewStyle Text
+(
+This style prints chord diagrams. It knows all of the chords that \
+ChordPro did, over 130 of them. There were a couple of mistakes in \
+the table in that program, which I corrected, but there may be more \
+that I haven't spotted that are still wrong. Here's the example:
+)
+NewStyle
+((A#m),(Bbm),(N),(N) [ 5 6 7 5 ], (Asus2) [ -1 [7 3] [7 4] [6 4] 0 0])
+NewStyle Text
+(
+Which displays like this:
+)
+NewStyle Chords
+(A#m),(Bbm),(N),(dunno) [ 5 6 7 5 ], (Asus2) [ -1 [7 3] [7 4] [6 4] 0 0]
+NewStyle Text
+(
+The first two are examples of chords that PStab knows, with \
+showing how to type sharps and flats. The third is a name that \
+ChordPro doesn't know, which produces a blank, labelled, chord. \
+I think this is more useful than not displaying anything. \
+The last two are examples of specifying a chord: you just type \
+the frets that are to be used, from left to right. Note that they \
+don't have to be guitar chords! The program is intended to be \
+independent of which instrument you use it for. Notice in the \
+final example, I specified which fingers I wanted to hold down \
+certain strings with. Finally, the order matters: you must give \
+the name of the chord before the fingering, if you give both.
+)
+NewStyle Centred
+(The Guitar Tablature Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc Guitar Tablature
+NewStyle Guitar Tablature)
+NewStyle Text
+(
+Go on, admit it, you flicked straight to this page, right? \
+This is \(a\) style for setting out tablature. The Tablature \
+engine is in fact a general engine capable of printing \
+for multiple instruments, adding lyrics, comments, and \
+symbols, etc. This page actually describes a substyle I \
+wrote as an example. A substyle provides information \
+about which lines contain text, and which are frets, \
+and also what each of these are called.
+
+This particular substyle -Guitar- describes a line of text called \
+'chord', 6 rows of frets called 'e,B,G,D,A,E' in that order, \
+and a row of text called 'lyric'. Ok, now for some examples:
+)
+NewStyle Guitar Tablature
+(E 0 D 2 {lyric:see how a note run is typed}, E 3,4,5,6),
+(E 0 A 2 D 2 {lyric:here's a picking pattern}, E,A,D,E,D,A),
+(E 0 A 2 D 2 {lyric:watch me justify this}, E,A,D,E,D,A),
+(E 0 A 2 D 2 {lyric:at 12 point it happened there}, E,A,D,E,D,A),
+({lyric:heres some symbols} D {tie},{up},{down},{vib}),
+({harm} {lyric:harmonic},\(3\){tie} {lyric:bend},2),
+({chord:hammer on} {h},{lyric:pull off} {p}),
+({0}{lyric:fingering},{1},{2},{3},{4})
+NewStyle Text
+(
+That was generated from this:
+)
+NewStyle
+((E 0 D 2 {lyric:see how a note run is typed}, E 3,4,5,6),
+(E 0 A 2 D 2 {lyric:here's a picking pattern}, E,A,D,E,D,A),
+(E 0 A 2 D 2 {lyric:watch me justify this}, E,A,D,E,D,A),
+(E 0 A 2 D 2 {lyric:at 12 point it happened there}, E,A,D,E,D,A),
+({lyric:heres some symbols} D {tie},{up},{down},{vib}),
+({harm} {lyric:harmonic},\(3\){tie} {lyric:bend},2),
+({chord:hammer on} {h},{lyric:pull off} {p}),
+({0}{lyric:fingering},{1},{2},{3},{4}))
+NewStyle Text
+(
+The main things to notice here, are:
+* Bars of tablature are in brackets. The program can \
+only break lines at the end of bars. It is actually possible \
+to write a system which can optionally break anywhere, but \
+it is much more complicated.
+* Columns of tablature (notes which are played simultaneously) \
+are separated by commas.
+* Text rows and tablature rows align separately. This means \
+that song lyrics can run under several columns of tab. Unfortunately, \
+it also means that a long lyric followed by a column with a chord in \
+it will leave a big gap in the tab. I know how to fix this, but it \
+makes writing styles less idiot-proof. If I can think of a good way \
+of doing it, it may eventually appear in another release. Don't hold \
+your breath though, because it would probably involve changing how \
+you write styles, and other people will probably have written their \
+own by then.
+* lyrics, chords, etc are written in the column in which they begin.
+* PStab 'remembers' the last thing you played on each string, \
+and also the last string you picked. This is to allow easy \
+entry of note runs (you don't have to keep saying the string) \
+and picking patterns (you don't have to keep sying the notes).
+* PStab interprets anything that isn't the name of a string,
+or a 'special command' (something in curly brackets) as an object \
+to be written on a string - which is why the (3) worked. You
+could even write text in the tab this way.
+* if a special command does not include a colon, then it's some \
+mark to be placed on a string. (the ties, harmonics, etc). Some \
+of the marks I use are non-standard, but they are a compromise \
+between what I should print, and what can be programmed easily.
+* tie marks and slide marks stretch to fill the gap between notes \
+if this changes.
+
+If you use this syntax, the main advantages are that PStab \
+can align lyrics and chords, and place nice-looking marks \
+in the music. However, if you're lazy and have some ASCII'd \
+tablature you want to prettify, PStab has ways of dealing with \
+that too. This is described in the next section.
+)
+NewStyle Centred
+(The ASCIItab Style)
+NewStyle Text
+(
+Commands to begin Style:
+)
+NewStyle
+(NewDoc ASCIItab
+NewStyle ASCIItab)
+NewStyle Text
+(
+I promised I'd do this in this release, and here it is. I have \
+provided a way of defining a Tablature substyle which \
+uses the ASCIIparser instead if the StdParser (the Guitar substyle \
+in the last section used the StdParser). The ASCIIparser takes \
+several rows of text and assumes they are all tab - it doesn't care \
+how many rows there are, as long as it's been told beforehand. It
+then strips out all the minus signs and tries to recognise when objects \
+are lined up in columns. This is difficult, espescially to do quickly \
+as this program must, and there are a few cases where you can make \
+the algorithm do odd things. None of them crash the program, or stop \
+it recognising bar lines - it makes bar lines where it sees a column
+of pipe symbols ( aka logical OR signs ). In fact, a bit after \
+I wrote that piece of code, I found I could easily alter it so \
+that it actually split into lines where it thought there was a bar line, \
+and consequently would break lines better. This works so well, \
+that I can see my own format being redundant (even though it \
+does look nicer, people will always prefer to send ASCII tab). \
+The ASCIItab style I have written to demostrate this assumes that it's \
+looking at guitar tablature-ie 6 rows of text at a time. Heres an \
+example which shows off its capabilities, and its weaknesses:
+)
+NewStyle ASCIItab
+(E ||--0-2-|-3---2-0-----0-2-|---------0-------|-----------------|
+B ||------|---------4-------|-0---2-4-----3-1-|-0---------------|
+G ||@-----|-----------------|-----------------|-----2-0-----0-2-|
+D ||@-----|-----------------|-----------------|---------4-------|
+A ||------|-----0---2---0---|-----------------|-----0---2---0---|
+E ||--3-2-|-0---------------|-3---2---0---2---|-3---------------|),
+
+(|--0--2-|-
+|-------|-
+|-------|-
+|-------|-
+|-------|-
+|--3--2-|-),
+(|---------------0---|
+|-4---0---(0)-----0-|
+|-------------------|
+|-------------------|
+|-2-----3--2--0-----|
+|---------------4---|),
+(|---------------0---|-----------------|-----------------|------------------|
+|-4---0---(0)-----0-|-1---3---0---1---|-----------------|------------------|
+|-------------------|-------2-------0-|-2---4-----------|------------------|
+|-------------------|---2-4-----1-2---|-------4-5---4-2-|-1---2-4-5---4--2-|
+|-2-----3--2--0-----|-0---------------|---4-6-------0---|-2---0---2--(2)---|
+|---------------4---|---------3-------|-2-------0-------|------------------|),
+(|---------------0---|
+|-4---0---(0)-----0-|
+|-------------------|
+|-------------------|
+|-2-----3--2--0-----|
+|---------------4---|)
+NewStyle Text
+(
+Which was generated from this source:
+)
+NewStyle
+((E ||--0-2-|-3---2-0-----0-2-|---------0-------|-----------------|
+B ||------|---------4-------|-0---2-4-----3-1-|-0---------------|
+G ||@-----|-----------------|-----------------|-----2-0-----0-2-|
+D ||@-----|-----------------|-----------------|---------4-------|
+A ||------|-----0---2---0---|-----------------|-----0---2---0---|
+E ||--3-2-|-0---------------|-3---2---0---2---|-3---------------|),
+
+(|--0--2-|-
+|-------|-
+|-------|-
+|-------|-
+|-------|-
+|--3--2-|-),
+(|---------------0---|
+|-4---0---(0)-----0-|
+|-------------------|
+|-------------------|
+|-2-----3--2--0-----|
+|---------------4---|),
+(|---------------0---|-----------------|-----------------|------------------|
+|-4---0---(0)-----0-|-1---3---0---1---|-----------------|------------------|
+|-------------------|-------2-------0-|-2---4-----------|------------------|
+|-------------------|---2-4-----1-2---|-------4-5---4-2-|-1---2-4-5---4--2-|
+|-2-----3--2--0-----|-0---------------|---4-6-------0---|-2---0---2--(2)---|
+|---------------4---|---------3-------|-2-------0-------|------------------|),
+(|---------------0---|
+|-4---0---(0)-----0-|
+|-------------------|
+|-------------------|
+|-2-----3--2--0-----|
+|---------------4---|))
+NewStyle Text
+(
+Note that each set of 6 rows is enclosed by brackets. You must do this. \
+It is possible to interpret whole chunks of text and find the tab - \
+even to the extent that you wouldn't need to say how many lines to \
+expect, and so that it would handle lyrics. \
+However, that is beyond the scope of this program.
+
+Now we play spot the deliberate mistakes. There are 6. Firstly, the \
+tuning in the first line wasn't reproduced: the algorithm is to ignore \
+everything up to the first column of minus signs, so that bar lines \
+don't get displayed. Note that it ignored the 'at' symbols that \
+were intended to denote a repeat for precisely the same reason. \
+In the next line, there is an unfinished empty bar. The program \
+ignores empty bars (part of the algorithm accidentally generates \
+lots of these, so this is necessary). Finally, all of the \
+bracketed numbers appeared in the wrong place. This is because the \
+bracket sticks out over the left edge of the column of things it \
+is supposed to align with. The program decides that the object \
+with the bracket, and the one without the bracket, are in fact \
+in different coulumns, and displays them that way.
+
+All in all, this does a really good job of printing ASCII'd tab, and \
+the things that cause the errors can be easily corrected by you. \
+I think this ought to be enough to satisfy most people.
+
+Incidentally, parts of this tab were from a piece by Bach, tabbed \
+by Michael S. Zraly. Unlike Woodward & Bernstein, I always name \
+my sources !
+)
+NewStyle Centred
+(Getting Control of The Layout)
+NewStyle Text
+(
+You don't have to read this. it contains optional info on \
+generating page breaks and changing fonts.
+
+How to generate a page break: there is no way for me to safely \
+do this, generally, while preserving the current style. Instead, \
+I have written a command which basically ends the current document, \
+and starts again. As an example of how this works, if we were \
+in the Verses style and wanted a page break, we would write:
+)
+NewStyle
+(PageBreak Verses)
+NewStyle Text
+(
+Which generates the required page break, and puts us back into \
+the verses style. Of course, you can actually change to any style \
+at this point - typically you would say 'PageBreak Centred' instead \
+to put a title at the start of the new page.
+
+Changing fonts: there is a command for changing font, called \
+'ChooseFont'. For those who know some PostScript: you should use \
+this instead of 'setfont', since ChooseFont also tells the program \
+the font size for internal use. Here is an example of its use:
+)
+NewStyle
+(/Times-Roman 12 ChooseFont)
+NewStyle Text
+(
+This changes to the font this text is in, in a 12 point size. \
+A point is 1/72 of an inch, and most text in books is somewhere \
+from 8 to 12 points high. Larger sizes are generally used for \
+titles. Note the slash before the name of the font. Obviously, \
+this command will only work if your printer actually has the font. \
+PostScript printers should come with the following fonts:
+Times-Roman,Times-Italic,Times-Bold,Times-BoldItalic,
+Helvetica,Helvetica-Oblique,Helvetica-Bold,Helvetica-BoldOblique,
+Courier,Courier-Oblique,Courier-Bold,Courier-BoldOblique,
+Symbol.
+
+To give you an idea of what these are, this text is Times-Roman, \
+the Centred style produced the titles in this document by default \
+in Helvetica, and the Verbatim style produces Courier. Symbol is \
+not an appropriate font for writing text in. For more on \
+fonts, you should really read 'The PostScript Language Reference \
+Manual', by Adobe Systems Inc.
+
+WARNING:You can only use this command in certain places, or you will \
+confuse the typesetter in the program. A safe place to use it \
+is immediately after you set a style. You can also use it in \
+the Centred and Verbatim styles outside of brackets. As in LaTeX, \
+it is the intention in this program to take your mind off \
+changing fonts by using sensible ones for each section of a \
+document. Hopefully, you'll heed this and use ChooseFont sparingly, \
+but if you don't, your problems are your own. I just described this \
+command so that you know what it does. A better way of using this \
+information, would be to look for the ChooseFont command in the \
+program, in the defnition of each style, and change them there. \
+This isn't recommended, but if you have particularly small or \
+large paper you may want to scale the output accordingly.
+
+Note that the Chords style, and all of the Tablature styles, \
+take account of the font size when drawing diagrams, so they \
+are the right size to fit the characters.
+)
+NewStyle Centred
+(Writing Tablature Styles)
+NewStyle Text
+(
+As usual, I'll proceed by example. Here's a style which would work \
+for guitar and bass with lyrics:
+)
+NewStyle
+(/GtrBass
+{ % a tab style. this must come BEFORE 'Tablature'
+
+ /Times-Roman 8 ChooseFont
+ StdParser % usual method of entry.
+ /TextHandler
+ {% what to do with text.depends how many text objects you have.
+ {
+ { (lyric) {pop 11 IsTextRow} }
+ } ifcase
+ } def
+
+ /TabHandler
+ {% what you call the rows that contain strings.
+ {
+ { (e) {pop 0 IsRow} }
+ { (B) {pop 1 IsRow} }
+ { (G) {pop 2 IsRow} }
+ { (D) {pop 3 IsRow} }
+ { (A) {pop 4 IsRow} }
+ { (E) {pop 5 IsRow} }
+ { (GG) {pop 7 IsRow} }
+ { (DD) {pop 8 IsRow} }
+ { (AA) {pop 9 IsRow} }
+ { (EE) {pop 10 IsRow} }
+ { /default {IsFret}}
+ } ifcase
+ } def
+ %template
+
+ [[()][()][()][()][()][()] () [()][()][()][()] ()]
+} def)
+
+NewStyle Text
+(
+What's going on here ? I defined the tab layout to be: 6 rows of \
+text with lines through, 1 row of text, 4 rows of text with lines \
+through, and another row of text. I gave the second purely text \
+row (row 11) a name, but not the first (row 6). Why ? Row 6 is always \
+left blank: so we should not make it possible to use it. \
+The program draws bar lines from the top of the staff to the \
+bottom ignoring any such gaps, which is what you expect to \
+see on a score. The object made purely of square and \
+round brackets, if you haven't \
+figured it, tells the program if its looking at text or \
+a fretting: its as simple as that. This line must come immediately \
+before you say 'Tablature' - look at the definitions of ASCIItab \
+and Guitar to see other examples. Normally, all of your \
+homebrew styles will look like this, adding or removing \
+lines from the case statements as necessary.
+
+This style also defines names for all the strings. I have \
+stuck to the same names for each of the guitar strings \
+as before, and have added the names 'EE' 'AA' 'DD' and 'GG' \
+for the bass strings.
+
+Finally, just to prove that the style I defined works, here \
+is a bar of it:
+)
+NewStyle
+ % a tab style. this must come BEFORE 'Tablature'
+
+ /Times-Roman 8 ChooseFont
+ StdParser % usual method of entry.
+ /TextHandler
+ {% what to do with text.depends how many text objects you have.
+ {
+ { (lyric) {pop 11 IsTextRow} }
+ } ifcase
+ } def
+
+ /TabHandler
+ {% what you call the rows that contain strings.
+ {
+ { (e) {pop 0 IsRow} }
+ { (B) {pop 1 IsRow} }
+ { (G) {pop 2 IsRow} }
+ { (D) {pop 3 IsRow} }
+ { (A) {pop 4 IsRow} }
+ { (E) {pop 5 IsRow} }
+ { (GG) {pop 7 IsRow} }
+ { (DD) {pop 8 IsRow} }
+ { (AA) {pop 9 IsRow} }
+ { (EE) {pop 10 IsRow} }
+ { /default {IsFret}}
+ } ifcase
+ } def
+ %template
+
+ [[()][()][()][()][()][()] () [()][()][()][()] ()]
+Tablature
+( D 1 DD 7 {lyric:An example},A 5 EE 0)
+NewStyle Text
+(
+ASCIItab is different in that it uses a different parser. \
+to rewrite this style, you should just be changing the \
+number of objects in the template. Look at the definition \
+of ASCIItab to see what I mean. The number of these held in the outer \
+pair of brackets is just the number of strings used in the tab.
+)
+NewStyle Centred
+(Writing General Styles)
+NewStyle
+(
+This is very hard - it should only be attempted by PS gurus.\
+I'll explain here a little of the innards of the program, so\
+we can see what functions are essential to a working style.\
+The comma or the end of a style (which calls Flush) should\
+first cause entry to the Parse command. This usually breaks\
+down complex objects into simple objects, and in particular,\
+into objects which should not be broken up by line or page\
+breaks, such as bars or words. For each of these, you should\
+call 'Atom' -and yes, I know you can split Atoms- which\
+in turn immediately calls GetAtom. This function should\
+set, at the very minimum, hbox and vbox, the horizontal\
+and vertical sizes of the object. These should be measured\
+in units of fbox, which is the size of the font. You don't\
+need to set fbox - that gets done by ChooseFont.
+
+Atom decides, given this information, whether or not to\
+split lines, when it calls NewLine, or start a new page,\
+when it calls NewPage. Usually, you then call Display,\
+which prints the object, but some styles I have supplied\
+print out a whole line together, so that Display is\
+called by NewLine and by Flush (it must be called by\
+Flush or the last line will not appear).
+
+And that's it. To summarize, you must define:
+
+*',' (the comma)
+*Flush
+*Parse
+*GetAtom
+*NewLine
+*NewPage
+*Display
+
+Actually, you can call Display anything you like,\
+and not define comma, sice these aren't called by\
+core functions, but in the interest of legibility\
+by others you should at least consider this.
+)
+NewStyle Centred
+(Copyrights & Copylefts)
+NewStyle Text
+(
+Sorry about this, but it's got to be done.
+
+PStab is Copyright (c) 1994 Brian Ewins. All rights reserved.
+
+PStab is distributed in the hope that it will be useful, but \
+WITHOUT ANY WARRANTY. No author or distributor accepts responsibility \
+to anyone for the consequences of using it or for whether it serves any \
+particular purpose or works at all, unless he says so in writing. Refer \
+to the PStab General Public License for full details.
+
+Everyone is granted permission to copy, modify and redistribute \
+PStab, but only under the conditions described in the PStab \
+General Public License. A copy of this license is supposed to have been \
+iven to you along with PStab so you can know your rights and \
+responsibilities. It should be in a file named COPYING. Among other \
+things, the copyright notice and this notice must be preserved on all \
+copies.
+
+This manual is part of the distribution of PStab, and is covered by \
+the same licensing agreement.
+
+ChordPro is (c) 1992 Martin Leclerc and Mario Dorion.
+
+PostScript is a registered trademark of Adobe Systems Incorporated.
+)
+NewStyle Centred
+(About the Author)
+NewStyle Text
+(
+I'm a 25 year old balding, bespectacled student, currently late \
+writing up my Ph.D. (on Computational Theoretical Nuclear \
+Physics - I kid you not). I've been playing guitar \
+since I was about 5 years old, and though I've never been \
+great, I can still hack out some Pixies or Tarrega when \
+the mood takes me. But it's always annoyed me how difficult \
+it was to get hold of tab for songs - I have for instance, \
+a copy of a Hendrix music book I got as a present, which \
+just shows the tune he sings, along with chords - and what \
+use is that? Beginners will probably disagree, but anyone can figure \
+out the chords to (most) songs - it easy. So, I was really impressed \
+when I discovered the tab I could get over the net. Never \
+satisfied, however, I thought it was a waste to print out \
+most of it as it stood, because you couldn't make it fit \
+the page properly. After a year or so of saying 'I should \
+do that' I reached breaking point when the other guy in
+my office started writing a Chinese word processor instead
+of writing _his_ thesis. As you can tell, not much real \
+work gets done round here. So, this is what I wrote, and\
+I hope you enjoy it.
+
+I'm releasing this as CardWare - it's actually freeware, \
+and there's no legal obligation on you to do this, but \
+if you liked it, send me a postcard. Preferably with \
+your favourite joke on it. (no need to translate if \
+it's not in English). My home adress is:
+
+23 Tantallon Drive
+Falkirk FK2 8DJ
+Scotland,
+U.K.
+
+I'm just curious who uses it, really.
+
+If you really feel it's worth cash, make a donation to \
+the charity of your choice. Mine would be a Multiple \
+Sclerosis charity.
+
+Comments, and suggestions for a next release, if there \
+ever is one, should be sent to:
+)
+NewStyle
+(gapv64@udcf.gla.ac.uk)
+NewStyle Text
+(
+All the best to you and yours,
+Baz.
+(Brian Ewins) March 14, 1994.
+)
+EndDoc
+
+
+