X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=3d67128f58069129dc7ed13364339a6e55971729;hb=a8572c1358d5d2e66612e9f44329a6ffd33516a6;hp=533f5ad69619c808fefb62134662d99f45f67180;hpb=a08cbf41cf2b3087029c19db49dfca5aa01a4b2d;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 533f5ad696..3d67128f58 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -235,43 +235,149 @@ static docstring const lyxdot_def = from_ascii( "%% A simple dot to overcome graphicx limitations\n" "\\newcommand{\\lyxdot}{.}\n"); -static docstring const changetracking_dvipost_def = from_ascii( - "%% Change tracking with dvipost\n" - "\\dvipostlayout\n" - "\\dvipost{osstart color push Red}\n" - "\\dvipost{osend color pop}\n" - "\\dvipost{cbstart color push Blue}\n" - "\\dvipost{cbend color pop}\n" - "\\DeclareRobustCommand{\\lyxadded}[4][]{\\changestart#4\\changeend}\n" - "\\DeclareRobustCommand{\\lyxdeleted}[4][]{%\n" - "\\changestart\\overstrikeon#4\\overstrikeoff\\changeend}\n"); +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{\\mklyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n"); static docstring const changetracking_xcolor_ulem_def = from_ascii( - "%% Change tracking with ulem\n" - "\\DeclareRobustCommand{\\lyxadded}[4][]{{\\color{lyxadded}{}#4}}\n" - "\\DeclareRobustCommand{\\lyxdeleted}[4][]{{\\color{lyxdeleted}\\lyxsout{#4}}}\n" - "\\DeclareRobustCommand{\\lyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n"); + "%% Change tracking with ulem and xcolor: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{\\mklyxadded{#4}}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{\\mklyxdeleted{#4}}\n"); + +static docstring const changetracking_xcolor_ulem_cb_def = from_ascii( + "%% Change tracking with ulem, xcolor and changebars: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{%\n" + " \\protect\\cbstart\\mklyxadded{#4}%\n" + " \\protect\\cbend%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{%\n" + " \\protect\\cbstart\\mklyxdeleted{#4}%\n" + " \\protect\\cbend%\n" + "}\n"); static docstring const changetracking_xcolor_ulem_hyperref_def = from_ascii( - "%% Change tracking with ulem\n" - "\\DeclareRobustCommand{\\lyxadded}[4][]{{\\texorpdfstring{\\color{lyxadded}{}}{}#4}}\n" - "\\DeclareRobustCommand{\\lyxdeleted}[4][]{{\\texorpdfstring{\\color{lyxdeleted}\\lyxsout{#4}}{}}}\n" - "\\DeclareRobustCommand{\\lyxsout}[1]{\\ifx\\\\#1\\else\\sout{#1}\\fi}\n"); - -static docstring const changetracking_tikz_math_sout_def = from_ascii( - "%% Strike out display math with tikz\n" - "\\usepackage{tikz}\n" + "%% Change tracking with ulem, xcolor, and hyperref: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{\\texorpdfstring{\\mklyxadded{#4}}{#4}}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{\\texorpdfstring{\\mklyxdeleted{#4}}{}}\n"); + +static docstring const changetracking_xcolor_ulem_hyperref_cb_def = from_ascii( + "%% Change tracking with ulem, xcolor, hyperref and changebars: ct markup\n" + "\\DeclareRobustCommand{\\lyxadded}[4][]{%\n" + " \\texorpdfstring{\\protect\\cbstart\\mklyxadded{#4}%\n" + " \\protect\\cbend}{#4}%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdeleted}[4][]{%\n" + " \\texorpdfstring{\\protect\\cbstart\\mklyxdeleted{#4}%\n" + " \\protect\\cbend}{}%\n" + "}\n"); + +static docstring const changetracking_tikz_object_sout_def = from_ascii( + "%% Strike out display math and text objects with tikz\n" "\\usetikzlibrary{calc}\n" - "\\newcommand{\\lyxmathsout}[1]{%\n" - " \\tikz[baseline=(math.base)]{\n" - " \\node[inner sep=0pt,outer sep=0pt](math){#1};\n" - " \\draw($(math.south west)+(2em,.5em)$)--($(math.north east)-(2em,.5em)$);\n" + "\\newcommand{\\lyxobjectsout}[1]{%\n" + " \\bgroup%\n" + " \\color{lyxdeleted}%\n" + " \\tikz{\n" + " \\node[inner sep=0pt,outer sep=0pt](lyxdelobj){#1};\n" + " \\draw($(lyxdelobj.south west)+(2em,.5em)$)--($(lyxdelobj.north east)-(2em,.5em)$);\n" " }\n" + " \\egroup%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_object_def = from_ascii( + "%% Change tracking with ulem and xcolor: ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{\\lyxobjectsout{#4}}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\lyxobjectsout{\\parbox{\\linewidth}{#4}}%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\raisebox{-\\belowdisplayshortskip}{%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}}%\n" + " \\leavevmode\\\\%\n" + " \\fi%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_cb_object_def = from_ascii( + "%% Change tracking with ulem, xcolor and changebars:ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{%\n" + " \\protect\\cbstart\\lyxobjectsout{#4}%\n" + " \\protect\\cbend%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\protect\\cbstart%\n" + " \\lyxobjectsout{\\parbox{\\linewidth}{#4}}%\n" + " \\protect\\cbend%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\leavevmode\\\\%\n" + " \\raisebox{-\\belowdisplayshortskip}{%\n" + " \\protect\\cbstart%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}}%\n" + " \\protect\\cbend%\n" + " \\leavevmode\\\\%\n" + " \\fi%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_hyperref_object_def = from_ascii( + "%% Change tracking with ulem, xcolor, and hyperref: ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{\\texorpdfstring{\\lyxobjectsout{#4}}{}}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\lyxobjectsout{\\parbox{\\linewidth}{#4}}}{}%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\raisebox{-\\belowdisplayshortskip}{%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}}}{}%\n" + " \\leavevmode\\\\%\n" + " \\fi%\n" + "}\n"); + +static docstring const changetracking_xcolor_ulem_hyperref_cb_object_def = from_ascii( + "%% Change tracking with ulem, xcolor, hyperref and changebars:\n" + "%% ct markup for complex objects\n" + "\\DeclareRobustCommand{\\lyxobjdeleted}[4][]{%\n" + " \\texorpdfstring{\\protect\\cbstart\\lyxobjectsout{#4}%\n" + " \\protect\\cbend}{}%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxdisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\protect\\cbstart%\n" + " \\lyxobjectsout{\\parbox{\\linewidth}{#4}}%\n" + " \\protect\\cbend%\n" + " }{}%\n" + " \\fi%\n" + "}\n" + "\\DeclareRobustCommand{\\lyxudisplayobjdeleted}[4][]{%\n" + " \\ifx#4\\empty\\else%\n" + " \\texorpdfstring{\\leavevmode\\\\\\protect\\cbstart%\n" + " \\raisebox{-\\belowdisplayshortskip}{%\n" + " \\lyxobjectsout{\\parbox[b]{\\linewidth}{#4}}%\n" + " }%\n" + " \\leavevmode\\\\%\n" + " }{}%\n" + " \\fi%\n" "}\n"); static docstring const changetracking_none_def = from_ascii( + "%% Change tracking: Disable markup in output\n" "\\newcommand{\\lyxadded}[3]{#3}\n" - "\\newcommand{\\lyxdeleted}[3]{}\n"); + "\\newcommand{\\lyxdeleted}[3]{}\n" + "\\newcommand{\\lyxobjdeleted}[3]{}\n" + "\\newcommand{\\lyxdisplayobjdeleted}[3]{}\n" + "\\newcommand{\\lyxudisplayobjdeleted}[3]{}\n"); static docstring const textgreek_LGR_def = from_ascii( "\\DeclareFontEncoding{LGR}{}{}\n"); @@ -611,7 +717,7 @@ void LaTeXFeatures::useLayout(docstring const & layoutname, int level) return; Layout const & layout = tclass[layoutname]; - require(layout.requires()); + require(layout.required()); if (!layout.depends_on().empty()) { useLayout(layout.depends_on(), level + 1); @@ -638,7 +744,7 @@ void LaTeXFeatures::useInsetLayout(InsetLayout const & lay) != usedInsetLayouts_.end()) return; - require(lay.requires()); + require(lay.required()); usedInsetLayouts_.push_back(lname); } @@ -772,9 +878,9 @@ void LaTeXFeatures::useFloat(string const & name, bool subfloat) if (!fl.floattype().empty()) { if (fl.usesFloatPkg()) require("float"); - if (!fl.requires().empty()) { - vector reqs = getVectorFromString(fl.requires()); - for (auto const req : reqs) + if (!fl.required().empty()) { + vector reqs = getVectorFromString(fl.required()); + for (auto const & req : reqs) require(req); } } @@ -785,8 +891,8 @@ void LaTeXFeatures::useLanguage(Language const * lang) { if (!lang->babel().empty() || !lang->polyglossia().empty()) UsedLanguages_.insert(lang); - if (!lang->requires().empty()) - require(lang->requires()); + if (!lang->required().empty()) + require(lang->required()); // currently only supported for Babel if (!lang->provides().empty() && useBabel()) provide(lang->provides()); @@ -818,11 +924,9 @@ bool LaTeXFeatures::hasOnlyPolyglossiaLanguages() const if (params_.language->polyglossia().empty()) return false; // now the secondary languages - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); - ++cit) { - if ((*cit)->polyglossia().empty()) + for (auto const & lang : UsedLanguages_) + { + if (lang->polyglossia().empty()) return false; } return true; @@ -835,11 +939,9 @@ bool LaTeXFeatures::hasPolyglossiaExclusiveLanguages() const if (params_.language->isPolyglossiaExclusive()) return true; // now the secondary languages - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); - ++cit) { - if ((*cit)->isPolyglossiaExclusive()) + for (auto const & lang : UsedLanguages_) + { + if (lang->isPolyglossiaExclusive()) return true; } return false; @@ -853,12 +955,10 @@ vector LaTeXFeatures::getPolyglossiaExclusiveLanguages() const if (params_.language->isPolyglossiaExclusive()) result.push_back(params_.language->display()); // now the secondary languages - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); - ++cit) { - if ((*cit)->isPolyglossiaExclusive()) - result.push_back((*cit)->display()); + for (auto const & lang : UsedLanguages_) + { + if (lang->isPolyglossiaExclusive()) + result.push_back(lang->display()); } return result; } @@ -871,12 +971,10 @@ vector LaTeXFeatures::getBabelExclusiveLanguages() const if (params_.language->isBabelExclusive()) result.push_back(params_.language->display()); // now the secondary languages - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); - ++cit) { - if ((*cit)->isBabelExclusive()) - result.push_back((*cit)->display()); + for (auto const & lang : UsedLanguages_) + { + if (lang->isBabelExclusive()) + result.push_back(lang->display()); } return result; } @@ -884,22 +982,19 @@ vector LaTeXFeatures::getBabelExclusiveLanguages() const string LaTeXFeatures::getBabelLanguages() const { - ostringstream langs; - - bool first = true; - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); - ++cit) { - if ((*cit)->babel().empty()) - continue; - if (!first) - langs << ','; - else - first = false; - langs << (*cit)->babel(); + vector blangs; + for (auto const & lang : UsedLanguages_) { + if (!lang->babel().empty()) + blangs.push_back(lang->babel()); } - return langs.str(); + + // Sort alphabetically to assure consistent order + // (the order itself does not matter apart from + // some exceptions, e.g. hebrew must come after + // arabic and farsi) + sort(blangs.begin(), blangs.end()); + + return getStringFromVector(blangs); } @@ -907,13 +1002,9 @@ set LaTeXFeatures::getPolyglossiaLanguages() const { set langs; - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); - ++cit) { + for (auto const & lang : UsedLanguages_) // We do not need the variants here - langs.insert((*cit)->polyglossia()); - } + langs.insert(lang->polyglossia()); return langs; } @@ -924,10 +1015,8 @@ string LaTeXFeatures::getActiveChars() const // first the main language res += params_.language->activeChars(); // now the secondary languages - LanguageList::const_iterator const begin = UsedLanguages_.begin(); - for (LanguageList::const_iterator cit = begin; - cit != UsedLanguages_.end(); ++cit) - res += ((*cit)->activeChars()); + for (auto const & lang : UsedLanguages_) + res += (lang->activeChars()); return res; } @@ -959,7 +1048,8 @@ void LaTeXFeatures::getFontEncodings(vector & encs, bool const onlylangs encs.insert(encs.begin(), "T2A"); } - for (auto const & lang : UsedLanguages_) { + for (auto const & lang : UsedLanguages_) + { vector extraencs = getVectorFromString(lang->fontenc(buffer().masterParams())); for (auto const & extra : extraencs) { @@ -1002,7 +1092,6 @@ char const * simplefeatures[] = { "float", "wrapfig", "booktabs", - "dvipost", "fancybox", "calc", "units", @@ -1045,15 +1134,16 @@ char const * simplefeatures[] = { "todonotes", "forest", "varwidth", - "tablefootnote", "afterpage", "tabularx", + "tikz", "xltabular", "chessboard", "xskak", "pict2e", "drs", - "environ" + "environ", + "dsfont" }; char const * bibliofeatures[] = { @@ -1176,6 +1266,14 @@ string const LaTeXFeatures::getPackages() const // The rest of these packages are somewhat more complicated // than those above. + if (mustProvide("changebar")) { + packages << "\\usepackage"; + if (runparams_.flavor == OutputParams::LATEX + || runparams_.flavor == OutputParams::DVILUATEX) + packages << "[dvips]"; + packages << "{changebar}\n"; + } + if (mustProvide("footnote")) { if (isRequired("hyperref")) packages << "\\usepackage{footnotehyper}\n"; @@ -1282,6 +1380,9 @@ string const LaTeXFeatures::getPackages() const packages << "\\usepackage{rotating}\n"; if (mustProvide("rotfloat")) packages << "\\usepackage{rotfloat}\n"; + // and this must be loaded after rotating + if (mustProvide("tablefootnote")) + packages << "\\usepackage{tablefootnote}\n"; // lyxskak.sty --- newer chess support based on skak.sty if (mustProvide("chess")) @@ -1615,30 +1716,63 @@ TexString LaTeXFeatures::getMacros() const macros << lyxref_def << '\n'; // change tracking - if (mustProvide("ct-dvipost")) - macros << changetracking_dvipost_def; - if (mustProvide("ct-xcolor-ulem")) { streamsize const prec = macros.os().precision(2); - RGBColor cadd = rgbFromHexName(lcolor.getX11Name(Color_addedtext)); + RGBColor cadd = rgbFromHexName(lcolor.getX11HexName(Color_addedtext)); macros << "\\providecolor{lyxadded}{rgb}{" << cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n"; - RGBColor cdel = rgbFromHexName(lcolor.getX11Name(Color_deletedtext)); + RGBColor cdel = rgbFromHexName(lcolor.getX11HexName(Color_deletedtext)); macros << "\\providecolor{lyxdeleted}{rgb}{" << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n"; macros.os().precision(prec); - if (isRequired("hyperref")) - macros << changetracking_xcolor_ulem_hyperref_def; - else - macros << changetracking_xcolor_ulem_def; + macros << changetracking_xcolor_ulem_base_def; + + if (isRequired("changebar")) { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_cb_def; + else + macros << changetracking_xcolor_ulem_cb_def; + } else { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_def; + else + macros << changetracking_xcolor_ulem_def; + } } - if (mustProvide("ct-tikz-math-sout")) - macros << changetracking_tikz_math_sout_def; + if (mustProvide("ct-tikz-object-sout")) { + if (!mustProvide("ct-xcolor-ulem")) { + streamsize const prec = macros.os().precision(2); + + RGBColor cadd = rgbFromHexName(lcolor.getX11HexName(Color_addedtext)); + macros << "\\providecolor{lyxadded}{rgb}{" + << cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n"; + + RGBColor cdel = rgbFromHexName(lcolor.getX11HexName(Color_deletedtext)); + macros << "\\providecolor{lyxdeleted}{rgb}{" + << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n"; + + macros.os().precision(prec); + } + + macros << changetracking_tikz_object_sout_def; + + if (isRequired("changebar")) { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_cb_object_def; + else + macros << changetracking_xcolor_ulem_cb_object_def; + } else { + if (isRequired("hyperref")) + macros << changetracking_xcolor_ulem_hyperref_object_def; + else + macros << changetracking_xcolor_ulem_object_def; + } + } if (mustProvide("ct-none")) macros << changetracking_none_def; @@ -1657,7 +1791,7 @@ docstring const LaTeXFeatures::getBabelPresettings() const { odocstringstream tmp; - for (Language const * lang : UsedLanguages_) + for (auto const & lang : UsedLanguages_) if (!lang->babel_presettings().empty()) tmp << lang->babel_presettings() << '\n'; if (!params_.language->babel_presettings().empty()) @@ -1674,7 +1808,7 @@ docstring const LaTeXFeatures::getBabelPostsettings() const { odocstringstream tmp; - for (Language const * lang : UsedLanguages_) + for (auto const & lang : UsedLanguages_) if (!lang->babel_postsettings().empty()) tmp << lang->babel_postsettings() << '\n'; if (!params_.language->babel_postsettings().empty())