Date: Fri, 15 May 92 02:08 CDT From: Dominik Hoffmann Subject: StripFonts-unix.shar This is the Unix side of the StripFonts utility to be found in the info-mac/util directory. It had been removed from the archive. It should probably go into the info-mac/unix directory. Thanks a lot Dominik Hoffmann (I am not the author.) -------------------------------------------------------------------------------- [This is essentially the same text as found in the "Readme" file in the StripFonts.hqx archive.] What is StripFonts? ------------------ StripFonts is a program designed to be useful to a very specific set of people: those who frequently print documents by creating a PostScript file on the Mac, transferring that file to a UNIX machine, and sending it to a PostScript-compatible printer which is networked to the UNIX machine. In particular, it is aimed at people who use Adobe Type Manger, or who frequently use non-standard PostScript typefaces; in other words, people who have PostScript outline fonts in their system folders. It is also helpful to people using System 7, who no longer have the option of omitting the Apple ProcSet from their PostScript files. The presence of outline fonts in the system folder causes the printer driver to include a copy of the PostScript font definition of each font used in the document. This is because there is no way for the printer driver to know in advance which fonts will be available on the particular printer that you end up using (different printers have different sets of fonts built in, or on disk). When the printer is connected to the Macintosh itself, this is not a problem, since the Mac can ask the printer at the time of printing. However, this interaction is not possible when the printing will be performed at a later time from a different machine. The font descriptions can increase the size of the PostScript file to a startling degree, making the file-transfer process quite unwieldy. This is where StripFonts comes into play. The StripFonts package allows you remove the font definitions from a PostScript file before sending it to the UNIX machine. It can learn which fonts are built in to the printer that you will be using, and remove them "permanently" from the file, which will speed up printing time as well. StripFonts will also let you keep copies of non-built-in typefaces in a directory under UNIX, and omit those font definitions during the transfer between the Mac and the UNIX machine, saving greatly on transfer time. They need to be re-inserted into the file before it can be printed, or the printer will not be able to use the typefaces; the UNIX side of StripFonts does this. A similar trick can be used to temporarily remove the ProcSet which teaches the printer the "shorthand" that the Mac's LaserWriter driver uses. The current version of StripFonts can tell the difference between PostScript and TrueType fonts, and has no problem keeping both versions of a font, even if they have the same name. It also has an "others" category for font types that it does not recognize; for example, Macintosh bitmap fonts for which no outlines exist. In my experience with using StripFonts, the time saved in uploading is considerable. Typical documents (before stripping) for me are about 600K; after stripping they are cut down to about 40K. After adding the support for multiple font types and ProcSet removal, I created a test document using an Adobe PostScript font and a bitmap font. It was 300K bytes long. Stripping out the fonts and the ProcSet cut it down to 2K! The UNIX end reconstituted and printed it just fine. Note that if you use TrueType fonts in a document the TrueType rendering engine needs to be included so that the PostScript printer knows how to deal with the fonts. This is pretty big, on the order of 100K all by itself. I don't see any easy way for StripFonts to remove it, either, since there are no comments bracketing it to identify it or provide a version number. I can't really trust the code itself to remain static enough to blindly edit it out. Apple, you could help us out here by making this code easier to locate. Instructions ----------- StripFonts comes in two parts, a Macintosh side, for which I supply a standalone application, and a UNIX side, which is presently implemented in C-shell scripts and Emacs LISP, to be interpreted by the Free Software Foundation's GNU-Emacs editor. (Yes, I'm a little schizophrenic to like both Macs and the F.S.F. but what can you do?) If you don't have access to GNU-Emacs and don't want to try finding and installing it, you could try lighting a fire under me (or someone else) to write a more portable C version of the Unix side of StripFonts. I will likely do it very soon if nobody else does, but please let me know if you write one, so that I can include it in future distributions! The Mac application is called "StripFonts" and should be prominently present in this archive. Directions on how to use it are in the file "Mac help" until I manage to track down (or write) a nice public-domain help interface which uses the Think Class Library, and get a version of Think C that supports Balloon Help. The UNIX portions are in a shar archive that was posted separately; this archive has its own Readme file. Distribution ----------- StripFonts is free, and is distributed under John Rotenstein's wonderful HappiWare licensing scheme: If you like it, remember to smile! I would appreciate feedback about who is using the program, stating what you like, and what you would like to see, but I can obviously not promise to implement every suggested improvement since I'm supposed to be working on my degree instead of this kind of project. If you really find the program useful, please send me a picture postcard of your home town. If you're rich and want to help foster future development by this impoverished student I wouldn't turn down money either, but it should be clear that you are not expected (let alone obligated) to pay for using this program. Although it is free, it is not in the public domain in the following sense: I retain the copyright on the package and set the terms under which distribution may occur. Those terms are: You may freely distribute copies of StripFonts as long as you do so in unmodified form, and include all files and documentation which are present in this archive. You may not charge for copies of StripFonts. User groups and similar organizations may include StripFonts on disks of collected software, as long as they do not charge more than $10 for the disks. Bulletin boards, archives and anonymous FTP sites may freely offer StripFonts. Portions of the code are Copyright (C) 1989 Symantec Corporation; this does not adversely affect the above-outlined distribution terms because of the reasonable nature of their licensing agreement. I can be reached as elliott@cs.wisc.edu or, James Elliott 746 W. Main St. #302 Madison, WI 53715 Trademarks. ----------- UNIX is a trademark of AT&T Bell Laboratories. PostScript and Adobe Type Manager are trademarks of Adobe Systems, Inc. -------------cut here----------------------------------------------------------- #!/bin/sh # This is a shell archive (shar 3.21) # made 08/08/1991 22:55 UTC by elliott@veronica # Source directory /var/home/elliott/stripfonts # # existing files WILL be overwritten # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 4961 -rw-r--r-- Readme # 1774 -rwxr-xr-x list-fonts # 5149 -rwxr-xr-x print # 2609 -rwxr-xr-x strip-fonts # 2649 -rwxr-xr-x strip-procsets # 13838 -rw-r--r-- stripfonts.el # if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= Readme ============== echo "x - extracting Readme (Text)" sed 's/^X//' << 'SHAR_EOF' > Readme && XFor More Information X-------------------- X XThe documentation describing what StripFonts does and who will find it Xuseful is contained in a Macintosh TeachText document titled "Read Me", Xand is part of the BinHexed Stuffit archive that contains the Macintosh Xside of the package. Download and extract that archive and read the Xfile if you are mystified about the purpose of this code. X X XInstallation X------------ X XThe UNIX end of StripFonts consists of a set of functions written in XGNU Emacs LISP (stripfonts.el), and a set of C-shell scripts to allow Xconvenient access to those functions (print, list-fonts, strip-fonts Xand strip-procsets). X XYou will probably only need to use the "print" and "list-fonts" Xscripts; the other two are basically examples of how to call Xindividual functions from the shell. For more details on the scripts Xand functions themselves, read the comments in the files. Naturally, Xyou can call the functions directly from within emacs if you have Xloaded the stripfonts.el library. For myself, I have "autoload" Xdirectives for the library in my .emacs, so that if I try and call the Xmajor functions without previously loading the library, it will Xautomagically be loaded. X XYou will want to put the scripts somewhere that is part of the shell Xsearch-paths of the people who will be using them, and put Xstripfonts.el somewhere that will be accessible to everyone since the Xscripts need to be able to read it. X X XConfiguration X------------- X XThen you will need to edit the configuration section of each of the Xscripts at least enough to set the value of the variable that tells Xthe script where stripfonts.el can be found. X XYou will also need to edit the configuration variables in Xstripfonts.el to determine where the font and ProcSet archives should Xgo. Again, this should be somewhere accessible to all users of the Xpackage. X XOnce you have done this, you should create those directories. You can Xhave stripfonts.el do that for you: Run Emacs, load the stripfonts Xlibrary (M-x load-file stripfonts.el), then execute the command Xsetup-directories (M-x setup-directories). Make sure you've configured Xthe variables properly first! X XFor faster performance, you might want to have emacs byte-compile the Xstripfonts.el library, and then have the scripts load stripfonts.elc Xinstead. X X XEveryday use X------------ X XCreate a PostScript document on the Mac. Run StripFonts on it there. XUpload the stripped version to UNIX. Use the "print" script to print Xit out. This will automatically save copies of any new PostScript Xfonts and ProcSets that were found in the document into the local XStripFonts archive, and keep the minimal-sized version of the Xdocument. X XWhenever you get new fonts or ProcSets this way, use the "list-fonts" Xscript to generate an up-to-date list of the available fonts and XProcSets, download this to the Mac and use it to update the Mac's Xnotion of what fonts and ProcSets to remove for the uploading phase. X XIf you are using System 7.0, the PostScript output from the mac should Xbe printable "as-is". If you are using an earlier version of the Xsystem, you probably already know that the PostScript needs to be Xchanged a little bit to work, and you will be using a package called X"macps" to do this for you. You may continue to use macps in addition Xto StripFonts; in fact, the "print" script will automatically feed its Xoutput through macps if you give it the "-m" option when running it, Xor edit its configuration variables such that this is the default. X X XCopying X------- X XStripFonts is free, and is distributed under John Rotenstein's Xwonderful HappiWare licensing scheme: If you like it, remember to Xsmile! I would appreciate feedback about who is using the program, Xstating what you like, and what you would like to see, but I can Xobviously not promise to implement every suggested improvement since XI'm supposed to be working on my degree instead of this kind of Xproject. X XIf you really find the program useful, please send me a picture Xpostcard of your home town. If you're rich and want to help foster Xfuture development by this impoverished student I wouldn't turn down Xmoney either, but it should be clear that you are not expected (let Xalone obligated) to pay for using this program. X XAlthough it is free, it is not in the public domain in the following Xsense: I retain the copyright on the package and set the terms under Xwhich distribution may occur. Those terms are: You may freely Xdistribute copies of StripFonts as long as you do so in unmodified Xform, and include all files and documentation which are present in Xthis archive. You may not charge for copies of StripFonts. User Xgroups and similar organizations may include StripFonts on disks of Xcollected software, as long as they do not charge more than $10 for Xthe disks. Bulletin boards, archives and anonymous FTP sites may Xfreely offer StripFonts. X XI can be reached as elliott@cs.wisc.edu or, X X James Elliott X 746 W. Main St. #302 X Madison, WI 53715 SHAR_EOF $TOUCH -am 0614202591 Readme && chmod 0644 Readme || echo "restore of Readme failed" set `wc -c Readme`;Wc_c=$1 if test "$Wc_c" != "4961"; then echo original size 4961, current size $Wc_c fi # ============= list-fonts ============== echo "x - extracting list-fonts (Text)" sed 's/^X//' << 'SHAR_EOF' > list-fonts && X#!/bin/csh -f X# list-fonts, shell-level command for generating a list of the fonts X# which have been uploaded so far. X# X# This is part of the StripFonts package, (C) 1991 James Elliott X# (elliott@cs.wisc.edu). See the global "Readme" file for X# copying information. Requires the GNU Emacs LISP file X# stripfonts.el in order to run (and thus, GNU Emacs as well). X# X# Use: This script should be run whenever you have added new fonts to X# your UNIX stripfonts configuration (for example, by using the X# "print" script to print a document that contained fonts that X# were not previously uploaded). This script will create a file X# called "StripTargets" which should be downloaded to the X# Macintosh end of StripFonts, and opened within StripFonts X# there, and saved as the default font list (see the Macintosh X# documentation for more details if you need them). X# X# This will allow the Macintosh end of StripFonts to know X# exactly what fonts you have available, compacting future X# PostScript docments even more. X# X# Configuration: STRIPFONTS_DIR should be set to the name of the X# directory which contains stripfonts.el. TMP_DIR should be X# set to the name of a directory for temporary files; its X# default setting is probably fine. X X# Find out what directories to use. Xif (! $?STRIPFONTS_DIR) then X set STRIPFONTS_DIR = "/var/elisp" Xendif Xif (! $?TMP_DIR) then X set TMP_DIR = "/tmp" Xendif X X# Create a file telling emacs what to do. Xset ctrl_file = "$TMP_DIR/sfec.$$" Xecho '(load "'$STRIPFONTS_DIR'/stripfonts")' >$ctrl_file Xecho '(list-fonts "StripTargets")' >>$ctrl_file X X# Fire up Emacs to do the real work. Xemacs -batch -l $ctrl_file X/bin/rm -f $ctrl_file SHAR_EOF $TOUCH -am 0725171191 list-fonts && chmod 0755 list-fonts || echo "restore of list-fonts failed" set `wc -c list-fonts`;Wc_c=$1 if test "$Wc_c" != "1774"; then echo original size 1774, current size $Wc_c fi # ============= print ============== echo "x - extracting print (Text)" sed 's/^X//' << 'SHAR_EOF' > print && X#!/bin/csh -f X# print, shell-level command for printing a Macintosh PostScript document X# from which fonts and/or ProcSets have been stripped. X# X# This is part of the StripFonts package, (C) 1991 James Elliott X# (elliott@cs.wisc.edu). See the global "Readme" file for X# copying information. Requires the GNU Emacs LISP file X# stripfonts.el in order to run (and thus, GNU Emacs as well). X# X# Use: This script should be run whenever you have a partially or X# fully stripped document that you want to print. The default X# behavior of this script is to strip any new fonts and ProcSets X# from the document (so that they become available in the X# archive and need not be uploaded from now on), then save the X# stripped version (so that it takes less space), then create a X# temporary file which includes all the fonts and ProcSets, X# sending it to the printer. X# X# This default can be changed by supplying command-line X# arguments, or editing the configuration variables as described X# below. For example, you may wish to pipe the document through X# macps (if the document was not created by the System 7 version X# of the LaserWriter driver), or just write it to standard out X# so that it can be part of a pipeline. X# X# Configuration: STRIPFONTS_DIR should be set to the name of the X# directory which contains stripfonts.el. TMP_DIR should be X# set to the name of a directory for temporary files which X# will have enough room to hold the big PostScript files to X# go to the printer. X# X# If you want the default behavior to be NOT to save the X# stripped version of the file, change the line "set strip=1" X# immediately below to read "set strip=0". Then, unless you X# specify the "-s" option, stripped versions of documents will X# not be saved. Note that new fonts and ProcSets will not be X# automatically added to the archives either. X# X# If you want to send output through macps by default, change X# the line "set use_macps=0" to "set use_macps=1". Then, unless X# you specify the "+m" option, macps will be used. X X# Get the base name of this shell script. Have to do it this way X# because a bug in tcsh prevents $0:t from working. Xset progname=$0 Xset progname=$progname:t X X# Find out where the directories are supposed to be Xif (! $?STRIPFONTS_DIR) then X set STRIPFONTS_DIR = "/var/elisp" Xendif Xif (! $?TMP_DIR) then X set TMP_DIR = "/tmp" Xendif X X# Set up default behavior. Xset strip=1 Xset use_macps=0 Xset strip_aldus=0 Xset printer="" Xset files="" Xset filter=0 X X# Parse command-line arguments. Xtop: Xif ($#argv > 0) then X switch ($1:q) X X case -P*: X set printer = "$1:q" X shift X goto top X X case -t: X set filter = 1 X shift X goto top X X case -s: X set strip = 1 X shift X goto top X X case -m X set use_macps = 1 X shift X goto top X X case -a X set strip_aldus = 1 X shift X goto top X X case -*: X echo "$progname"": unknown option, $1:q" X goto usage X X case +t: X set filter = 0 X shift X goto top X X case +s: X set strip = 0 X shift X goto top X X case +m: X set use_macps = 0 X shift X goto top X X case +a X set strip_aldus = 0 X shift X goto top X X case +*: X echo "$progname"": unknown option, $1:q" X goto usage X X default: X set files = "$files $1:q" X shift X goto top X endsw Xendif X X# If nothing to process, complain. Xif ("$files" == "") goto usage X X# Create a file telling emacs what to do Xset ctrl_file = "$TMP_DIR/sfec.$$" Xecho '(load "'$STRIPFONTS_DIR'/stripfonts")' >$ctrl_file X X# Add commands to strip the new fonts, if appropriate Xif ($strip != 0) then X echo "(strip-fonts)" >>$ctrl_file X echo "(strip-procsets)" >>$ctrl_file X echo "(save-buffer)" >>$ctrl_file Xendif X X# Similarly for stripping the Aldus error handler Xif ($strip_aldus != 0) then X echo "(strip-aldus-error-handler)" >>$ctrl_file Xendif X X# Now a command to include the fonts for printing Xecho "(include-fonts)" >>$ctrl_file Xecho "(include-procsets)" >>$ctrl_file X X# And finally, pick a file for emacs to write the temporary results to Xset dest_file = "$TMP_DIR/ps.$$" Xecho '(write-file "'$dest_file'")' >>$ctrl_file X X# Now process each of the files Xforeach i ($files) X if ($filter == 0) then X emacs -batch $i -l $ctrl_file X if ($use_macps != 0) then X macps $dest_file | lpr $printer X else X lpr $printer $dest_file X endif X else # Filter mode; output to stdout, and supress Emacs' messages. X emacs -batch $i -l $ctrl_file >/dev/null X if ($use_macps != 0) then X macps $dest_file X else X cat $dest_file X endif X endif X /bin/rm -f $dest_file Xend X X# Clean up. X/bin/rm -f $ctrl_file Xgoto done X X# Give a description of how to invoke this script. Xusage: Xecho "" Xecho "usage: $progname [-P ] [-t] [+|-a] [+|-m] [+|-s] " Xecho " If '-t' is present, acts as a filter (writes to standard output)." Xecho "" X Xecho "options ('-' activates, '+' deactivates):" Xecho " a: remove Aldus error handler, if present" Xecho " m: feed output through macps" Xecho " s: strip file, archiving new fonts/ProcSets (active by default)" X Xdone: SHAR_EOF $TOUCH -am 0725170591 print && chmod 0755 print || echo "restore of print failed" set `wc -c print`;Wc_c=$1 if test "$Wc_c" != "5149"; then echo original size 5149, current size $Wc_c fi # ============= strip-fonts ============== echo "x - extracting strip-fonts (Text)" sed 's/^X//' << 'SHAR_EOF' > strip-fonts && X#!/bin/csh -f X# X# strip-fonts, shell-level command for stripping PostScript fonts from a X# Macintosh PostScript document. X# X# This is part of the StripFonts package, (C) 1991 James Elliott X# (elliott@cs.wisc.edu). See the global "Readme" file for X# copying information. Requires the GNU Emacs LISP file X# stripfonts.el in order to run (and thus, GNU Emacs as well). X# X# Use: This script should be run whenever you have uploaded a document X# that contains "new" fonts, ie, fonts that are not yet part of X# your archived set on this machine. It will copy the fonts into X# the archive, so that you will not need to upload them in the X# future. By default, it will also save the document with the X# fonts stripped out so that it will use less space on disk. If X# you are about to print the document, you should just let the X# "print" script take care of this for you instead of using this X# script; by default "print" strips and saves fonts. X# X# Configuration: STRIPFONTS_DIR should be set to the name of the X# directory which contains stripfonts.el. If you want the X# default behavior to be NOT saving the stripped file, change X# the line "set save=1" immediately below to read "set save=0". X# Then, unless you specify the "-s" option, stripped versions of X# documents will not be saved. X X# Get the base name of this shell script. Have to do it this way X# because a bug in tcsh prevents $0:t from working. Xset progname=$0 Xset progname=$progname:t X X# Set up default behavior. Xif (! $?STRIPFONTS_DIR) then X set STRIPFONTS_DIR = "/var/elisp" Xendif Xset files="" Xset save=1 X X# Parse command-line arguments. Xtop: Xif ($#argv > 0) then X switch ($1:q) X X case -s: X set save = 1 X shift X goto top X X case +s: X set save = 0 X shift X goto top X X case -*: X echo "$progname"": unknown option, $1:q" X goto usage X X case +*: X echo "$progname"": unknown option, $1:q" X goto usage X X default: X set files = "$files $1:q" X shift X goto top X endsw Xendif X X# If nothing to process, complain. Xif ("$files" == "") goto usage X X# Do what was specified. Xforeach i ($files) X if ($save == 0) then X emacs -batch $i -l $STRIPFONTS_DIR/stripfonts -f strip-fonts X else X emacs -batch $i -l $STRIPFONTS_DIR/stripfonts -f strip-fonts \ X -f save-buffer X endif Xend Xgoto done X X# Give a description of how to invoke this script. Xusage: Xecho "" Xecho "usage: $progname [+|-s] " Xecho "" X Xecho "options ('-' activates, '+' deactivates):" Xecho " s: save the shortened version of the files (active by default)" X Xdone: SHAR_EOF $TOUCH -am 0725170791 strip-fonts && chmod 0755 strip-fonts || echo "restore of strip-fonts failed" set `wc -c strip-fonts`;Wc_c=$1 if test "$Wc_c" != "2609"; then echo original size 2609, current size $Wc_c fi # ============= strip-procsets ============== echo "x - extracting strip-procsets (Text)" sed 's/^X//' << 'SHAR_EOF' > strip-procsets && X#!/bin/csh -f X# X# strip-procsets, shell-level command for stripping PostScript ProcSets X# from a Macintosh PostScript document. X# X# This is part of the StripFonts package, (C) 1991 James Elliott X# (elliott@cs.wisc.edu). See the global "Readme" file for X# copying information. Requires the GNU Emacs LISP file X# stripfonts.el in order to run (and thus, GNU Emacs as well). X# X# Use: This script should be run whenever you have uploaded a document X# that contains "new" ProcSets, ie, ProcSets that are not yet X# part of your archived set on this machine. It will copy the X# ProcSets into the archive, so that you will not need to upload X# them in the future. By default, it will also save the document X# with the ProcSets stripped out so that it will use less space X# on disk. If you are about to print the document, you should X# just let the "print" script take care of this for you instead X# of using this script; by default "print" strips and saves X# procsets. X# X# Configuration: STRIPFONTS_DIR should be set to the name of the X# directory which contains stripfonts.el. If you want the X# default behavior to be NOT saving the stripped file, change X# the line "set save=1" immediately below to read "set save=0". X# Then, unless you specify the "-s" option, stripped versions of X# documents will not be saved. X X# Get the base name of this shell script. Have to do it this way X# because a bug in tcsh prevents $0:t from working. Xset progname=$0 Xset progname=$progname:t X X# Set up default behavior. Xif (! $?STRIPFONTS_DIR) then X set STRIPFONTS_DIR = "/var/elisp" Xendif Xset files="" Xset save=1 X X# Parse command-line arguments. Xtop: Xif ($#argv > 0) then X switch ($1:q) X X case -s: X set save = 1 X shift X goto top X X case +s: X set save = 0 X shift X goto top X X case -*: X echo "$progname"": unknown option, $1:q" X goto usage X X case +*: X echo "$progname"": unknown option, $1:q" X goto usage X X default: X set files = "$files $1:q" X shift X goto top X endsw Xendif X X# If nothing to process, complain. Xif ("$files" == "") goto usage X X# Do what was specified. Xforeach i ($files) X if ($save == 0) then X emacs -batch $i -l $STRIPFONTS_DIR/stripfonts -f strip-procsets X else X emacs -batch $i -l $STRIPFONTS_DIR/stripfonts -f strip-procsets \ X -f save-buffer X endif Xend Xgoto done X X# Give a description of how to invoke this script. Xusage: Xecho "" Xecho "usage: $progname [+|-s] " Xecho "" X Xecho "options ('-' activates, '+' deactivates):" Xecho " s: save the shortened version of the files (active by default)" X Xdone: SHAR_EOF $TOUCH -am 0725170991 strip-procsets && chmod 0755 strip-procsets || echo "restore of strip-procsets failed" set `wc -c strip-procsets`;Wc_c=$1 if test "$Wc_c" != "2649"; then echo original size 2649, current size $Wc_c fi # ============= stripfonts.el ============== echo "x - extracting stripfonts.el (Text)" sed 's/^X//' << 'SHAR_EOF' > stripfonts.el && X;;;;;;;;;;;;;;;;;;;;;;;;;;; -*- Mode: Emacs-Lisp -*- ;;;;;;;;;;;;;;;;;;;;;;;;;; X;; stripfonts.el --- UNIX end of StripFonts package. X;; Author : James Elliott X;; Created On : Sun Sep 9 13:21:59 1990 X;; Last Modified By: James Elliott X;; Last Modified On: Fri Jun 14 18:17:56 1991 X;; Update Count : 48 X;; Status : Author uses frequently; first release to world. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X;; This is part of the StripFonts package, (C) 1991 James Elliott X;; (elliott@cs.wisc.edu). See the global "Readme" file for copying X;; information. X;; X;; This file defines a set of functions which are useful in working X;; with Macintosh PostScript files. In conjunction with the Macintosh X;; end, the package allows font definitions and ProcSets to be omitted X;; from the files while they are uploaded (and stored on disk) to save X;; a great deal of time and space. These routines maintain an X;; organized set of directories which keep copies of the fonts known X;; so far (so that they need be uploaded only once), strip new fonts X;; out of documents and into the archives, and re-insert the fonts and X;; ProcSets into the documents at printing time. X;; X;; You may well wish to use the shell-scripts which were provided X;; with this file as your primary interface to these functions. Most X;; day-to-day needs can be filled by the "print" script, which calls X;; functions in this file by running Emacs in batch mode. If you want X;; to call the functions yourself, or understand how they work, feel X;; free to browse through this code. X X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X;; X;; Configuration variables: Edit the values of these variables to X;; determine where to locate your font archives, etc. X;; X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X(defvar *font-directory* "/var/fonts/" X "*Directory in which to find and install copies of the outline Xfonts used in uploading Macintosh documents.") X X(defvar *ps-subdir* "PostScript/" X "*Subdirectory name in which PostScript fonts should be placed.") X X(defvar *tt-subdir* "TrueType/" X "*Subdirectory name in which TrueType fonts should be placed.") X X(defvar *unknown-subdir* "unknown/" X "*Subdirectory name in which fonts of unknown format (e.g. bitmaps) should Xbe placed.") X X(defvar *procset-subdir* "procsets/" X "*Subdirectory name in which ProcSets should be placed.") X X(defvar *procset-info* (concat *font-directory* *procset-subdir* "info") X "*File containing list of ProcSets and their file names.") X X(defvar *screen-files* '("UserPrep" "AdvUserPrep") X "List of extraneous files in the fonts directory, such as user prep files, Xwhich may be desirable in the inclusion process, but should not show up in Xthe font list.") X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X;; X;; Run this function once to create the directories named above. You X;; need to do this for StripFonts to work properly. X;; X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X(defun setup-directories () X "This function should just be run once when initially setting up your XStripFonts package; it will create the directories needed by the routines Xin this file, as specified by the variables above. Configure the variables Xto your satisfaction before running this." X X (interactive ""); X X (shell-command (concat "mkdir " X (directory-file-name *font-directory*) " " X (directory-file-name (concat *font-directory* X *ps-subdir*)) " " X (directory-file-name (concat *font-directory* X *tt-subdir*)) " " X (directory-file-name (concat *font-directory* X *unknown-subdir*)) " " X (directory-file-name (concat *font-directory* X *procset-subdir*))))) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X;; X;; Here are the functions themselves... X;; X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X(defun strip-fonts () X "Search through a Mac PS document for font definitions and replace them Xwith include requests. If copies of the fonts are not already present in the Xfont directory, add them." X X (interactive "") X X (let ((oldbuf (current-buffer)) X (buf (get-buffer-create "*strip-temp*")) X subdir name-prefix X name beg) X X (save-excursion X (goto-char (point-min)) X (if (not (or (looking-at "%!PS-Adobe") (looking-at "%!PS-Stripped"))) X (error "File does not seem to be PostScript")) X (if (looking-at "%!PS-Adobe") X (progn X (forward-char 10) X (delete-region (point-min) (point)) X (insert "%!PS-Stripped"))) X (while (re-search-forward "^%%BeginFont: \\(.*\\)" nil t) X (setq name (buffer-substring (match-beginning 1) (match-end 1))) X (setq beg (match-beginning 0)) X (beginning-of-line 2) X (if (looking-at "%!PS-AdobeFont-") X (setq subdir *ps-subdir* name-prefix "p:") X (if (looking-at "%!PS-TrueTypeFont-") X (setq subdir *tt-subdir* name-prefix "t:") X (setq subdir *unknown-subdir* name-prefix "u:"))) X (re-search-forward "^%%EndFont *\n") X (kill-region beg (match-end 0)) X (insert (concat "%%#IncludeFont " name-prefix name "\n")) X (if (null (file-readable-p (concat *font-directory* subdir name))) X (progn X (set-buffer buf) X (erase-buffer) X (yank) X (write-file (concat *font-directory* subdir name)) X (set-buffer oldbuf) X ) X ) X ) X (kill-buffer buf) X))) X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X(defun procset-filename (name) X "Return the name of the file containing the specified ProcSet, if it exists." X X (if (file-exists-p *procset-info*) X (let ((oldbuf (current-buffer)) X (buf (get-buffer-create "*proc-temp*")) X (result nil)) X (set-buffer buf) X (erase-buffer) X (insert-file *procset-info*) X (goto-char (point-min)) X (if (re-search-forward (concat "^" (regexp-quote name) "\\s-*\t") X nil t) X (progn X (end-of-line 1) X (setq result (buffer-substring (match-end 0) (point))))) X (set-buffer oldbuf) X (kill-buffer buf) X result X ) X nil X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun new-procset-filename (name) X "Creates a new file name for the given ProcSet and adds it to the list." X X (let ((oldbuf (current-buffer)) X (buf (get-buffer-create "*proc-temp*")) X (num 1)) X (set-buffer buf) X (erase-buffer) X (if (file-exists-p *procset-info*) X (insert-file *procset-info*)) X (goto-char (point-max)) X (while (file-exists-p (concat *font-directory* *procset-subdir* "set_" X num)) X (setq num (1+ num))) X (insert name "\tset_" (int-to-string num) "\n") X (write-file *procset-info*) X (set-buffer oldbuf) X (kill-buffer buf) X (concat "set_" num) X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun strip-procsets () X "Search through a Mac PS document for ProcSets and replace them with Xinclude requests. If copies of the fonts are not already present in the Xfont directory, add them." X X (interactive "") X X (let ((oldbuf (current-buffer)) X (buf (get-buffer-create "*strip-temp*")) X name beg) X X (save-excursion X (goto-char (point-min)) X (if (not (or (looking-at "%!PS-Adobe") (looking-at "%!PS-Stripped"))) X (error "File does not seem to be PostScript")) X (while (re-search-forward "^%%BeginProcSet: \\(.*\\)" nil t) X (setq name (buffer-substring (match-beginning 1) (match-end 1))) X (setq beg (match-beginning 0)) X (re-search-forward "^%%EndProcSet *\n") X (kill-region beg (match-end 0)) X (insert (concat "%%IncludeProcSet " name "\n")) X (if (null (procset-filename name)) X (progn X (set-buffer buf) X (erase-buffer) X (yank) X (write-file (concat *font-directory* *procset-subdir* X (new-procset-filename name))) X (set-buffer oldbuf) X ) X ) X ) X (kill-buffer buf) X))) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun include-fonts () X "Search through a Mac PS document for font definitions that have been Xelided, and replace them with the actual font definitions." X X (interactive "") X X (let (name name-prefix subdir) X (save-excursion X (goto-char (point-min)) X (if (not (or (looking-at "%!PS-Adobe") (looking-at "%!PS-Stripped"))) X (error "File does not seem to be PostScript")) X (if (looking-at "%!PS-Stripped") X (progn X (forward-char 13) X (delete-region (point-min) (point)) X (insert "%!PS-Adobe"))) X (while (re-search-forward "^%%#IncludeFont \\(.*\\)\n" nil t) X (setq name (buffer-substring (match-beginning 1) (match-end 1))) X (setq name-prefix (substring name 0 2)) X (setq name (substring name 2)) X (cond X ((string-equal name-prefix "p:") (setq subdir *ps-subdir*)) X ((string-equal name-prefix "t:") (setq subdir *tt-subdir*)) X ((string-equal name-prefix "u:") (setq subdir *unknown-subdir*)) X (t (setq subdir *ps-subdir*) X (setq name (concat name-prefix name)) X (message X "Unknown or missing font prefix for %s; assuming PostScript" X name))) X (if (null (file-readable-p X (concat *font-directory* subdir name))) X (error "Font definition for %s is not available" name)) X (kill-region (match-beginning 0) (match-end 0)) X (insert-file (concat *font-directory* subdir name)) X ) X ) X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun include-procsets () X "Search through a Mac PS document for ProcSets that have been Xelided, and replace them with the actual font definitions." X X (interactive "") X X (save-excursion X (goto-char (point-min)) X (if (not (or (looking-at "%!PS-Adobe") (looking-at "%!PS-Stripped"))) X (error "File does not seem to be PostScript")) X (while (re-search-forward "^%%IncludeProcSet \\(.*\\)\n" nil t) X (let ((name (buffer-substring (match-beginning 1) (match-end 1))) X (front (match-beginning 0)) X (back (match-end 0))) X (if (null (procset-filename name)) X (error "ProcSet %s is not available" name)) X (kill-region front back) X (insert-file (concat *font-directory* *procset-subdir* X (procset-filename name))) X ) X ) X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun member (item set) ;; INTERNAL FUNCTION, not for calling by X ;; users. X X "Returns NIL if item is not in the list, or the cdr of the list starting Xwith that item if it is found." X X (while (and set (not (equal (car set) item))) X (setq set (cdr set))) X X set X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun list-procsets () X "Insert a list of all the available procsets." X X (if (file-exists-p *procset-info*) X (let ((oldbuf (current-buffer)) X (buf (get-buffer-create "*proc-temp*")) X name) X (set-buffer buf) X (erase-buffer) X (insert-file *procset-info*) X (goto-char (point-min)) X (while (re-search-forward "^\\(.*\\)\t.*$" nil t) X (setq name (buffer-substring (match-beginning 1) (match-end 1))) X (set-buffer oldbuf) X (insert "c:" name "\n") X (set-buffer buf)) X (set-buffer oldbuf) X (kill-buffer buf) X ) X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun list-fonts-aux (subdir pfx) ;; INTERNAL FUNCTION, not for X ;; calling by users... X X "Generate a listing of fonts from SUBDIRECTORY with prefix PREFIX. Used Xinternally by list-fonts." X X (let ((files (directory-files (concat *font-directory* subdir)))) X (while files X (if (and (null (file-directory-p X (concat *font-directory* subdir (car files)))) X (not (member (car files) *screen-files*))) X (insert (concat pfx (car files) "\n"))) X (setq files (cdr files))) X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun list-fonts (&optional fname) X "Generate a line for each font file available in the fonts directory. XUsed by the Mac end in stripping fonts before uploading. Now also lists Xavailable ProcSets. If called with a parameter, saves the list to the Xfile named in that parameter (not available interactively)." X X (interactive "") X X (let ((oldbuf (current-buffer)) X (buf (get-buffer-create "*font-list*"))) X (set-buffer buf) X (erase-buffer) X (insert "%%StripFonts Format 1.2\n"); X (insert "%%List generated on ") X (insert (current-time-string)) X (insert "\n"); X X ;;List the ProcSets which have been uploaded X (insert "\n%%ProcSets available:\n"); X (list-procsets) X X ;;List the fonts which have been uploaded X (insert "\n%%PostScript fonts available:\n"); X (list-fonts-aux *ps-subdir* "p:") X (insert "\n%%TrueType fonts available:\n"); X (list-fonts-aux *tt-subdir* "t:") X (insert "\n%%Other fonts available:\n"); X (list-fonts-aux *unknown-subdir* "u:") X X (goto-char (point-min)) X (display-buffer "*font-list*") X (if fname (write-file fname)) X (set-buffer oldbuf) X ) X) X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X X(defun strip-aldus-error-handler () X "Remove the code from a PS document introduced by Aldus programs to Xprint the postscript error on the page. Useful in environments where Xthe default error handler is more useful, e.g. it sends mail back to the Xperson submitting the job." X X (interactive "") X X (goto-char (point-min)) X (if (re-search-forward X "^%\. Error handling code - don't do this if printing to Lino$" nil t) X (let ((start (match-beginning 0)) X (end)) X (re-search-forward "^%\.$") X (setq end (match-end 0)) X (kill-region start end) X (insert "%% Aldus error handler removed from this spot."))) X) SHAR_EOF $TOUCH -am 0614181791 stripfonts.el && chmod 0644 stripfonts.el || echo "restore of stripfonts.el failed" set `wc -c stripfonts.el`;Wc_c=$1 if test "$Wc_c" != "13838"; then echo original size 13838, current size $Wc_c fi exit 0 .