: pimpl_(new Impl)
{
setBaseClass(defaultBaseclass());
- cite_engine_.push_back("basic");
+ cite_engine_ = "basic";
cite_engine_type_ = ENGINE_TYPE_DEFAULT;
makeDocumentClass();
paragraph_separation = ParagraphIndentSeparation;
papersize = PAPER_DEFAULT;
orientation = ORIENTATION_PORTRAIT;
use_geometry = false;
- biblio_style = "plain";
+ biblio_style = string();
use_bibtopic = false;
multibib = string();
use_indices = false;
secnumdepth = 3;
tocdepth = 3;
language = default_language;
- fontenc = "global";
+ fontenc = "auto";
fonts_roman[0] = "default";
fonts_roman[1] = "default";
fonts_sans[0] = "default";
use_package(package, packagetranslator().find(use));
} else if (token == "\\cite_engine") {
lex.eatLine();
- vector<string> engine = getVectorFromString(lex.getString());
- setCiteEngine(engine);
+ cite_engine_ = lex.getString();
} else if (token == "\\cite_engine_type") {
string engine_type;
lex >> engine_type;
spacing().set(spacetranslator().find(nspacing), tmp_val);
} else if (token == "\\float_placement") {
lex >> float_placement;
+ } else if (token == "\\float_alignment") {
+ lex >> float_alignment;
} else if (prefixIs(token, "\\pdf_") || token == "\\use_hyperref") {
string toktmp = pdfoptions().readToken(lex, token);
os << "\\bibtex_command " << bibtex_command << '\n';
os << "\\index_command " << index_command << '\n';
- if (!float_placement.empty()) {
+ if (!float_placement.empty())
os << "\\float_placement " << float_placement << '\n';
- }
+ if (!float_alignment.empty())
+ os << "\\float_alignment " << float_alignment << '\n';
os << "\\paperfontsize " << fontsize << '\n';
spacing().writeFile(os);
os << "\n\\cite_engine ";
- if (!cite_engine_.empty()) {
- LayoutModuleList::const_iterator be = cite_engine_.begin();
- LayoutModuleList::const_iterator en = cite_engine_.end();
- for (LayoutModuleList::const_iterator it = be; it != en; ++it) {
- if (it != be)
- os << ',';
- os << *it;
- }
- } else {
+ if (!cite_engine_.empty())
+ os << cite_engine_;
+ else
os << "basic";
- }
os << "\n\\cite_engine_type " << theCiteEnginesList.getTypeAsString(cite_engine_type_);
bool const use_babel = features.useBabel() && !features.isProvided("babel");
bool const use_polyglossia = features.usePolyglossia();
bool const global = lyxrc.language_global_options;
- if (use_babel || (use_polyglossia && global)) {
+ if (features.useBabel() || (use_polyglossia && global)) {
language_options << features.getBabelLanguages();
if (!language->babel().empty()) {
if (!language_options.str().empty())
os << "\\usepackage{unicode-math}\n";
}
+ // load CJK support package before font selection
+ // (see autotests/export/latex/CJK/micro-sign_utf8-cjk-libertine.lyx)
+ if (!useNonTeXFonts && encoding().package() != Encoding::none
+ && (encoding().package() == Encoding::CJK || features.mustProvide("CJK"))) {
+ if (encoding().iconvName() == "UTF-8"
+ && LaTeXFeatures::isAvailable("CJKutf8"))
+ os << "\\usepackage{CJKutf8}\n";
+ else
+ os << "\\usepackage[encapsulated]{CJK}\n";
+ }
+
// font selection must be done before loading fontenc.sty
string const fonts = loadFonts(features);
if (!fonts.empty())
OutputParams tmp_params = features.runparams();
pdfoptions().writeLaTeX(tmp_params, os,
features.isProvided("hyperref"));
- // correctly break URLs with hyperref and dvi output
- if (features.runparams().flavor == OutputParams::LATEX
+ // correctly break URLs with hyperref and dvi/ps output
+ if (features.runparams().hyperref_driver == "dvips"
&& features.isAvailable("breakurl"))
os << "\\usepackage{breakurl}\n";
} else if (features.isRequired("nameref"))
<< "\\makeatother\n\n";
// We try to load babel late, in case it interferes with other packages.
- // Jurabib, hyperref, varioref, bicaption and listings (bug 8995) have to be
- // called after babel, though.
+ // Jurabib, hyperref, varioref, bicaption, menukeys and listings (bug 8995)
+ // have to be called after babel, though.
if (use_babel && !features.isRequired("jurabib")
&& !features.isRequired("hyperref")
&& !features.isRequired("varioref")
if (!listings_params.empty()
|| features.mustProvide("listings")
|| features.mustProvide("minted")) {
- if (features.mustProvide("listings"))
- os << "\\usepackage{listings}\n";
- else
+ if (use_minted)
os << "\\usepackage{minted}\n";
- }
- if (!listings_params.empty()) {
- if (features.mustProvide("listings"))
- os << "\\lstset{";
else
+ os << "\\usepackage{listings}\n";
+ }
+ string lst_params = listings_params;
+ // If minted, do not output the language option (bug 11203)
+ if (use_minted && contains(lst_params, "language=")) {
+ vector<string> opts =
+ getVectorFromString(lst_params, ",", false);
+ for (size_t i = 0; i < opts.size(); ++i) {
+ if (prefixIs(opts[i], "language="))
+ opts.erase(opts.begin() + i--);
+ }
+ lst_params = getStringFromVector(opts, ",");
+ }
+ if (!lst_params.empty()) {
+ if (use_minted)
os << "\\setminted{";
+ else
+ os << "\\lstset{";
// do not test validity because listings_params is
// supposed to be valid
string par =
- InsetListingsParams(listings_params).separatedParams(true);
+ InsetListingsParams(lst_params).separatedParams(true);
os << from_utf8(par);
os << "}\n";
}
os << "\\usepackage{xunicode}\n";
}
+ // covington must be loaded after beamerarticle
+ if (features.isRequired("covington"))
+ os << "\\usepackage{covington}\n";
+
// Polyglossia must be loaded last ...
if (use_polyglossia) {
// call the package
}
// ... but before biblatex (see #7065)
- if (features.mustProvide("biblatex")) {
+ if (features.mustProvide("biblatex")
+ && !features.isProvided("biblatex-natbib")
+ && !features.isProvided("natbib-internal")
+ && !features.isProvided("natbib")
+ && !features.isProvided("jurabib")) {
string delim = "";
string opts;
os << "\\usepackage";
opts += delim + "backend=bibtex";
delim = ",";
}
+ if (!bib_encoding.empty() && encodings.fromLyXName(bib_encoding)) {
+ opts += delim + "bibencoding="
+ + encodings.fromLyXName(bib_encoding)->latexName();
+ delim = ",";
+ }
if (!biblio_opts.empty())
opts += delim + biblio_opts;
if (!opts.empty())
os << '\n';
}
+ // Since menukeys uses catoptions, which does some heavy changes on key-value options,
+ // it is recommended to load menukeys as the last package (even after hyperref)
+ if (features.isRequired("menukeys"))
+ os << "\\usepackage{menukeys}\n";
+
docstring const i18npreamble =
features.getTClassI18nPreamble(use_babel, use_polyglossia,
use_minted);
}
-bool BufferParams::setBaseClass(string const & classname)
+bool BufferParams::setBaseClass(string const & classname, string const & path)
{
LYXERR(Debug::TCLASS, "setBaseClass: " << classname);
LayoutFileList & bcl = LayoutFileList::get();
bcl.addEmptyClass(classname);
}
- bool const success = bcl[classname].load();
+ bool const success = bcl[classname].load(path);
if (!success) {
docstring s =
bformat(_("Due to some error in it, the layout file:\n"
invalidateConverterCache();
LayoutModuleList mods;
- LayoutModuleList ces;
LayoutModuleList::iterator it = layout_modules_.begin();
LayoutModuleList::iterator en = layout_modules_.end();
for (; it != en; ++it)
mods.push_back(*it);
- it = cite_engine_.begin();
- en = cite_engine_.end();
- for (; it != en; ++it)
- ces.push_back(*it);
-
- doc_class_ = getDocumentClass(*baseClass(), mods, ces, clone);
+ doc_class_ = getDocumentClass(*baseClass(), mods, cite_engine_, clone);
TextClass::ReturnValues success = TextClass::OK;
if (!forced_local_layout_.empty())
}
-bool BufferParams::citationModuleCanBeAdded(string const & modName) const
-{
- return cite_engine_.moduleCanBeAdded(modName, baseClass());
-}
-
-
docstring BufferParams::getLocalLayout(bool forced) const
{
if (forced)
string const BufferParams::main_font_encoding() const
{
- return font_encodings().empty() ? "default" : font_encodings().back();
+ if (font_encodings().empty()) {
+ if (ascii_lowercase(language->fontenc(*this)) == "none")
+ return "none";
+ return "default";
+ }
+ return font_encodings().back();
}
vector<string> const BufferParams::font_encodings() const
{
- string doc_fontenc = (fontenc == "global") ? lyxrc.fontenc : fontenc;
+ string doc_fontenc = (fontenc == "auto") ? string() : fontenc;
vector<string> fontencs;
// "default" means "no explicit font encoding"
if (doc_fontenc != "default") {
- fontencs = getVectorFromString(doc_fontenc);
- if (!language->fontenc().empty()
- && ascii_lowercase(language->fontenc()) != "none") {
- vector<string> fencs = getVectorFromString(language->fontenc());
- vector<string>::const_iterator fit = fencs.begin();
- for (; fit != fencs.end(); ++fit) {
- if (find(fontencs.begin(), fontencs.end(), *fit) == fontencs.end())
- fontencs.push_back(*fit);
+ if (!doc_fontenc.empty())
+ // If we have a custom setting, we use only that!
+ return getVectorFromString(doc_fontenc);
+ if (!language->fontenc(*this).empty()
+ && ascii_lowercase(language->fontenc(*this)) != "none") {
+ vector<string> fencs = getVectorFromString(language->fontenc(*this));
+ for (auto & fe : fencs) {
+ if (find(fontencs.begin(), fontencs.end(), fe) == fontencs.end())
+ fontencs.push_back(fe);
}
}
}
else
os << "]{inputenc}\n";
}
- if (package == Encoding::CJK || features.mustProvide("CJK")) {
- if (language->encoding()->name() == "utf8-cjk"
- && LaTeXFeatures::isAvailable("CJKutf8"))
- os << "\\usepackage{CJKutf8}\n";
- else
- os << "\\usepackage{CJK}\n";
- }
} else if (inputenc != "default") {
switch (encoding().package()) {
case Encoding::none:
+ case Encoding::CJK:
case Encoding::japanese:
break;
case Encoding::inputenc:
else
os << "]{inputenc}\n";
break;
- case Encoding::CJK:
- if (encoding().name() == "utf8-cjk"
- && LaTeXFeatures::isAvailable("CJKutf8"))
- os << "\\usepackage{CJKutf8}\n";
- else
- os << "\\usepackage{CJK}\n";
- break;
- }
- // Load the CJK package if needed by a secondary language.
- // If the main encoding is some variant of UTF8, use CJKutf8.
- if (encoding().package() != Encoding::CJK && features.mustProvide("CJK")) {
- if (encoding().iconvName() == "UTF-8"
- && LaTeXFeatures::isAvailable("CJKutf8"))
- os << "\\usepackage{CJKutf8}\n";
- else
- os << "\\usepackage{CJK}\n";
}
}
}
}
-bool BufferParams::addCiteEngine(string const & engine)
-{
- LayoutModuleList::const_iterator it = cite_engine_.begin();
- LayoutModuleList::const_iterator en = cite_engine_.end();
- for (; it != en; ++it)
- if (*it == engine)
- return false;
- cite_engine_.push_back(engine);
- return true;
-}
-
-
-bool BufferParams::addCiteEngine(vector<string> const & engine)
-{
- vector<string>::const_iterator it = engine.begin();
- vector<string>::const_iterator en = engine.end();
- bool ret = true;
- for (; it != en; ++it)
- if (!addCiteEngine(*it))
- ret = false;
- return ret;
-}
-
-
string const & BufferParams::defaultBiblioStyle() const
{
+ if (!biblio_style.empty())
+ return biblio_style;
+
map<string, string> const & bs = documentClass().defaultBiblioStyle();
auto cit = bs.find(theCiteEnginesList.getTypeAsString(citeEngineType()));
if (cit != bs.end())
}
-void BufferParams::setCiteEngine(string const & engine)
-{
- clearCiteEngine();
- addCiteEngine(engine);
-}
-
-
-void BufferParams::setCiteEngine(vector<string> const & engine)
-{
- clearCiteEngine();
- addCiteEngine(engine);
-}
-
-
vector<string> BufferParams::citeCommands() const
{
static CitationStyle const default_style;
bool BufferParams::useBiblatex() const
{
- return theCiteEnginesList[citeEngine().list().front()]
- ->getCiteFramework() == "biblatex";
+ return theCiteEnginesList[citeEngine()]->getCiteFramework() == "biblatex";
}
pimpl_->isViewCacheValid = false;
}
+
+// We shouldn't need to reset the params here, since anything
+// we need will be recopied.
+void BufferParams::copyForAdvFR(const BufferParams & bp)
+{
+ string const & lang = bp.language->lang();
+ setLanguage(lang);
+ layout_modules_ = bp.layout_modules_;
+ string const & doc_class = bp.documentClass().name();
+ setBaseClass(doc_class);
+}
+
} // namespace lyx