
###########################################################################
#                                                                         #
#   lengths                                                               #
#                                                                         #
#   Jeffrey H. Kingston                                                   #
#   30 October 2002                                                       #
#                                                                         #
#  This program is free software; you can redistribute it and/or modify   #
#  it under the terms of the GNU General Public License as published by   #
#  the Free Software Foundation; either Version 3, or (at your option)    #
#  any later version.                                                     #
#                                                                         #
#  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 for more details.                           #
#                                                                         #
#  You should have received a copy of the GNU General Public License      #
#  along with this program; if not, write to the Free Software            #
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA #
#                                                                         #
#  As a special exception, when this file is read by Lout when processing #
#  a Lout source document, you may use the result without restriction.    #
#                                                                         #
#   This file offers two symbols for converting between PostScript        #
#   lengths and Lout lengths.  This has been a messy area and the two     #
#   symbols in this file, @LoutLengths and @PSLengths, are my attempt     #
#   to put a final end to the mess.                                       #
#                                                                         #
#   A Lout length is, and has always been, a number followed by           #
#   a one-letter unit of measurement: i c p m s v f d.                    #
#                                                                         #
#   A PostScript length is, and has always been, a number followed        #
#   by a space followed by a two-letter unit of measurement, one of       #
#   in cm pt em sp vs ft dg.                                              #
#                                                                         #
#   To the ordinary user who reads the User's Guide, all lengths          #
#   now look like Lout lengths.  However, internally some of these        #
#   lengths are used by Lout and others are passed to PostScript.         #
#   Based on the two symbols @PSLengths and @LoutLengths defined          #
#   below, an option x which could contain a length of either kind        #
#   can be classified as one of three types:                              #
#                                                                         #
#   Type of option                  How to handle it                      #
#   -------------------------------------------------------------------   #
#   Option was never advertised     named x { ... }                       #
#   as taking a PostScript length                                         #
#                                                                         #
#   Option was advertised as        import @LoutLengths named x { ... }   #
#   possibly taking a PostScript                                          #
#   length, but its value is used                                         #
#   by Lout                                                               #
#                                                                         #
#   Option whose value has to be    import @PSLengths named x { ... }     #
#   passed to PostScript                                                  #
#   -------------------------------------------------------------------   #
#                                                                         #
#   Either kind of import allows either kind of length to be given;       #
#   @LoutLengths makes sure the final result is suitable for passing      #
#   to Lout, while @PSLengths makes sure the final result is suitable     #
#   for passing to PostScript.  If things had been done right from the    #
#   start, there would be no need for @LoutLengths, but for backward      #
#   compatibility we will continue to use it basically forever.           #
#                                                                         #
###########################################################################


###########################################################################
#                                                                         #
#   @LoutLengths                                                          #
#                                                                         #
#   Convert PostScript lengths into Lout lengths.                         #
#                                                                         #
###########################################################################

export in cm pt em sp vs ft dg
def @LoutLengths
{
    def in left x { x"i" }
    def cm left x { x"c" }
    def pt left x { x"p" }
    def em left x { x"m" }
    def sp left x { x"s" }
    def vs left x { x"b" }
    def ft left x { x"f" }
    def dg left x { x"d" }
}


###########################################################################
#                                                                         #
#   @PSLengths                                                            #
#                                                                         #
#   Convert Lout lengths into PostScript (also PDF) lengths.              #
#   PDF is no longer supported but this code was there already so         #
#   it's been carried over.                                               #
#                                                                         #
###########################################################################

export i c p m s v f d
def @PSLengths
{
    def i left x {
	@BackEnd @Case {
	    PostScript @Yield { x" in" }
	    PDF        @Yield { "__mul(__in, "x")" }
	    PlainText  @Yield ""
	}
    }

    def c left x {
	@BackEnd @Case {
	    PostScript @Yield { x" cm" }
	    PDF        @Yield { "__mul(__cm, "x")" }
	    PlainText  @Yield ""
	}
    }

    def p left x {
	@BackEnd @Case {
	    PostScript @Yield { x" pt" }
	    PDF        @Yield { "__mul(__pt, "x")" }
	    PlainText  @Yield ""
	}
    }

    def m left x {
	@BackEnd @Case {
	    PostScript @Yield { x" em" }
	    PDF        @Yield { "__mul(__em, "x")" }
	    PlainText  @Yield ""
	}
    }

    def s left x {
	@BackEnd @Case {
	    PostScript @Yield { x" sp" }
	    PDF        @Yield { "__mul(__louts, "x")" }
	    PlainText  @Yield ""
	}
    }

    def v left x {
	@BackEnd @Case {
	    PostScript @Yield { x" vs" }
	    PDF        @Yield { "__mul(__loutv, "x")" }
	    PlainText  @Yield ""
	}
    }

    def f left x {
	@BackEnd @Case {
	    PostScript @Yield { x" ft" }
	    PDF        @Yield { "__mul(__loutf, "x")" }
	    PlainText  @Yield ""
	}
    }

    def d left x {
	@BackEnd @Case {
	    PostScript @Yield { x" dg" }
	    PDF        @Yield { "__mul(__loutd, "x")" }
	    PlainText  @Yield ""
	}
    }
}
