From c1c94010e473e648d5510dc585b094da966fbc2d Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Thu, 15 Aug 2019 16:21:13 +0200 Subject: [PATCH] Fix coloured boxes in RTL with [pdf]latex (#8642) (cherry picked from commit 7ca267e1fe7da456e41d8353b42f744797e32a9c) --- src/insets/InsetBox.cpp | 48 ++++++++++++++++++++++++++++++----------- status.23x | 2 ++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp index 9d60ffcfae..ac093b03bb 100644 --- a/src/insets/InsetBox.cpp +++ b/src/insets/InsetBox.cpp @@ -338,6 +338,14 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const string separation_string = params_.separation.asLatexString(); string shadowsize_string = params_.shadowsize.asLatexString(); bool stdwidth = false; + // Colored boxes in RTL need to be wrapped into \beginL...\endL + string maybeBeginL; + string maybeEndL; + bool needEndL = false; + if (!runparams.isFullUnicode() && runparams.local_font->isRightToLeft()) { + maybeBeginL = "\\beginL"; + maybeEndL = "\\endL"; + } // in general the overall width of some decorated boxes is wider thean the inner box // we could therefore calculate the real width for all sizes so that if the user wants // e.g. 0.1\columnwidth or 2cm he gets exactly this size @@ -408,8 +416,9 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const os << "{\\fboxsep " << from_ascii(separation_string); if (!params_.inner_box && !width_string.empty()) { if (params_.framecolor != "black" || params_.backgroundcolor != "none") { - os << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}{"; + os << maybeBeginL << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}{"; os << "\\makebox"; + needEndL = !maybeBeginL.empty(); } else os << "\\framebox"; // Special widths, see usrguide sec. 3.5 @@ -425,9 +434,10 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (params_.hor_pos != 'c') os << "[" << params_.hor_pos << "]"; } else { - if (params_.framecolor != "black" || params_.backgroundcolor != "none") - os << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}"; - else + if (params_.framecolor != "black" || params_.backgroundcolor != "none") { + os << maybeBeginL << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}"; + needEndL = !maybeBeginL.empty(); + } else os << "\\fbox"; } os << "{"; @@ -467,6 +477,8 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const case Shaded: // must be set later because e.g. the width settings only work when // it is inside a minipage or parbox + os << maybeBeginL; + needEndL = !maybeBeginL.empty(); break; case Doublebox: if (thickness_string != defaultThick) { @@ -482,13 +494,17 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (params_.inner_box) { if (params_.use_parbox) { - if (params_.backgroundcolor != "none" && btype == Frameless) - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + if (params_.backgroundcolor != "none" && btype == Frameless) { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}{"; + needEndL = !maybeBeginL.empty(); + } os << "\\parbox"; } else if (params_.use_makebox) { if (!width_string.empty()) { - if (params_.backgroundcolor != "none") - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + if (params_.backgroundcolor != "none") { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}{"; + needEndL = !maybeBeginL.empty(); + } os << "\\makebox"; // FIXME UNICODE // output the width and horizontal position @@ -502,16 +518,20 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const if (params_.hor_pos != 'c') os << "[" << params_.hor_pos << "]"; } else { - if (params_.backgroundcolor != "none") - os << "\\colorbox{" << params_.backgroundcolor << "}"; + if (params_.backgroundcolor != "none") { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}"; + needEndL = !maybeBeginL.empty(); + } else os << "\\mbox"; } os << "{"; } else { - if (params_.backgroundcolor != "none" && btype == Frameless) - os << "\\colorbox{" << params_.backgroundcolor << "}{"; + if (params_.backgroundcolor != "none" && btype == Frameless) { + os << maybeBeginL << "\\colorbox{" << params_.backgroundcolor << "}{"; + needEndL = !maybeBeginL.empty(); + } os << "\\begin{minipage}"; } @@ -570,7 +590,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const break; case Framed: os << "\\end{framed}"; - if (separation_string != defaultSep || thickness_string != defaultThick) + if (separation_string != defaultSep || thickness_string != defaultThick) os << "}"; break; case Boxed: @@ -607,6 +627,8 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const // already done break; } + if (needEndL) + os << maybeEndL; } diff --git a/status.23x b/status.23x index 0c9cc76d22..7befdb71e1 100644 --- a/status.23x +++ b/status.23x @@ -96,6 +96,8 @@ What's new - Fix greyedout note with RTL documents (bug 8647). +- Fix colored and shaded boxes with RTL documents (bug 8642). + * USER INTERFACE -- 2.39.2