X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=92e48293cd28d15d4bf872f5dabef6cb60e5476f;hb=402d41b82d6e0bd1d8ff72a29fd9d27f94a3d616;hp=78e31eb93d4bc683c098ae4f45cd508589c12ebf;hpb=07c82e9f840afbf9b1b391e4de2312284c6cfd4d;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 78e31eb93d..92e48293cd 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -79,6 +79,15 @@ static docstring const lyxarrow_def = from_ascii( "{\\leavevmode\\,$\\triangleleft$\\,\\allowbreak}\n" "{\\leavevmode\\,$\\triangleright$\\,\\allowbreak}}"); +// ZERO WIDTH SPACE (ZWSP) is actually not a space character +// but marks a line break opportunity. Several commands provide a +// line break opportunity. They differ in side-effects: +// \allowbreak prevents hyphenation after hyphen or dash + ZWSP +// \linebreak[] takes an optional argument denoting "urgency". +// The \LyXZeroWidthSpace wrapper allows customization in the preamble. +static docstring const lyxZWSP_def = from_ascii( + "\\newcommand*\\LyXZeroWidthSpace{\\hspace{0pt}}"); + // for quotes without babel. This does not give perfect results, but // anybody serious about non-english quotes should use babel (JMarc). @@ -118,6 +127,25 @@ static docstring const guilsinglright_def = from_ascii( " {\\usefont{U}{lasy}{m}{n}\\char'51}%\n" "}"); +static docstring const textquotedbl_def = from_ascii( + "\\DeclareTextSymbolDefault{\\textquotedbl}{T1}"); + +static docstring const textquotedblp_xetex_def = from_ascii( + "\\providecommand\\textquotedblplain{%\n" + " \\bgroup\\addfontfeatures{Mapping=}\\char34\\egroup}"); + +static docstring const textquotedblp_luatex_def = from_ascii( + "\\providecommand\\textquotedblplain{%\n" + " \\bgroup\\addfontfeatures{RawFeature=-tlig}\\char34\\egroup}"); + +static docstring const textquotesinglep_xetex_def = from_ascii( + "\\providecommand\\textquotesingleplain{%\n" + " \\bgroup\\addfontfeatures{Mapping=}\\char39\\egroup}"); + +static docstring const textquotesinglep_luatex_def = from_ascii( + "\\providecommand\\textquotesingleplain{%\n" + " \\bgroup\\addfontfeatures{RawFeature=-tlig}\\char39\\egroup}"); + static docstring const paragraphleftindent_def = from_ascii( "\\newenvironment{LyXParagraphLeftIndent}[1]%\n" "{\n" @@ -327,6 +355,23 @@ static docstring const textbaltic_def = from_ascii( "\\DeclareTextCompositeCommand{\\c}{T1}{r}{\\textcommabelow{r}}\n" "\\DeclareTextCompositeCommand{\\c}{T1}{R}{\\textcommabelow{R}}\n"); +// split-level fractions +static docstring const xfrac_def = from_ascii( + "\\usepackage{xfrac}\n"); +static docstring const smallLetterFrac_def = from_ascii( + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{default}{text}\n" + " {phantom=c, scale-factor=1.0, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{lmr}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{lmss}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{cmr}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{cmss}{text}\n" + " {slash-symbol-font=ptm, phantom=c, scale-factor=1, slash-left-kern=-.05em}\n" + "\\newcommand{\\smallLetterFrac}[2]{%\n" + " {\\UseCollection{xfrac}{smallLetterFrac}\\sfrac{#1}{#2}}}\n"); + static docstring const lyxref_def = from_ascii( "\\RS@ifundefined{subsecref}\n" " {\\newref{subsec}{name = \\RSsectxt}}\n" @@ -374,6 +419,19 @@ static docstring const rtloutputdblcol_def = from_ascii( "}\n" "\\@mparswitchtrue\n"); +static docstring const lyxmintcaption_def = from_ascii( + "\\long\\def\\lyxmintcaption[#1]#2{%\n" + " \\ifx#1t\\vskip\\baselineskip\\fi%\n" + " \\refstepcounter{listing}\\noindent%\n" + " \\addcontentsline{lol}{listing}%\n" + " {\\protect\\numberline{\\thelisting}{\\ignorespaces #2}}%\n" + " \\setbox\\@tempboxa\\hbox{\\listingscaption~\\thelisting: #2}%\n" + " \\ifdim \\wd\\@tempboxa >\\linewidth%\n" + " \\parbox[t]{\\linewidth}{\\unhbox\\@tempboxa}\\else%\n" + " \\hbox to\\linewidth{\\hfil\\box\\@tempboxa\\hfil}\\fi%\n" + " \\ifx#1b\\vskip\\baselineskip\\fi\n" + "}\n"); + ///////////////////////////////////////////////////////////////////// // @@ -555,8 +613,8 @@ bool LaTeXFeatures::isProvided(string const & name) const if (params_.useNonTeXFonts) return params_.documentClass().provides(name); - bool const ot1 = (params_.font_encoding() == "default" - || params_.font_encoding() == "OT1"); + bool const ot1 = (params_.main_font_encoding() == "default" + || params_.main_font_encoding() == "OT1"); bool const complete = (params_.fontsSans() == "default" && params_.fontsTypewriter() == "default"); bool const nomath = (params_.fontsMath() == "default"); @@ -624,7 +682,7 @@ TexString getSnippets(std::list const & list) return snip.release(); } -} //anon namespace +} // namespace void LaTeXFeatures::addPreambleSnippet(TexString ts, bool allow_dupes) @@ -793,15 +851,16 @@ string LaTeXFeatures::getBabelLanguages() const } -std::map LaTeXFeatures::getPolyglossiaLanguages() const +set LaTeXFeatures::getPolyglossiaLanguages() const { - std::map languages; + set languages; LanguageList::const_iterator const begin = UsedLanguages_.begin(); for (LanguageList::const_iterator cit = begin; cit != UsedLanguages_.end(); ++cit) { - languages[(*cit)->polyglossia()] = (*cit)->polyglossiaOpts(); + // We do not need the variants here + languages.insert((*cit)->polyglossia()); } return languages; } @@ -828,10 +887,11 @@ void LaTeXFeatures::getFontEncodings(vector & encodings) const { // these must be loaded if glyphs of this script are used // unless a language providing them is used in the document - // FIXME: currently the option is written twice in this case - if (mustProvide("textgreek")) + if (mustProvide("textgreek") + && find(encodings.begin(), encodings.end(), "LGR") == encodings.end()) encodings.insert(encodings.begin(), "LGR"); - if (mustProvide("textcyr")) + if (mustProvide("textcyr") + && find(encodings.begin(), encodings.end(), "T2A") == encodings.end()) encodings.insert(encodings.begin(), "T2A"); LanguageList::const_iterator it = UsedLanguages_.begin(); @@ -913,7 +973,7 @@ char const * simplefeatures[] = { "fixme", "todonotes", "forest", - "varwidth" + "varwidth", }; char const * bibliofeatures[] = { @@ -925,6 +985,7 @@ char const * bibliofeatures[] = { "authordate1-4", "babelbib", "bibgerm", + "chapterbib", "chicago", "chscite", "harvard", @@ -936,7 +997,7 @@ int const nb_bibliofeatures = sizeof(bibliofeatures) / sizeof(char const *); int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); -} +} // namespace string const LaTeXFeatures::getColorOptions() const @@ -1050,7 +1111,8 @@ string const LaTeXFeatures::getPackages() const // if fontspec or newtxmath is used, AMS packages have to be loaded // before fontspec (in BufferParams) string const amsPackages = loadAMSPackages(); - bool const ot1 = (params_.font_encoding() == "default" || params_.font_encoding() == "OT1"); + bool const ot1 = (params_.main_font_encoding() == "default" + || params_.main_font_encoding() == "OT1"); bool const use_newtxmath = theLaTeXFonts().getLaTeXFont(from_ascii(params_.fontsMath())).getUsedPackage( ot1, false, false) == "newtxmath"; @@ -1174,6 +1236,8 @@ string const LaTeXFeatures::getPackages() const packages << "numbers"; else packages << "authoryear"; + if (!params_.biblio_opts.empty()) + packages << ',' << params_.biblio_opts; packages << "]{natbib}\n"; } @@ -1185,8 +1249,12 @@ string const LaTeXFeatures::getPackages() const } // jurabib -- we need version 0.6 at least. - if (mustProvide("jurabib")) - packages << "\\usepackage{jurabib}[2004/01/25]\n"; + if (mustProvide("jurabib")) { + packages << "\\usepackage"; + if (!params_.biblio_opts.empty()) + packages << '[' << params_.biblio_opts << ']'; + packages << "{jurabib}[2004/01/25]\n"; + } // opcit -- we pass custombst as we output \bibliographystyle ourselves if (mustProvide("opcit")) { @@ -1271,21 +1339,24 @@ TexString LaTeXFeatures::getMacros() const if (mustProvide("lyxarrow")) macros << lyxarrow_def << '\n'; + if (mustProvide("lyxzerowidthspace")) + macros << lyxZWSP_def << '\n'; + if (!usePolyglossia() && mustProvide("textgreek")) { - // ensure LGR font encoding is defined also if fontenc is not loaded by LyX - if (params_.font_encoding() == "default") + // ensure LGR font encoding is defined also if fontenc is not loaded by LyX + if (params_.main_font_encoding() == "default") macros << textgreek_LGR_def; macros << textgreek_def << '\n'; } if (!usePolyglossia() && mustProvide("textcyr")) { // ensure T2A font encoding is set up also if fontenc is not loaded by LyX - if (params_.font_encoding() == "default") + if (params_.main_font_encoding() == "default") macros << textcyr_T2A_def; macros << textcyr_def << '\n'; } - // non-standard text accents: + // non-standard text accents: if (mustProvide("textcommaabove") || mustProvide("textcommaaboveright") || mustProvide("textcommabelow") || mustProvide("textbaltic")) macros << lyxaccent_def; @@ -1302,6 +1373,13 @@ TexString LaTeXFeatures::getMacros() const if (mustProvide("textbaltic")) macros << textbaltic_def << '\n'; + // split-level fractions + if (mustProvide("xfrac") || mustProvide("smallLetterFrac")) + macros << xfrac_def << '\n'; + + if (mustProvide("smallLetterFrac")) + macros << smallLetterFrac_def << '\n'; + if (mustProvide("lyxmathsym")) macros << lyxmathsym_def << '\n'; @@ -1348,6 +1426,20 @@ TexString LaTeXFeatures::getMacros() const macros << guillemotleft_def << '\n'; if (mustProvide("guillemotright")) macros << guillemotright_def << '\n'; + if (mustProvide("textquotedbl")) + macros << textquotedbl_def << '\n'; + if (mustProvide("textquotesinglep")) { + if (runparams_.flavor == OutputParams::XETEX) + macros << textquotesinglep_xetex_def << '\n'; + else + macros << textquotesinglep_luatex_def << '\n'; + } + if (mustProvide("textquotedblp")) { + if (runparams_.flavor == OutputParams::XETEX) + macros << textquotedblp_xetex_def << '\n'; + else + macros << textquotedblp_luatex_def << '\n'; + } // Math mode if (mustProvide("binom") && !isRequired("amsmath")) @@ -1412,6 +1504,9 @@ TexString LaTeXFeatures::getMacros() const if (mustProvide("rtloutputdblcol")) macros << rtloutputdblcol_def; + if (mustProvide("lyxmintcaption")) + macros << lyxmintcaption_def; + return macros.release(); } @@ -1502,7 +1597,10 @@ docstring const LaTeXFeatures::getTClassPreamble() const list::const_iterator cit = usedLayouts_.begin(); list::const_iterator end = usedLayouts_.end(); for (; cit != end; ++cit) - tcpreamble << tclass[*cit].preamble(); + // For InPreamble layouts, we output the preamble stuff earlier + // (before the layouts). See Paragraph::Private::validate. + if (!tclass[*cit].inpreamble) + tcpreamble << tclass[*cit].preamble(); cit = usedInsetLayouts_.begin(); end = usedInsetLayouts_.end(); @@ -1672,10 +1770,11 @@ docstring const i18npreamble(docstring const & templ, Language const * lang, return from_utf8(preamble); } -} +} // namespace -docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel, bool use_polyglossia) const +docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel, + bool use_polyglossia, bool use_minted) const { DocumentClass const & tclass = params_.documentClass(); // collect preamble snippets in a set to prevent multiple identical @@ -1757,8 +1856,9 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel, bool use_po // need to force a fixed width encoding for // \lstlistlistingname and \lstlistingname (bug 9382). // This needs to be consistent with InsetListings::latex(). - bool const need_fixedwidth = !runparams_.isFullUnicode() && - it->second.fixedwidthpreambleencoding(); + bool const need_fixedwidth = !use_minted && + !runparams_.isFullUnicode() && + it->second.fixedwidthpreambleencoding(); // language dependent commands (once per document) snippets.insert(i18npreamble(it->second.langpreamble(), buffer().language(),