From 6c1855313cef2fac19022ddc4c8eccaee66088e6 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 5 Jan 2021 14:53:15 +0100 Subject: [PATCH] Center correctly centered top labels (e.g. abstract) Since the first row may be indented, it is necessary to find out what the left margin would be on the next row (even if this next row does not exst. To this end, modify TextMetrics::leftMargin so that it does not test whether position is after the last position of the paragraph. Cosmetics: set the size of label to "small" for Abstract layout in standard classes and reduce the spacing between label and text. Fixes remainder of #11939. --- lib/layouts/stdstruct.inc | 3 +-- src/RowPainter.cpp | 4 ++-- src/TextMetrics.cpp | 9 ++++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/layouts/stdstruct.inc b/lib/layouts/stdstruct.inc index b611b53da1..a0a9750711 100644 --- a/lib/layouts/stdstruct.inc +++ b/lib/layouts/stdstruct.inc @@ -27,13 +27,12 @@ Style Abstract Align Block LabelType Centered LabelString "Abstract" - LabelBottomSep 0.5 + LabelBottomSep 0.2 Font Size Small EndFont LabelFont Series Bold - Size Large EndFont HTMLLabelFirst 1 HTMLForceCSS 1 diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp index e378f433e8..9f9f51eb22 100644 --- a/src/RowPainter.cpp +++ b/src/RowPainter.cpp @@ -462,8 +462,8 @@ void RowPainter::paintTopLevelLabel() const * respect to the left and right margins. */ int const leftm = row_.isRTL() ? tm_.rightMargin(row_.pit()) - : tm_.leftMargin(row_.pit()); - int const rightm = row_.isRTL() ? tm_.leftMargin(row_.pit()) + : tm_.leftMargin(row_.pit(), 1); + int const rightm = row_.isRTL() ? tm_.leftMargin(row_.pit(), 1) : tm_.rightMargin(row_.pit()); x += leftm - row_.left_margin + (tm_.width() - leftm -rightm) / 2 - fm.width(str) / 2; diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 214fe89238..56d312f6a5 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -1610,7 +1610,10 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const LASSERT(pit < int(pars.size()), return 0); Paragraph const & par = pars[pit]; LASSERT(pos >= 0, return 0); - LASSERT(pos <= par.size(), return 0); + // We do not really care whether pos > par.size(), since we do not + // access the data. It can be actially useful, when querying the + // margin without indentation (see RowPainter::paintTopLevelLabel). + Buffer const & buffer = bv_->buffer(); //lyxerr << "TextMetrics::leftMargin: pit: " << pit << " pos: " << pos << endl; DocumentClass const & tclass = buffer.params().documentClass(); @@ -1764,8 +1767,8 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const && !text_->inset().neverIndent() // display style insets do not need indentation && !(!par.empty() - && par.isInset(pos) - && par.getInset(pos)->rowFlags() & Inset::Display) + && par.isInset(0) + && par.getInset(0)->rowFlags() & Inset::Display) && (!(tclass.isDefaultLayout(par.layout()) || tclass.isPlainLayout(par.layout())) || buffer.params().paragraph_separation -- 2.39.2