12. PostScript Fonts Used by GMT
GMT uses the standard 35 fonts that come with most PostScript laserwriters. If your printer does not support some of these fonts, it will automatically substitute the default font (which is usually Courier). The following is a list of the GMT fonts:
Here is the source script for the figure above:
dy=-0.2222
y0=4.3
yy=4.0778
tr '",' ' ' < "${GMT_SOURCE_DIR}"/src/standard_adobe_fonts.h | awk '{print $2}' > tt.d
gmt begin GMT_App_G
gmt set GMT_THEME cookbook
gmt set MAP_FRAME_PEN thinner
gmt plot -R0/5.4/0/$y0 -Jx1i -B0 <<EOF
>
0.3 0
0.3 $y0
>
2.7 0
2.7 $y0
>
3 0
3 $y0
EOF
gmt text -Y${yy}i -F+f10p+jBC <<EOF
0.15 0.05 \\043
1.55 0.05 Font Name
2.85 0.05 \\043
4.15 0.05 Font Name
EOF
gmt plot <<EOF
0 0
5.4 0
EOF
let i=1
while [ $i -le 17 ]
do
i1=$(( i-1 ))
i2=$(( i1+17 ))
k1=$i
k2=$(( i+17 ))
f1=$(sed -n ${k1}p tt.d)
f2=$(sed -n ${k2}p tt.d)
if [ $i1 -eq "12" ]; then
f1="Symbol @%0%(Symbol)@%%"
fi
fn2=$i2
gmt text -Y${dy}i -F+f+j <<EOF
0.15 0.03 10p,$i1 BC $i1
0.4 0.03 10p,$i1 BL $f1
2.85 0.03 10p,$fn2 BC $i2
3.1 0.03 10p,$i2 BL $f2
EOF
let i=i+1
done
gmt text -Y${dy}i -F+f+j <<EOF
2.85 0.03 10p,Helvetica BC 34
3.1 0.03 10p,ZapfDingbats BL ZapfDingbats @%0%(ZapfDingbats)@%%
EOF
gmt end show
For the special fonts Symbol (12) and ZapfDingbats (34), see the octal charts in Chapter Chart of Octal Codes for Characters. When specifying fonts in GMT, you can either give the entire font name or just the font number listed in this table. To change the fonts used in plotting basemap frames, see the man page for gmt.conf. For direct plotting of text-strings, see the man page for text.
12.1. Using non-default fonts with GMT
To add additional fonts that you may have purchased or that are
available freely in the internet or at your institution, you will need
to tell GMT some basic information about such fonts. GMT does
not actually read or process any font files and thus does not know anything about
installed fonts and their metrics. In order to use extra fonts in
GMT you need to specify the PostScript name of the relevant fonts in
the file PSL_custom_fonts.txt
. We recommend you place this file in
your GMT user directory (~/.gmt) as GMT will look there as well as in your
home directory. Below is an example of a typical entry for two separate fonts:
LinBiolinumO 0.700 0
LinLibertineOB 0.700 0
The format is a space delimited list of the PostScript font name, the font’s height-point size-ratio, and a boolean variable that tells GMT to re-encode the font (if set to zero). The latter has to be set to zero as additional fonts will most likely not come in standard PostScript encoding. GMT determines how tall typical annotations might be from the font size ratio so that the vertical position of labels and titles can be adjusted to a more uniform typesetting. This ratio can be estimated from the height of the letter A for a unit font size. Now, you can set the GMT font parameters to your non-standard fonts:
gmt set FONT LinBiolinumO \
FONT_TITLE 28p,LinLibertineOB \
PS_CHAR_ENCODING ISO-8859-1 \
MAP_DEGREE_SYMBOL degree
After setting the encoding and the degree symbol, the configuration part for GMT is finished and you can proceed to create GMT maps as usual. An example script is discussed in Example (31) Using non-default fonts in PostScript.
12.1.1. Embedding fonts in PostScript and PDF
If you have Type 1 fonts in PFA (Printer Font ASCII) format you can embed them directly by copying them at the very top of your PostScript file, before even the %!PS header comment. PFB (Printer Font Binary), TrueType or OpenType fonts cannot be embedded in PostScript directly and therefore have to be converted to PFA first.
However, you most likely will have to tell Ghostscript where to
find your custom fonts in order to convert your GMT PostScript plot
to PDF or an image with psconvert.
When you have used the correct PostScript names of the fonts in PSL_custom_fonts.txt
you
only need to point the GS_FONTPATH
environment variable to the
directory where the font files can be found and invoke
psconvert in the usual way. Likewise
you can specify Ghostscript’s -sFONTPATH
option on the
command line with -C-sFONTPATH=/path/to/fontdir
. Ghostscript,
which is invoked by psconvert, does
not depend on file names. It will automatically find the relevant font
files by their PostScript names and embed and subset them in
PDF files. This is quite convenient as the document can be displayed and
printed even on other computers when the font is not available locally.
There is no need to convert your fonts as Ghostscript can handle
all Type 1, TrueType and OpenType fonts. Note also, that you do not need
to edit Ghostscript’s Fontmap.
If you do not want or cannot embed the fonts you can convert them to outlines (shapes with fills) with Ghostscript in the following way:
gs -q -dNOCACHE -dNOSAFER -dNOPAUSE -dBATCH -dNOPLATFONTS \
-sDEVICE=ps2write -sFONTPATH="/path/to/fontdir" \
-sOutputFile=mapWithOutlinedFonts.ps map.ps
Note, that this only works with the ps2write device. If you need outlined fonts in PDF, create the PDF from the converted PostScript file. Also, psconvert cannot correctly crop Ghostscript converted PostScript files anymore. Use Heiko Oberdiek’s instead or crop with psconvert -A -Te before (See Example (31) Using non-default fonts in PostScript).
12.1.2. Character encoding
Since PostScript itself does not support Unicode fonts, Ghostscript will re-encode the fonts on the fly. You have to make sure to set the correct PS_CHAR_ENCODING with gmtset and save your script file with the same character encoding. Alternatively, you can substitute all non ASCII characters with their corresponding octal codes, e.g., \265 instead of μ. Note, that PostScript fonts support only a small range of glyphs and you may have to switch the PS_CHAR_ENCODING within your script.