From 315c2f132ad79c1ac40a101681365a4150b0496f Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Thu, 17 Aug 2023 14:25:33 +0200 Subject: [PATCH] Account for babel's bidi option (#12866) bidi=bidi-{r,l} load the bidi package --- src/BufferParams.cpp | 27 +++++++++++++++++++++++++++ src/BufferParams.h | 5 +++++ src/Font.cpp | 4 ++-- src/OutputParams.cpp | 6 ------ src/OutputParams.h | 2 -- src/Paragraph.cpp | 6 +++--- src/insets/InsetCitation.cpp | 2 +- src/insets/InsetRef.cpp | 2 +- src/insets/InsetTabular.cpp | 4 ++-- 9 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 875b8d0ca8..3dad8c6913 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -2948,6 +2948,33 @@ bool BufferParams::isLiterate() const } +bool BufferParams::hasPackageOption(string const package, string const opt) const +{ + for (auto const & p : documentClass().packageOptions()) + if (package == p.first && opt == p.second) + return true; + return false; +} + + +bool BufferParams::useBidiPackage(OutputParams const & rp) const +{ + return (rp.use_polyglossia + // as of babel 3.29, bidi=bidi-* is supported by babel + // So we check whether we use a respective version and + // whethert bidi-r or bidi-l have been requested either via class + // or package options + || (rp.use_babel + && LaTeXFeatures::isAvailableAtLeastFrom("babel", 2019, 4, 3) + && (hasPackageOption("babel", "bidi-r") + || hasPackageOption("babel", "bidi-l") + || contains(options, "bidi-r") + || contains(options, "bidi-l"))) + ) + && rp.flavor == Flavor::XeTeX; +} + + void BufferParams::readPreamble(Lexer & lex) { if (lex.getString() != "\\begin_preamble") diff --git a/src/BufferParams.h b/src/BufferParams.h index 77b4856b4d..2a2e0f3087 100644 --- a/src/BufferParams.h +++ b/src/BufferParams.h @@ -49,6 +49,7 @@ class LayoutFile; class LayoutFileIndex; class Length; class Lexer; +class OutputParams; class otexstream; class PDFOptions; class Spacing; @@ -194,6 +195,10 @@ public: bool isLatex() const; /// returns \c true if the buffer contains a Wed document bool isLiterate() const; + /// Is this package option requested? + bool hasPackageOption(std::string const package, std::string const opt) const; + /// Do we use the bidi package (which does some reordering and stuff)? + bool useBidiPackage(OutputParams const & rp) const; /// return the format of the buffer on a string std::string bufferFormat() const; diff --git a/src/Font.cpp b/src/Font.cpp index aa8c235f11..8c73e91f37 100644 --- a/src/Font.cpp +++ b/src/Font.cpp @@ -426,7 +426,7 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams, // the numbers are written Left-to-Right. ArabTeX package // and bidi (polyglossia with XeTeX) reorder the number automatically // but the packages used for Hebrew and Farsi (Arabi) do not. - if (!runparams.useBidiPackage() + if (!bparams.useBidiPackage(runparams) && !runparams.pass_thru && bits_.number() == FONT_ON && prev.fontInfo().number() != FONT_ON @@ -604,7 +604,7 @@ int Font::latexWriteEndChanges(otexstream & os, BufferParams const & bparams, // the numbers are written Left-to-Right. ArabTeX package // and bidi (polyglossia with XeTeX) reorder the number automatically // but the packages used for Hebrew and Farsi (Arabi) do not. - if (!runparams.useBidiPackage() + if (!bparams.useBidiPackage(runparams) && !runparams.pass_thru && bits_.number() == FONT_ON && next.fontInfo().number() != FONT_ON diff --git a/src/OutputParams.cpp b/src/OutputParams.cpp index dd98c52bbc..7c22cb1348 100644 --- a/src/OutputParams.cpp +++ b/src/OutputParams.cpp @@ -51,10 +51,4 @@ bool OutputParams::isFullUnicode() const || flavor == Flavor::XeTeX; } - -bool OutputParams::useBidiPackage() const -{ - return use_polyglossia && flavor == Flavor::XeTeX; -} - } // namespace lyx diff --git a/src/OutputParams.h b/src/OutputParams.h index 40a7a47785..9d9a7ae8f8 100644 --- a/src/OutputParams.h +++ b/src/OutputParams.h @@ -83,8 +83,6 @@ public: bool isLaTeX() const; /// does this flavour support full unicode? bool isFullUnicode() const; - /// Do we use the bidi package (which does some reordering and stuff)? - bool useBidiPackage() const; /// Same, but for math output, which only matter is XHTML output. MathFlavor math_flavor = NotApplicable; diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index d4658faf84..30a5e5eb35 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -2055,7 +2055,7 @@ char_type Paragraph::getUChar(BufferParams const & bparams, // or if we use poylglossia/bidi (XeTeX) // or with babel and Xe/LuaTeX. if (!getFontSettings(bparams, pos).isRightToLeft() - || rp.useBidiPackage() + || bparams.useBidiPackage(rp) || (rp.use_babel && rp.isFullUnicode())) return c; @@ -2548,7 +2548,7 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams, // RTL in classic (PDF)LaTeX (without the Bidi package) // Luabibdi (used by LuaTeX) behaves like classic bool const rtl_classic = owner_->getParLanguage(bparams)->rightToLeft() - && !runparams.useBidiPackage(); + && !bparams.useBidiPackage(runparams); switch (curAlign) { case LYX_ALIGN_NONE: @@ -2612,7 +2612,7 @@ bool Paragraph::Private::endTeXParParams(BufferParams const & bparams, // RTL in classic (PDF)LaTeX (without the Bidi package) // Luabibdi (used by LuaTeX) behaves like classic bool const rtl_classic = owner_->getParLanguage(bparams)->rightToLeft() - && !runparams.useBidiPackage(); + && !bparams.useBidiPackage(runparams); switch (curAlign) { case LYX_ALIGN_NONE: diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp index c684b4c7a9..b1d01f4d67 100644 --- a/src/insets/InsetCitation.cpp +++ b/src/insets/InsetCitation.cpp @@ -543,7 +543,7 @@ bool InsetCitation::forceLTR(OutputParams const & rp) const // We have to force LTR for numeric references // [= bibliography, plain BibTeX, numeric natbib // and biblatex]. Except for XeTeX/bidi. See #3005. - if (rp.useBidiPackage()) + if (buffer().masterParams().useBidiPackage(rp)) return false; return (buffer().masterParams().citeEngine() == "basic" || buffer().masterParams().citeEngineType() == ENGINE_TYPE_NUMERICAL); diff --git a/src/insets/InsetRef.cpp b/src/insets/InsetRef.cpp index 49cf630b78..0938b47e27 100644 --- a/src/insets/InsetRef.cpp +++ b/src/insets/InsetRef.cpp @@ -611,7 +611,7 @@ bool InsetRef::forceLTR(OutputParams const & rp) const // * Parentheses are automatically swapped with XeTeX/bidi // [not with LuaTeX/luabidi] (see #11626). // FIXME: Re-Audit all other RTL cases. - if (rp.useBidiPackage()) + if (buffer().masterParams().useBidiPackage(rp)) return false; return (getCmdName() != "nameref" || !buffer().masterParams().useNonTeXFonts); } diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 69f9e73e59..e8fc1baf97 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3180,7 +3180,7 @@ void Tabular::TeXRow(otexstream & os, row_type row, // Luabibdi (used by LuaTeX) behaves like classic bool const bidi_rtl = runparams.local_font->isRightToLeft() - && runparams.useBidiPackage(); + && buffer().params().useBidiPackage(runparams); bool const ct = !buffer().params().output_changes; idx_type lastcell = bidi_rtl ? getFirstCellInRow(row, ct) : getLastCellInRow(row, ct); @@ -3352,7 +3352,7 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const // order for RTL (#9686). Thus we use this list. bool const bidi_rtl = runparams.local_font->isRightToLeft() - && runparams.useBidiPackage(); + && buffer().params().useBidiPackage(runparams); list columns; list logical_columns; for (col_type cl = 0; cl < ncols(); ++cl) {