]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeXFeatures.cpp
Fix functions that used functions but did not defined it
[lyx.git] / src / LaTeXFeatures.cpp
index 95a1a6dfc4b4a561abd7035d33d68ddac1b3f3be..74941459e60faca3b1fb943937d70f8438076e8c 100644 (file)
@@ -73,6 +73,11 @@ static docstring const lyxarrow_def = from_ascii(
        "{\\leavevmode\\,$\\triangleleft$\\,\\allowbreak}\n"
        "{\\leavevmode\\,$\\triangleright$\\,\\allowbreak}}");
 
+static docstring const aastex_case_def = from_ascii(
+               "\\providecommand\\case[2]{\\mbox{$\\frac{#1}{#2}$}}%");
+// Copied from https://github.com/AASJournals/AASTeX60/blob/master/cls/aastex63.cls#L1645
+// Adapted to providecommand for compatibility reasons.
+
 // 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:
@@ -188,44 +193,11 @@ static docstring const tabularnewline_def = from_ascii(
        "%% Because html converters don't know tabularnewline\n"
        "\\providecommand{\\tabularnewline}{\\\\}\n");
 
-static docstring const lyxgreyedout_def = from_ascii(
-       "%% The greyedout annotation environment\n"
-       "\\newenvironment{lyxgreyedout}\n"
-       "  {\\textcolor{note_fontcolor}\\bgroup\\ignorespaces}\n"
-       "  {\\ignorespacesafterend\\egroup}\n");
-
-static docstring const lyxgreyedout_rtl_def = from_ascii(
-       "%% The greyedout annotation environment (with RTL support)\n"
-       "\\NewEnviron{lyxgreyedout}{%\n"
-       "\\if@rl%\n"
-       "\\everypar{\\textcolor{note_fontcolor}\\beginL\\ignorespaces}%\n"
-       "\\BODY\\everypar{\\ignorespacesafterend\\endL}\n"
-       "\\else%\n"
-       "\\textcolor{note_fontcolor}\\bgroup\\ignorespaces%\n"
-       "\\BODY\\ignorespacesafterend\\egroup\n"
-       "\\fi}\n");
-
-static docstring const lyxgreyedout_luartl_def = from_ascii(
-       "%% The greyedout annotation environment (with RTL support)\n"
-       "\\NewEnviron{lyxgreyedout}{%\n"
-       "\\if@RTL%\n"
-       "\\everypar{\\color{note_fontcolor}\\pardir TRT \\textdir TRT\\ignorespaces}%\n"
-       "\\BODY\\everypar{\\ignorespacesafterend}\n"
-       "\\else%\n"
-       "\\textcolor{note_fontcolor}\\bgroup\\ignorespaces%\n"
-       "\\BODY\\ignorespacesafterend\\egroup\n"
-       "\\fi}\n");
-
-static docstring const lyxgreyedout_luartl_babel_def = from_ascii(
-       "%% The greyedout annotation environment (with RTL support)\n"
-       "\\NewEnviron{lyxgreyedout}{%\n"
-       "\\if@rl%\n"
-       "\\everypar{\\color{note_fontcolor}\\pardir TRT \\textdir TRT\\ignorespaces}%\n"
-       "\\BODY\\everypar{\\ignorespacesafterend}\n"
-       "\\else%\n"
-       "\\textcolor{note_fontcolor}\\bgroup\\ignorespaces%\n"
-       "\\BODY\\ignorespacesafterend\\egroup\n"
-       "\\fi}\n");
+static docstring const cellvarwidth_def = from_ascii(
+       "%% Variable width box for table cells\n"
+       "\\newenvironment{cellvarwidth}[1][t]\n"
+       "    {\\begin{varwidth}[#1]{\\linewidth}}\n"
+       "    {\\@finalstrut\\@arstrutbox\\end{varwidth}}\n");
 
 // We want to omit the file extension for includegraphics, but this does not
 // work when the filename contains other dots.
@@ -236,8 +208,8 @@ static docstring const lyxdot_def = from_ascii(
 
 static docstring const changetracking_xcolor_ulem_base_def = from_ascii(
        "%% Change tracking with ulem and xcolor: base macros\n"
-       "\\DeclareRobustCommand{\\mklyxadded}[1]{\\bgroup\\color{lyxadded}{}#1\\egroup}\n"
-       "\\DeclareRobustCommand{\\mklyxdeleted}[1]{\\bgroup\\color{lyxdeleted}\\mklyxsout{#1}\\egroup}\n"
+       "\\DeclareRobustCommand{\\mklyxadded}[1]{\\textcolor{lyxadded}\\bgroup#1\\egroup}\n"
+       "\\DeclareRobustCommand{\\mklyxdeleted}[1]{\\textcolor{lyxdeleted}\\bgroup\\mklyxsout{#1}\\egroup}\n"
        "\\DeclareRobustCommand{\\mklyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n");
 
 static docstring const changetracking_xcolor_ulem_def = from_ascii(
@@ -498,19 +470,12 @@ static docstring const textschwa_def = from_ascii(
 // split-level fractions
 static docstring const xfrac_def = from_ascii(
           "\\usepackage{xfrac}\n");
+
+// https://tex.stackexchange.com/questions/720579/do-i-need-to-replace-declarecollectioninstance-after-recent-package-change/
 static docstring const smallLetterFrac_def = from_ascii(
-       "\\DeclareCollectionInstance{smallLetterFrac}{xfrac}{default}{text}\n"
+       "\\EditTemplateDefaults{xfrac}{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");
+       "\\NewCommandCopy\\smallLetterFrac\\sfrac\n");
 
 static docstring const lyxref_def = from_ascii(
        "\\RS@ifundefined{subsecref}\n"
@@ -573,6 +538,23 @@ static docstring const lyxmintcaption_def = from_ascii(
        "}\n");
 
 
+docstring const lyxgreyedoutDef(bool const ct)
+{
+       odocstringstream ods;
+
+       ods << "%% The greyedout annotation environment\n"
+           << "\\newenvironment{lyxgreyedout}\n"
+           << "{";
+       if (ct)
+               ods << "\\colorlet{lyxadded}{lyxadded!30}\\colorlet{lyxdeleted}{lyxdeleted!30}%\n ";
+       ods << "\\normalfont\\normalsize\\textcolor{note_fontcolor}\\bgroup\\ignorespaces}\n"
+           << "{\\ignorespacesafterend\\egroup}\n";
+
+       return ods.str();
+}
+
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // LyXHTML strings
@@ -764,8 +746,8 @@ bool LaTeXFeatures::isProvided(string const & name) const
        if (params_.useNonTeXFonts)
                return params_.documentClass().provides(name);
 
-       bool const ot1 = (params_.main_font_encoding() == "default"
-               || params_.main_font_encoding() == "OT1");
+       bool const ot1 = (runparams().main_fontenc == "default"
+               || runparams().main_fontenc == "OT1");
        bool const complete = (params_.fontsSans() == "default"
                && params_.fontsTypewriter() == "default");
        bool const nomath = (params_.fontsMath() == "default");
@@ -808,6 +790,12 @@ bool LaTeXFeatures::isAvailable(string const & name)
 }
 
 
+bool LaTeXFeatures::isAvailableAtLeastFrom(string const & name, int const y, int const m, int const d)
+{
+       return LaTeXPackages::isAvailableAtLeastFrom(name, y, m, d);
+}
+
+
 namespace {
 
 void addSnippet(std::list<TexString> & list, TexString ts, bool allow_dupes)
@@ -818,7 +806,7 @@ void addSnippet(std::list<TexString> & list, TexString ts, bool allow_dupes)
                            return ts.str == ts2.str;
                    })
            )
-               list.push_back(move(ts));
+               list.push_back(std::move(ts));
 }
 
 
@@ -835,7 +823,7 @@ TexString getSnippets(std::list<TexString> const & list)
 
 void LaTeXFeatures::addPreambleSnippet(TexString snippet, bool allow_dupes)
 {
-       addSnippet(preamble_snippets_, move(snippet), allow_dupes);
+       addSnippet(preamble_snippets_, std::move(snippet), allow_dupes);
 }
 
 
@@ -1141,8 +1129,9 @@ char const * simplefeatures[] = {
        "xskak",
        "pict2e",
        "drs",
-       "environ",
-       "dsfont"
+       "dsfont",
+       "hepparticles",
+       "hepnames"
 };
 
 char const * bibliofeatures[] = {
@@ -1186,10 +1175,6 @@ string const LaTeXFeatures::getColorOptions() const
                                 << "]{" << package << "}\n";
        }
 
-       // pdfcolmk must be loaded after color
-       if (mustProvide("pdfcolmk"))
-               colors << "\\usepackage{pdfcolmk}\n";
-
        // the following 3 color commands must be set after color
        // is loaded and before pdfpages, therefore add the command
        // here define the set color
@@ -1247,11 +1232,36 @@ string const LaTeXFeatures::getPackages() const
        // also unknown packages can be requested. They are silently
        // swallowed now. We should change this eventually.
 
+       // Simple hooks to add things before or after a given "simple"
+       // feature. Useful if loading order matters.
+       map<string, string> before_simplefeature_;
+       map<string, string> after_simplefeature_;
+
+       // Babel languages with activated colon (such as French) break
+       // with prettyref. Work around that.
+       if (mustProvide("prettyref") && !runparams_.isFullUnicode()
+           && useBabel() && contains(getActiveChars(), ':')) {
+               before_simplefeature_["prettyref"] =
+                               "% Make prettyref compatible with babel active colon\n"
+                               "% (make ':' active in prettyref definitions)\n"
+                               "\\edef\\lyxsavedcolcatcode{\\the\\catcode`\\:}\n"
+                               "\\catcode`:=13\n";
+               after_simplefeature_["prettyref"] =
+                               "% restore original catcode for :\n"
+                               "\\catcode`\\:=\\lyxsavedcolcatcode\\relax\n";
+       }
+       
        //  These are all the 'simple' includes.  i.e
        //  packages which we just \usepackage{package}
+       //  potentially preceded and followed by the hook code
        for (char const * feature : simplefeatures) {
-               if (mustProvide(feature))
+               if (mustProvide(feature)) {
+                       if (before_simplefeature_.find(feature) != before_simplefeature_.end())
+                               packages << before_simplefeature_[feature];
                        packages << "\\usepackage{" << feature << "}\n";
+                       if (after_simplefeature_.find(feature) != after_simplefeature_.end())
+                               packages << after_simplefeature_[feature];
+               }
        }
 
        // The rest of these packages are somewhat more complicated
@@ -1296,8 +1306,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_.main_font_encoding() == "default"
-                         || params_.main_font_encoding() == "OT1");
+       bool const ot1 = (runparams().main_fontenc == "default"
+                         || runparams().main_fontenc == "OT1");
        bool const use_newtxmath =
                theLaTeXFonts().getLaTeXFont(from_ascii(params_.fontsMath())).getUsedPackage(
                        ot1, false, false) == "newtxmath";
@@ -1344,7 +1354,7 @@ string const LaTeXFeatures::getPackages() const
                params_.use_package("undertilde") != BufferParams::package_off)
                packages << "\\usepackage{undertilde}\n";
 
-       // [x]color and pdfcolmk are handled in getColorOptions() above
+       // [x]color is handled in getColorOptions() above
 
        // makeidx.sty
        if (isRequired("makeidx") || isRequired("splitidx")) {
@@ -1481,18 +1491,21 @@ string const LaTeXFeatures::getPackages() const
                            "\\usepackage{ulem}\n";
 
        if (mustProvide("nomencl")) {
+               packages << "\\usepackage{nomencl}\n";
                // Make it work with the new and old version of the package,
                // but don't use the compatibility option since it is
                // incompatible to other packages.
-               packages << "\\usepackage{nomencl}\n"
-                           "% the following is useful when we have the old nomencl.sty package\n"
-                           "\\providecommand{\\printnomenclature}{\\printglossary}\n"
-                           "\\providecommand{\\makenomenclature}{\\makeglossary}\n"
-                           "\\makenomenclature\n";
+               if (!LaTeXFeatures::isAvailableAtLeastFrom("nomencl", 2005, 3, 31)) {
+                       packages << "% Needed with nomencl < v4.1\n"
+                                   "\\providecommand{\\printnomenclature}{\\printglossary}\n"
+                                   "\\providecommand{\\makenomenclature}{\\makeglossary}\n";
+               }
+               packages << "\\makenomenclature\n";
        }
 
        // fixltx2e provides subscript
-       if (mustProvide("subscript") && !isRequired("fixltx2e"))
+       if (mustProvide("subscript") && !isRequired("fixltx2e")
+           && !isAvailableAtLeastFrom("LaTeX", 2005, 12))
                packages << "\\usepackage{subscript}\n";
 
        // footmisc must be loaded after setspace
@@ -1558,19 +1571,22 @@ TexString LaTeXFeatures::getMacros() const
        if (mustProvide("lyxarrow"))
                macros << lyxarrow_def << '\n';
 
+       if (mustProvide("aastex_case"))
+               macros << aastex_case_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_.main_font_encoding() == "default")
+               // ensure LGR font encoding is defined also if fontenc is not loaded by LyX
+               if (runparams().main_fontenc == "default")
                        macros << textgreek_LGR_def;
                macros << textgreek_def << '\n';
        }
 
        if (!usePolyglossia() && mustProvide("textcyrillic")) {
                // ensure T2A font encoding is set up also if fontenc is not loaded by LyX
-               if (params_.main_font_encoding() == "default")
+               if (runparams().main_fontenc == "default")
                        macros << textcyr_T2A_def;
                macros << textcyr_def << '\n';
        }
@@ -1679,22 +1695,15 @@ TexString LaTeXFeatures::getMacros() const
        if (mustProvide("NeedTabularnewline"))
                macros << tabularnewline_def;
 
+       if (mustProvide("cellvarwidth"))
+               macros << cellvarwidth_def;
+
        // greyed-out environment (note inset)
        // the color is specified in the routine
        // getColorOptions() to avoid LaTeX-package clashes
-       if (mustProvide("lyxgreyedout")) {
-               // We need different version for RTL (#8647)
-               if (hasRTLLanguage()) {
-                       if (runparams_.flavor == Flavor::LuaTeX)
-                               if (useBabel())
-                                       macros << lyxgreyedout_luartl_babel_def;
-                               else
-                                       macros << lyxgreyedout_luartl_def;
-                       else
-                               macros << lyxgreyedout_rtl_def;
-               } else
-                       macros << lyxgreyedout_def;
-       }
+       if (mustProvide("lyxgreyedout"))
+               // We need different version with change tracking (#12025)
+               macros << lyxgreyedoutDef(mustProvide("ct-xcolor-ulem"));
 
        if (mustProvide("lyxdot"))
                macros << lyxdot_def << '\n';
@@ -1709,11 +1718,11 @@ TexString LaTeXFeatures::getMacros() const
        if (mustProvide("ct-xcolor-ulem")) {
                streamsize const prec = macros.os().precision(2);
 
-               RGBColor cadd = rgbFromHexName(lcolor.getX11HexName(Color_addedtext));
+               RGBColor cadd = rgbFromHexName(lcolor.getX11HexName(Color_addedtext_output));
                macros << "\\providecolor{lyxadded}{rgb}{"
                       << cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n";
 
-               RGBColor cdel = rgbFromHexName(lcolor.getX11HexName(Color_deletedtext));
+               RGBColor cdel = rgbFromHexName(lcolor.getX11HexName(Color_deletedtext_output));
                macros << "\\providecolor{lyxdeleted}{rgb}{"
                       << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n";
 
@@ -1738,11 +1747,11 @@ TexString LaTeXFeatures::getMacros() const
                if (!mustProvide("ct-xcolor-ulem")) {
                        streamsize const prec = macros.os().precision(2);
 
-                       RGBColor cadd = rgbFromHexName(lcolor.getX11HexName(Color_addedtext));
+                       RGBColor cadd = rgbFromHexName(lcolor.getX11HexName(Color_addedtext_output));
                        macros << "\\providecolor{lyxadded}{rgb}{"
                               << cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n";
        
-                       RGBColor cdel = rgbFromHexName(lcolor.getX11HexName(Color_deletedtext));
+                       RGBColor cdel = rgbFromHexName(lcolor.getX11HexName(Color_deletedtext_output));
                        macros << "\\providecolor{lyxdeleted}{rgb}{"
                               << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n";
        
@@ -1907,16 +1916,12 @@ docstring const LaTeXFeatures::getTClassHTMLStyles() const
 
        tcpreamble << tclass.htmlstyles();
 
-       list<docstring>::const_iterator cit = usedLayouts_.begin();
-       list<docstring>::const_iterator end = usedLayouts_.end();
-       for (; cit != end; ++cit)
-               tcpreamble << tclass[*cit].htmlstyle();
+       for (auto const & c : usedLayouts_)
+               tcpreamble << tclass[c].htmlstyle();
 
-       cit = usedInsetLayouts_.begin();
-       end = usedInsetLayouts_.end();
        TextClass::InsetLayouts const & ils = tclass.insetLayouts();
-       for (; cit != end; ++cit) {
-               TextClass::InsetLayouts::const_iterator it = ils.find(*cit);
+       for (auto const & c : usedInsetLayouts_) {
+               TextClass::InsetLayouts::const_iterator it = ils.find(c);
                if (it == ils.end())
                        continue;
                tcpreamble << it->second.htmlstyle();
@@ -2142,37 +2147,6 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel,
 }
 
 
-docstring const LaTeXFeatures::getLyXSGMLEntities() const
-{
-       // Definition of entities used in the document that are LyX related.
-       odocstringstream entities;
-
-       if (mustProvide("lyxarrow")) {
-               entities << "<!ENTITY lyxarrow \"-&gt;\">" << '\n';
-       }
-
-       return entities.str();
-}
-
-
-docstring const LaTeXFeatures::getIncludedFiles(string const & fname) const
-{
-       odocstringstream sgmlpreamble;
-       // FIXME UNICODE
-       docstring const basename(from_utf8(onlyPath(fname)));
-
-       FileMap::const_iterator end = IncludedFiles_.end();
-       for (FileMap::const_iterator fi = IncludedFiles_.begin();
-            fi != end; ++fi)
-               // FIXME UNICODE
-               sgmlpreamble << "\n<!ENTITY " << fi->first
-                            << (isSGMLFileName(fi->second) ? " SYSTEM \"" : " \"")
-                            << makeRelPath(from_utf8(fi->second), basename) << "\">";
-
-       return sgmlpreamble.str();
-}
-
-
 void LaTeXFeatures::showStruct() const
 {
        lyxerr << "LyX needs the following commands when LaTeXing:"