]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeXFeatures.cpp
tex2lyx: chapterbib support
[lyx.git] / src / LaTeXFeatures.cpp
index 08e1470561e7cd97ffde86067286a4a65ba9bb99..850af10169d5c09034eda8bc419f9c430af1edd2 100644 (file)
@@ -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[<n>] 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).
 
@@ -123,19 +132,19 @@ static docstring const textquotedbl_def = from_ascii(
 
 static docstring const textquotedblp_xetex_def = from_ascii(
        "\\providecommand\\textquotedblplain{%\n"
-       "  \\bgroup\\addfontfeatures{Mapping=}\\textquotedbl\\egroup}");
+       "  \\bgroup\\addfontfeatures{Mapping=}\\char34\\egroup}");
 
 static docstring const textquotedblp_luatex_def = from_ascii(
        "\\providecommand\\textquotedblplain{%\n"
-       "  \\bgroup\\addfontfeatures{RawFeature=-tlig}\\textquotedbl\\egroup}");
+       "  \\bgroup\\addfontfeatures{RawFeature=-tlig}\\char34\\egroup}");
 
 static docstring const textquotesinglep_xetex_def = from_ascii(
        "\\providecommand\\textquotesingleplain{%\n"
-       "  \\bgroup\\addfontfeatures{Mapping=}\\textquotesingle\\egroup}");
+       "  \\bgroup\\addfontfeatures{Mapping=}\\char39\\egroup}");
 
 static docstring const textquotesinglep_luatex_def = from_ascii(
        "\\providecommand\\textquotesingleplain{%\n"
-       "  \\bgroup\\addfontfeatures{RawFeature=-tlig}\\textquotesingle\\egroup}");
+       "  \\bgroup\\addfontfeatures{RawFeature=-tlig}\\char39\\egroup}");
 
 static docstring const paragraphleftindent_def = from_ascii(
        "\\newenvironment{LyXParagraphLeftIndent}[1]%\n"
@@ -410,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");
+
 
 /////////////////////////////////////////////////////////////////////
 //
@@ -591,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");
@@ -660,7 +682,7 @@ TexString getSnippets(std::list<TexString> const & list)
        return snip.release();
 }
 
-} //anon namespace
+} // namespace
 
 
 void LaTeXFeatures::addPreambleSnippet(TexString ts, bool allow_dupes)
@@ -952,6 +974,8 @@ char const * simplefeatures[] = {
        "todonotes",
        "forest",
        "varwidth",
+       "footnote",
+       "tablefootnote",
 };
 
 char const * bibliofeatures[] = {
@@ -963,6 +987,7 @@ char const * bibliofeatures[] = {
        "authordate1-4",
        "babelbib",
        "bibgerm",
+       "chapterbib",
        "chicago",
        "chscite",
        "harvard",
@@ -974,7 +999,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
@@ -1088,7 +1113,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";
@@ -1206,7 +1232,11 @@ string const LaTeXFeatures::getPackages() const
        // Some classes load natbib themselves, but still allow (or even require)
        // plain numeric citations (ReVTeX is such a case, see bug 5182).
        // This special case is indicated by the "natbib-internal" key.
-       if (mustProvide("natbib") && !isProvided("natbib-internal")) {
+       if (mustProvide("natbib")
+           && !isProvided("natbib-internal")
+           && !isProvided("biblatex")
+           && !isProvided("biblatex-natbib")
+           && !isProvided("jurabib")) {
                packages << "\\usepackage[";
                if (params_.citeEngineType() == ENGINE_TYPE_NUMERICAL)
                        packages << "numbers";
@@ -1225,7 +1255,11 @@ string const LaTeXFeatures::getPackages() const
        }
 
        // jurabib -- we need version 0.6 at least.
-       if (mustProvide("jurabib")) {
+       if (mustProvide("jurabib")
+           && !isProvided("natbib-internal")
+           && !isProvided("natbib")
+           && !isProvided("biblatex")
+           && !isProvided("biblatex-natbib")) {
                packages << "\\usepackage";
                if (!params_.biblio_opts.empty())
                        packages << '[' << params_.biblio_opts << ']';
@@ -1292,6 +1326,9 @@ TexString LaTeXFeatures::getMacros() const
                macros << getPreambleSnippets();
        }
 
+       if (mustProvide("xetexdashbreakstate"))
+               macros << "\\XeTeXdashbreakstate 0" << '\n';
+
        if (mustProvide("papersize")) {
                if (runparams_.flavor == OutputParams::LATEX
                    || runparams_.flavor == OutputParams::DVILUATEX)
@@ -1315,16 +1352,19 @@ 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")
+               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';
        }
@@ -1477,6 +1517,9 @@ TexString LaTeXFeatures::getMacros() const
        if (mustProvide("rtloutputdblcol"))
                macros << rtloutputdblcol_def;
 
+       if (mustProvide("lyxmintcaption"))
+               macros << lyxmintcaption_def;
+
        return macros.release();
 }
 
@@ -1567,7 +1610,10 @@ docstring const LaTeXFeatures::getTClassPreamble() const
        list<docstring>::const_iterator cit = usedLayouts_.begin();
        list<docstring>::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();
@@ -1737,10 +1783,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
@@ -1822,8 +1869,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(),