X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=827b44992fba64cc526bdf47432a4dd1579369ff;hb=1e519d1115f41f71c253cb9e2fbb7803e9a583a9;hp=204c3ec4cca0d48539101f40b3cfce1621cc2c9a;hpb=ab4bd6b77ebb6163b57254653dd5ab6c27006e94;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 204c3ec4cc..827b44992f 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -63,12 +63,7 @@ namespace lyx { //\message{LyX LaTeX Extensions (LLE v0.2) of 11-Jan-1996.} static docstring const lyx_def = from_ascii( - "\\providecommand{\\LyX}{L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}"); - -static docstring const lyx_hyperref_def = from_ascii( - "\\providecommand{\\LyX}{\\texorpdfstring%\n" - " {L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}\n" - " {LyX}}"); + "{%\n L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}"); static docstring const noun_def = from_ascii( "\\newcommand{\\noun}[1]{\\textsc{#1}}"); @@ -258,7 +253,7 @@ static docstring const textcyr_T2A_def = from_ascii( static docstring const textcyr_def = from_ascii( "\\DeclareRobustCommand{\\cyrtext}{%\n" " \\fontencoding{T2A}\\selectfont\\def\\encodingdefault{T2A}}\n" - "\\DeclareRobustCommand{\\textcyr}[1]{\\leavevmode{\\cyrtext #1}}\n"); + "\\DeclareRobustCommand{\\textcyrillic}[1]{\\leavevmode{\\cyrtext #1}}\n"); static docstring const lyxmathsym_def = from_ascii( "\\newcommand{\\lyxmathsym}[1]{\\ifmmode\\begingroup\\def\\b@ld{bold}\n" @@ -320,67 +315,67 @@ static docstring const ogonek_def = from_ascii( static docstring const lyxaccent_def = from_ascii( "%% custom text accent \\LyxTextAccent[]{}{}\n" - "\\newcommand*{\\LyxTextAccent}[3][0ex]{%\n" - " \\hmode@bgroup\\ooalign{\\null#3\\crcr\\hidewidth\n" - " \\raise#1\\hbox{#2}\\hidewidth}\\egroup}\n" - "%% select a font size smaller than the current font size:\n" - "\\newcommand{\\LyxAccentSize}[1][\\sf@size]{%\n" - " \\check@mathfonts\\fontsize#1\\z@\\math@fontsfalse\\selectfont\n" - "}\n"); + "\\newcommand*{\\LyxTextAccent}[3][0ex]{%\n" + " \\hmode@bgroup\\ooalign{\\null#3\\crcr\\hidewidth\n" + " \\raise#1\\hbox{#2}\\hidewidth}\\egroup}\n" + "%% select a font size smaller than the current font size:\n" + "\\newcommand{\\LyxAccentSize}[1][\\sf@size]{%\n" + " \\check@mathfonts\\fontsize#1\\z@\\math@fontsfalse\\selectfont\n" + "}\n"); static docstring const textcommabelow_def = from_ascii( - "\\ProvideTextCommandDefault{\\textcommabelow}[1]{%%\n" - " \\LyxTextAccent[-.31ex]{\\LyxAccentSize,}{#1}}\n"); + "\\ProvideTextCommandDefault{\\textcommabelow}[1]{%%\n" + " \\LyxTextAccent[-.31ex]{\\LyxAccentSize,}{#1}}\n"); static docstring const textcommaabove_def = from_ascii( - "\\ProvideTextCommandDefault{\\textcommaabove}[1]{%%\n" - " \\LyxTextAccent[.5ex]{\\LyxAccentSize`}{#1}}\n"); + "\\ProvideTextCommandDefault{\\textcommaabove}[1]{%%\n" + " \\LyxTextAccent[.5ex]{\\LyxAccentSize`}{#1}}\n"); static docstring const textcommaaboveright_def = from_ascii( - "\\ProvideTextCommandDefault{\\textcommaaboveright}[1]{%%\n" - " \\LyxTextAccent[.5ex]{\\LyxAccentSize\\ '}{#1}}\n"); + "\\ProvideTextCommandDefault{\\textcommaaboveright}[1]{%%\n" + " \\LyxTextAccent[.5ex]{\\LyxAccentSize\\ '}{#1}}\n"); // Baltic languages use a comma-accent instead of a cedilla static docstring const textbaltic_def = from_ascii( - "%% use comma accent instead of cedilla for these characters:\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{g}{\\textcommaabove{g}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{G}{\\textcommabelow{G}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{k}{\\textcommabelow{k}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{K}{\\textcommabelow{K}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{l}{\\textcommabelow{l}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{L}{\\textcommabelow{L}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{n}{\\textcommabelow{n}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{N}{\\textcommabelow{N}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{r}{\\textcommabelow{r}}\n" - "\\DeclareTextCompositeCommand{\\c}{T1}{R}{\\textcommabelow{R}}\n"); + "%% use comma accent instead of cedilla for these characters:\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{g}{\\textcommaabove{g}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{G}{\\textcommabelow{G}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{k}{\\textcommabelow{k}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{K}{\\textcommabelow{K}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{l}{\\textcommabelow{l}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{L}{\\textcommabelow{L}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{n}{\\textcommabelow{n}}\n" + "\\DeclareTextCompositeCommand{\\c}{T1}{N}{\\textcommabelow{N}}\n" + "\\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"); + "\\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" - " {}\n" - "\\RS@ifundefined{thmref}\n" - " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n" - " {}\n" - "\\RS@ifundefined{lemref}\n" - " {\\def\\RSlemtxt{lemma~}\\newref{lem}{name = \\RSlemtxt}}\n" - " {}\n"); + "\\RS@ifundefined{subsecref}\n" + " {\\newref{subsec}{name = \\RSsectxt}}\n" + " {}\n" + "\\RS@ifundefined{thmref}\n" + " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n" + " {}\n" + "\\RS@ifundefined{lemref}\n" + " {\\def\\RSlemtxt{lemma~}\\newref{lem}{name = \\RSlemtxt}}\n" + " {}\n"); // Make sure the columns are also outputed as rtl static docstring const rtloutputdblcol_def = from_ascii( @@ -459,7 +454,7 @@ static docstring const lyxstrikeout_style = from_ascii( LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p, - OutputParams const & r) + OutputParams const & r) : buffer_(&b), params_(p), runparams_(r), in_float_(false), in_deleted_inset_(false) {} @@ -544,6 +539,12 @@ void LaTeXFeatures::require(set const & names) } +void LaTeXFeatures::provide(string const & name) +{ + provides_.insert(name); +} + + void LaTeXFeatures::useLayout(docstring const & layoutname) { useLayout(layoutname, 0); @@ -609,27 +610,10 @@ bool LaTeXFeatures::isRequired(string const & name) const bool LaTeXFeatures::isProvided(string const & name) const { - // \textgreek is provided by babel globally if a Greek language/variety - // is used in the document - if (useBabel() && name == "textgreek" - && params_.main_font_encoding() != "default") { - // get main font encodings - vector fontencs = params_.font_encodings(); - // get font encodings of secondary languages - getFontEncodings(fontencs, true); - for (auto & fe : fontencs) { - if (!Encodings::needsScriptWrapper(name, fe)) - return true; - } - } - // FIXME: Analoguously, babel provides a command \textcyrillic, but - // for some reason, we roll our own \textcyr definition - // We should use \textcyrillic instead and only define it - // if we do not use a respective language that features it (i.e., - // add "textcyrillic" to the test above. - // FIXME: the "textbaltic" definitions are only needed if the context - // font-encoding where the respective char is is not l7x. - // We cannot check this here as we have no context information. + // Currently, this is only features provided by babel languages + // (such as textgreek) + if (provides_.find(name) != provides_.end()) + return true; if (params_.useNonTeXFonts) return params_.documentClass().provides(name); @@ -756,11 +740,14 @@ void LaTeXFeatures::useLanguage(Language const * lang) UsedLanguages_.insert(lang); if (!lang->requires().empty()) require(lang->requires()); + // currently only supported for Babel + if (!lang->provides().empty() && useBabel()) + provide(lang->provides()); // CJK languages do not have a babel name. // They use the CJK package if (lang->encoding()->package() == Encoding::CJK) require("CJK"); - // japanese package is special + // japanese babel language is special (tied to the pLaTeX engine). if (lang->encoding()->package() == Encoding::japanese) require("japanese"); } @@ -892,8 +879,7 @@ set LaTeXFeatures::getEncodingSet(string const & doc_encoding) const set encs; for (auto const & lang : UsedLanguages_) if (lang->encoding()->latexName() != doc_encoding && - (lang->encoding()->package() == Encoding::inputenc - || lang->encoding()->package() == Encoding::japanese)) + lang->encoding()->package() == Encoding::inputenc) encs.insert(lang->encoding()->latexName()); return encs; } @@ -907,22 +893,33 @@ void LaTeXFeatures::getFontEncodings(vector & encs, bool const onlylangs if (mustProvide("textgreek") && find(encs.begin(), encs.end(), "LGR") == encs.end()) encs.insert(encs.begin(), "LGR"); - if (mustProvide("textcyr") + if (mustProvide("textcyrillic") && find(encs.begin(), encs.end(), "T2A") == encs.end()) encs.insert(encs.begin(), "T2A"); } - for (auto const & lang : UsedLanguages_) - if (!lang->fontenc().empty() - && ascii_lowercase(lang->fontenc()) != "none") { - vector extraencs = getVectorFromString(lang->fontenc()); - for (auto const & extra : extraencs) { - if (find(encs.begin(), encs.end(), extra) == encs.end()) - encs.insert(encs.begin(), extra); - } + for (auto const & lang : UsedLanguages_) { + vector extraencs = + getVectorFromString(lang->fontenc(buffer().masterParams())); + for (auto const & extra : extraencs) { + if (extra != "none" && find(encs.begin(), encs.end(), extra) == encs.end()) + encs.insert(encs.begin(), extra); } + } +} + + +bool LaTeXFeatures::hasRTLLanguage() const +{ + if (params_.language->rightToLeft()) + return true; + for (auto const & lang : UsedLanguages_) + if (lang->rightToLeft()) + return true; + return false; } + namespace { char const * simplefeatures[] = { @@ -952,8 +949,7 @@ char const * simplefeatures[] = { "units", "framed", "soul", - "textcomp", - "pmboxdraw", + "dingbat", "bbding", "ifsym", "txfonts", @@ -965,7 +961,6 @@ char const * simplefeatures[] = { // "cancel", "ascii", "url", - "covington", "csquotes", "enumitem", "endnotes", @@ -990,9 +985,12 @@ char const * simplefeatures[] = { "todonotes", "forest", "varwidth", - "footnote", "tablefootnote", "afterpage", + "tabularx", + "xltabular", + "chessboard", + "xskak" }; char const * bibliofeatures[] = { @@ -1115,6 +1113,13 @@ string const LaTeXFeatures::getPackages() const // The rest of these packages are somewhat more complicated // than those above. + if (mustProvide("footnote")) { + if (isRequired("hyperref")) + packages << "\\usepackage{footnotehyper}\n"; + else + packages << "\\usepackage{footnote}\n"; + } + // [pdf]lscape is used to rotate longtables if (mustProvide("lscape")) { if (runparams_.flavor == OutputParams::LATEX @@ -1366,10 +1371,24 @@ TexString LaTeXFeatures::getMacros() const } if (mustProvide("LyX")) { + macros << "\\providecommand{\\LyX}"; + // open conditional wrappers + if (runparams_.use_polyglossia && hasRTLLanguage()) + macros << "{\\@ensure@LTR"; if (isRequired("hyperref")) - macros << lyx_hyperref_def << '\n'; - else - macros << lyx_def << '\n'; + macros << "{\\texorpdfstring"; + if (useBabel()) + macros << "{\\ensureascii"; + // main definition + macros << lyx_def; + // close conditional wrappers + if (useBabel()) + macros << '}'; + if (isRequired("hyperref")) + macros << "{LyX}}"; + if (runparams_.use_polyglossia && hasRTLLanguage()) + macros << '}'; + macros << '\n'; } if (mustProvide("noun")) @@ -1388,7 +1407,7 @@ TexString LaTeXFeatures::getMacros() const macros << textgreek_def << '\n'; } - if (!usePolyglossia() && mustProvide("textcyr")) { + 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") macros << textcyr_T2A_def; @@ -1584,21 +1603,6 @@ docstring const LaTeXFeatures::getBabelPostsettings() const } -bool LaTeXFeatures::needBabelLangOptions() const -{ - if (!lyxrc.language_global_options || params_.language->asBabelOptions()) - return true; - - LanguageList::const_iterator it = UsedLanguages_.begin(); - LanguageList::const_iterator end = UsedLanguages_.end(); - for (; it != end; ++it) - if ((*it)->asBabelOptions()) - return true; - - return false; -} - - string const LaTeXFeatures::loadAMSPackages() const { ostringstream tmp; @@ -1894,9 +1898,11 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel, // encodings, only with fixed width encodings. Therefore we // need to force a fixed width encoding for // \lstlistlistingname and \lstlistingname (bug 9382). - // This needs to be consistent with InsetListings::latex(). + // This needs to be consistent with InsetListings::latex() + // rsp. InsetListings::forcedEncoding(). bool const need_fixedwidth = !use_minted && !runparams_.isFullUnicode() && + buffer().params().encoding().package() != Encoding::japanese && it->second.fixedwidthpreambleencoding(); // language dependent commands (once per document) snippets.insert(i18npreamble(it->second.langpreamble(),