Factor out duplicated code

This commit is contained in:
Juergen Spitzmueller 2012-08-18 11:57:16 +02:00
parent 924f71c792
commit a9ad5c3337
3 changed files with 54 additions and 78 deletions

View File

@ -2785,17 +2785,7 @@ string const BufferParams::loadFonts(string const & rm,
bool const & use_systemfonts,
LaTeXFeatures & features) const
{
/* The LaTeX font world is in a flux. In the PSNFSS font interface,
several packages have been replaced by others, that might not
be installed on every system. We have to take care for that
(see psnfss.pdf). We try to support all psnfss fonts as well
as the fonts that have become de facto standard in the LaTeX
world (e.g. Latin Modern). We do not support obsolete fonts
(like PSLatex). In general, it should be possible to mix any
rm font with any sf or tt font, respectively. (JSpitzm)
TODO:
-- separate math fonts.
*/
// TODO: separate math fonts.
if (rm == "default" && sf == "default" && tt == "default")
//nothing to do
@ -2860,67 +2850,16 @@ string const BufferParams::loadFonts(string const & rm,
// Tex Fonts
bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1");
bool const dryrun = features.runparams().dryrun;
bool const complete = (sf == "default" && tt == "default");
// ROMAN FONTS
LaTeXFont roman = theLaTeXFonts().getLaTeXFont(from_ascii(rm));
if (roman.switchdefault()) {
if (roman.available(ot1) || dryrun)
os << "\\renewcommand{\\rmdefault}{" << to_ascii(roman.name()) << "}\n";
else
frontend::Alert::warning(_("Font not available"),
bformat(_("The LaTeX package `%1$s' needed for the font `%2$s'\n"
"is not available on your system. LyX will fall back to the default font."),
roman.requires(), roman.guiname()), true);
} else {
bool const complete = (sf == "default" && tt == "default");
string const package =
roman.getAvailablePackage(dryrun, ot1, complete);
string const packageopts = roman.getPackageOptions(ot1, sc, osf);
if (packageopts.empty() && !package.empty())
os << "\\usepackage{" << package << "}\n";
else if (!packageopts.empty() && !package.empty())
os << "\\usepackage[" << packageopts << "]{" << package << "}\n";
}
if (osf && roman.providesOSF(ot1) && !roman.osfpackage().empty())
os << "\\usepackage{" << to_ascii(roman.osfpackage()) << "}\n";
os << theLaTeXFonts().getLaTeXFont(from_ascii(rm)).getLaTeXCode(dryrun, ot1, complete, sc, osf);
// SANS SERIF
LaTeXFont sans = theLaTeXFonts().getLaTeXFont(from_ascii(sf));
if (sans.switchdefault()) {
if (sans.available(ot1) || dryrun)
os << "\\renewcommand{\\sfdefault}{" << to_ascii(sans.name()) << "}\n";
else
frontend::Alert::warning(_("Font not available"),
bformat(_("The LaTeX package `%1$s' needed for the font `%2$s'\n"
"is not available on your system. LyX will fall back to the default font."),
sans.requires(), sans.guiname()), true);
} else {
string const package = sans.getAvailablePackage(dryrun, ot1);
string const packageopts = sans.getPackageOptions(ot1, sc, osf, sfscale);
if (packageopts.empty() && !package.empty())
os << "\\usepackage{" << package << "}\n";
else if (!packageopts.empty() && !package.empty())
os << "\\usepackage[" << packageopts << "]{" << package << "}\n";
}
os << theLaTeXFonts().getLaTeXFont(from_ascii(sf)).getLaTeXCode(dryrun, ot1, complete, sc, osf, sfscale);
// MONOSPACED/TYPEWRITER
LaTeXFont mono = theLaTeXFonts().getLaTeXFont(from_ascii(tt));
if (mono.switchdefault()) {
if (mono.available(ot1) || dryrun)
os << "\\renewcommand{\\ttdefault}{" << to_ascii(mono.name()) << "}\n";
else
frontend::Alert::warning(_("Font not available"),
bformat(_("The LaTeX package `%1$s' needed for the font `%2$s'\n"
"is not available on your system. LyX will fall back to the default font."),
mono.requires(), mono.guiname()), true);
} else {
string const package = mono.getAvailablePackage(dryrun, ot1);
string const packageopts = mono.getPackageOptions(ot1, sc, osf, ttscale);
if (packageopts.empty() && !package.empty())
os << "\\usepackage{" << package << "}\n";
else if (!packageopts.empty() && !package.empty())
os << "\\usepackage[" << packageopts << "]{" << package << "}\n";
}
os << theLaTeXFonts().getLaTeXFont(from_ascii(tt)).getLaTeXCode(dryrun, ot1, complete, sc, osf, ttscale);
return os.str();
}

View File

@ -92,7 +92,7 @@ string const LaTeXFont::getAvailablePackage(bool dryrun, bool ot1, bool complete
ot1package_, guiname_), true);
return string();
}
if (complete && !completepackage_.empty()) {
if (family_ == "rm" && complete && !completepackage_.empty()) {
if (LaTeXFeatures::isAvailable(to_ascii(completepackage_)) || dryrun)
return to_ascii(completepackage_);
}
@ -120,8 +120,7 @@ string const LaTeXFont::getAvailablePackage(bool dryrun, bool ot1, bool complete
}
string const LaTeXFont::getPackageOptions(bool const & ot1, bool const & sc,
bool const & osf, int const & scale)
string const LaTeXFont::getPackageOptions(bool ot1, bool sc, bool osf, int scale)
{
if (ot1 && !ot1package_.empty())
return string();
@ -146,6 +145,40 @@ string const LaTeXFont::getPackageOptions(bool const & ot1, bool const & sc,
}
string const LaTeXFont::getLaTeXCode(bool dryrun, bool ot1, bool complete, bool sc,
bool osf, int const & scale)
{
ostringstream os;
if (switchdefault_) {
if (family_.empty()) {
LYXERR0("Error: Font `" << name_ << "' has no family defined!");
return string();
}
if (available(ot1) || dryrun)
os << "\\renewcommand{\\" << to_ascii(family_) << "default}{"
<< to_ascii(name_) << "}\n";
else
frontend::Alert::warning(_("Font not available"),
bformat(_("The LaTeX package `%1$s' needed for the font `%2$s'\n"
"is not available on your system. LyX will fall back to the default font."),
requires_, guiname_), true);
} else {
string const package =
getAvailablePackage(dryrun, ot1, complete);
string const packageopts = getPackageOptions(ot1, sc, osf, scale);
if (packageopts.empty() && !package.empty())
os << "\\usepackage{" << package << "}\n";
else if (!packageopts.empty() && !package.empty())
os << "\\usepackage[" << packageopts << "]{" << package << "}\n";
}
if (osf && providesOSF(ot1) && !osfpackage_.empty())
os << "\\usepackage{" << to_ascii(osfpackage_) << "}\n";
return os.str();
}
bool LaTeXFont::readFont(Lexer & lex)
{
enum LaTeXFontTags {

View File

@ -63,20 +63,24 @@ public:
bool providesSC(bool ot1 = false) const;
/// Does this font provide scaling?
bool providesScale(bool ot1 = false) const;
/// Return the preferred available package
std::string const getAvailablePackage(bool dryrun = false,
bool ot1 = false,
bool complete = false);
/// Return the package options
std::string const getPackageOptions(bool const & ot1,
bool const & sc,
bool const & osf,
int const & scale = 100);
/// Return the LaTeX Code
std::string const getLaTeXCode(bool dryrun, bool ot1, bool complete,
bool sc, bool osf,
int const & scale = 100);
///
bool read(Lexer & lex);
///
bool readFont(Lexer & lex);
private:
/// Return the preferred available package
std::string const getAvailablePackage(bool dryrun,
bool ot1,
bool complete);
/// Return the package options
std::string const getPackageOptions(bool ot1,
bool sc,
bool osf,
int scale);
///
docstring name_;
///