rem: output_pl(metrics, ps_name, boundary_char, family_otf, family_cff, true, outfile, errh);
add: output_pl(metrics, ps_name, boundary_char, finfo, true, outfile, errh);
context: output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,	       const OpenType::Font &family_otf, const Cff::Font *family_cff,	       const String &encoding_name, const String &encoding_file,	       const String &font_name,	       void (*dvips_include)(const String &ps_name, StringAccum &, ErrorHandler *),	       ErrorHandler *errh){    String base_font_name = font_name;    bool need_virtual = metrics.need_virtual(257);    if (need_virtual) {	if (output_flags & G_VMETRICS)	    base_font_name = make_base_font_name(font_name);	else if (output_flags & G_METRICS)	    errh->warning("features require virtual fonts");    }        // output virtual metrics    if (!(output_flags & G_VMETRICS))	/* do nothing */;    else if (!need_virtual) {	if (automatic) {	    // erase old virtual font	    String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";	    if (no_create)		errh->message("would remove potential VF file '%s'", vf.c_str());	    else if (verbose)		errh->message("removing potential VF file '%s'", vf.c_str());	    if (!no_create && unlink(vf.c_str()) < 0 && errno != ENOENT)		errh->error("removing %s: %s", vf.c_str(), strerror(errno));	}    } else {	if (output_flags & G_BINARY) {	    String tfm = getodir(O_TFM, errh) + "/" + font_name + ".tfm";	    String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";	    output_tfm(metrics, ps_name, boundary_char, family_otf, family_cff, tfm, vf, errh);	} else {	    String outfile = getodir(O_VPL, errh) + "/" + font_name + ".vpl";	    output_pl(metrics, ps_name, boundary_char, family_otf, family_cff, true, outfile, errh);	    update_odir(O_VPL, outfile, errh);	}	metrics.make_base(257);    }    // output metrics    double save_minimum_kern = minimum_kern;    if (need_virtual)	minimum_kern = 100000;    if (!(output_flags & G_METRICS))	/* do nothing */;    else if (output_flags & G_BINARY) {	String tfm = getodir(O_TFM, errh) + "/" + base_font_name + ".tfm";	output_tfm(metrics, ps_name, boundary_char, family_otf, family_cff, tfm, String(), errh);    } else {	String outfile = getodir(O_PL, errh) + "/" + base_font_name + ".pl";	output_pl(metrics, ps_name, boundary_char, family_otf, family_cff, false, outfile, errh);	update_odir(O_PL, outfile, errh);    }    minimum_kern = save_minimum_kern;    // print DVIPS map line    if (errh->nerrors() == 0 && (output_flags & G_PSFONTSMAP)) {	StringAccum sa;	sa << base_font_name << ' ' << ps_name << " \"";	if (extend)	    sa << extend << " ExtendFont ";	if (slant)	    sa << slant << " SlantFont ";	if (encoding_name)	    sa << encoding_name << " ReEncodeFont\" <[" << pathname_filename(encoding_file);	else	    sa << "\"";	sa << ' ';	dvips_include(ps_name, sa, errh);	sa << '\n';	update_autofont_map(base_font_name, sa.take_string(), errh);	// if virtual font, remove any map line for base font name	if (base_font_name != font_name)	    update_autofont_map(font_name, "", errh);    }}