View Issue Details

IDProjectCategoryView StatusLast Update
0017869ScribusStylespublic2026-07-11 10:01
Reporterqirat Assigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
PlatformLinuxOSFedora WorkstationOS Version44
Product Version1.7.4.svn 
Summary0017869: Previous paragraph style should be retained on backspace
DescriptionWhile pressing backspace, the para that is becoming a part of the previous para should assume the para style of the previous para, and not vice versa.

See the attached clip.
PARA2 should assume the para style of PARA1, and not the other way around.

Attaching a .sla file for your convenience.
Steps To ReproduceAt the start of PARA2, press backspace.
Additional InformationI think it is related to 0009883
TagsNo tags attached.
Attached Files
previous_style_on_backspace.sla (20,628 bytes)   
<?xml version="1.0" encoding="UTF-8"?>
<SCRIBUSUTF8NEW Version="1.7.4.svn">
    <Document PageCount="1" PageWidth="576" PageHeight="828" BorderLeft="36" BorderRight="36" BorderTop="36" BorderBottom="36" MarginPreset="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" PageOrientation="0" PageSize="Custom" FirstPageNumber="1" PagePositioning="1" BindingDirection="0" IsRTL="0" AutomaticTextFrameColumnCount="1" AutomaticTextFrameColumnGap="11" UnitIndex="2" FontFace="EB Garamond Regular" FontSize="12" TextColumnCount="1" TextColumnGap="0" TabFillCharacter="" TabWidth="36" TextDistanceLeft="0" TextDistanceRight="0" TextDistanceBottom="0" TextDistanceTop="0" FirstLineOffset="1" DocumentInfoAuthor="" DocumentInfoComments="" DocumentInfoKeywords="" DocumentInfoPublisher="" DocumentInfoDate="" DocumentInfoType="" DocumentInfoFormat="" DocumentInfoIdentifier="" DocumentInfoSource="" DocumentInfoLanguage="" DocumentInfoRelation="" DocumentInfoCoverage="" DocumentInfoRights="" DocumentInfoContributors="" DocumentInfoTitle="" DocumentInfoSubject="" SuperScriptDisplacement="33" SuperScriptScaling="66" SubScriptDisplacement="33" SubScriptScaling="66" SmallCapsScaling="75" BaselineGridSpacing="15.6" BaselineGridOffset="0" AutoLineSpacingPct="100" UnderlinePosition="-1" UnderlineWidth="-1" StrikeThruPosition="-1" StrikeThruWidth="-1" GroupCounter="1" DocumentHasCMS="0" SoftProofOn="0" SoftProofFullOn="0" ColorManagementActive="0" GamutCheck="0" BlackPoint="1" DefaultPrinterProfile="ISO Coated v2 300% (basICColor)" DefaultImageRGBProfile="sRGB display profile (ICC v2.2)" DefaultImageCMYKProfile="ISO Coated v2 300% (basICColor)" DefaultSolidColorRGBProfile="sRGB display profile (ICC v2.2)" DefaultSolidColorCMYKProfile="ISO Coated v2 300% (basICColor)" DefaultIntentColors="1" DefaultIntentImages="0" ActiveLayer="0" Language="en_GB" AutomaticHyphenation="1" AutomaticHyphenationCheck="1" GuideLock="0" SnapToGuides="0" SnapToGrid="0" SnapToItems="0" MinorGridSpacing="18" MajorGridSpacing="72" ShowGrid="0" ShowGuides="1" ShowColumnBorders="1" ShowFrames="1" ShowControls="0" ShowTableCellFrames="0" ShowLayerMarkers="0" ShowMargins="1" ShowBaselineGrid="0" ShowImages="1" ShowLinks="0" RulerMode="1" ShowRulers="1" ShowBleed="1" RulerXOffset="0" RulerYOffset="0" GuideRadius="10" GrabRadius="4" PolygonCorners="4" PolygonFactor="0.502" PolygonRotation="0" PolygonInnerRotation="0" PolygonCurvature="0" PolygonOuterCurvature="0" PolygonUseFactor="0" ArcStartAngle="30" ArcSweepAngle="300" SpiralStartAngle="0" SpiralEndAngle="1080" SpiralFactor="1.2" AutoSave="1" AutoSaveTime="600000" AutoSaveCount="1" AutoSaveKeep="0" AutoSaveInDocumentDirectory="0" AutoSaveDirectory="/home/buttar/x/xdump" ScratchBottom="18" ScratchLeft="108" ScratchRight="108" ScratchTop="18" GapHorizontal="0" GapVertical="36" LineStartArrow="0" LineEndArrow="0" ShapeLineColor="None" ShapeFillColor="Cyan" LineColor="Black" TextColor="Black" TextStrokeColor="Black" TextBackgroundColor="None" TextLineColor="None" TextBackgroundColorShade="100" TextLineColorShade="100" TextColorShade="100" TextStrokeColorShade="100" ShapeLineStyle="1" LineStyle="1" ShapeLineWidth="1" LineWidth="1" ShapeLineColorShade="100" LineColorShade="100" ShapeFillColorShade="100" ImageFillColor="None" ImageFillColorShade="100" ImageStrokeColor="None" ImageStrokeColorShade="100" ImageScaleX="1" ImageScaleY="1" ImageScaleType="1" ImageAspectRatio="1" ImageUseEmbeddedPath="0" ImageLowResType="1" DisplayOffsetX="9" DisplayOffsetY="9" RotationConstrainAngle="15" MinorGridColor="#00ff00" MajorGridColor="#00ff00" GuidesColor="#000080" BaselineGridColor="#c0c0c0" RenderStack="2 1 4 3 0" GridType="0" PageColor="#ffffff" MarginColor="#813d9c" ShowMarginsFilled="0" CurrentProfile="PDF 1.6" CalligraphicPenFillColor="Black" CalligraphicPenLineColor="Black" CalligraphicPenFillColorShade="100" CalligraphicPenLineColorShade="100" CalligraphicPenLineWidth="1" CalligraphicPenAngle="0" CalligraphicPenWidth="10" CalligraphicPenStyle="1">
        <CheckProfile Name="PDF 1.3" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="0"/>
        <CheckProfile Name="PDF 1.4" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <CheckProfile Name="PDF 1.5" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <CheckProfile Name="PDF 1.6" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="0" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <CheckProfile Name="PDF/X-1a" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="1" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="1" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <CheckProfile Name="PDF/X-3" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="1" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="1" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <CheckProfile Name="PDF/X-4" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="299" MaximumResolution="600" CheckAnnotations="1" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="1" CheckFontNotEmbedded="1" CheckFontIsOpenType="0" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <CheckProfile Name="PostScript" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="0" CheckFontIsOpenType="0" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
        <Color Name="Black" Space="CMYK" C="0" M="0" Y="0" K="100"/>
        <Color Name="Blue" Space="RGB" R="0" G="0" B="255"/>
        <Color Name="Cool Black" Space="CMYK" C="60" M="0" Y="0" K="100"/>
        <Color Name="Cyan" Space="CMYK" C="100" M="0" Y="0" K="0"/>
        <Color Name="Green" Space="RGB" R="0" G="255" B="0"/>
        <Color Name="Magenta" Space="CMYK" C="0" M="100" Y="0" K="0"/>
        <Color Name="Red" Space="RGB" R="255" G="0" B="0"/>
        <Color Name="Registration" Space="CMYK" C="100" M="100" Y="100" K="100" Register="1"/>
        <Color Name="Rich Black" Space="CMYK" C="60" M="40" Y="40" K="100"/>
        <Color Name="Warm Black" Space="CMYK" C="0" M="60" Y="29.8039215686275" K="100"/>
        <Color Name="White" Space="CMYK" C="0" M="0" Y="0" K="0"/>
        <Color Name="Yellow" Space="CMYK" C="0" M="0" Y="100" K="0"/>
        <Hyphenator/>
        <CharacterStyle Name="Default Character Style" DefaultStyle="1" Font="EB Garamond Regular" FontSize="12" FontFeatures="" Features="inherit" FontColor="Black" FillShade="100" HyphenWordMinimum="3" StrokeColor="Black" BackgroundColor="None" BackgroundShade="100" StrokeShade="100" TextShadowXOffset="5" TextShadowYOffset="-5" TextOutlineWidth="1" TextUnderlineOffset="-0.1" TextUnderlineWidth="-0.1" TextStrikeThroughOffset="-0.1" TextStrikeThroughWidth="-0.1" ScaleHorizontal="100" ScaleVertical="100" BaselineOffset="0" Kerning="0" Language="en_GB"/>
        <ParagraphStyle Name="Default Paragraph Style" DefaultStyle="1" Alignment="0" Direction="0" LineSpacingMode="0" LineSpacing="15" LeftMargin="0" RightMargin="0" FirstIndent="18" GapBefore="0" GapAfter="0" ParagraphEffectOffset="0" HasDropCap="0" DropCapLines="2" Bullet="0" Numeration="0" HyphenConsecutiveLines="2" ParagraphBackgroundColor="None" ParagraphBackgroundColorShade="100"/>
        <ParagraphStyle Name="FIRST_PARA" Alignment="0" Direction="0" LineSpacingMode="0" LineSpacing="15" LeftMargin="0" RightMargin="0" FirstIndent="0" GapBefore="0" GapAfter="0" ParagraphEffectOffset="0" HasDropCap="0" DropCapLines="2" Bullet="0" Numeration="0" HyphenConsecutiveLines="2" ParagraphBackgroundColor="None" ParagraphBackgroundColorShade="100"/>
        <TableStyle Name="Default Table Style" DefaultStyle="1" FillColor="None" FillShade="100">
            <TableBorderLeft>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderLeft>
            <TableBorderRight>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderRight>
            <TableBorderTop>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderTop>
            <TableBorderBottom>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderBottom>
        </TableStyle>
        <CellStyle Name="Default Cell Style" DefaultStyle="1" FillColor="None" FillShade="100" LeftPadding="1" RightPadding="1" TopPadding="1" BottomPadding="1">
            <TableBorderLeft>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderLeft>
            <TableBorderRight>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderRight>
            <TableBorderTop>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderTop>
            <TableBorderBottom>
                <TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
            </TableBorderBottom>
        </CellStyle>
        <Layers Number="0" Level="0" Name="Background" IsViewable="1" IsPrintable="1" IsEditable="1" IsSelectable="0" FlowControl="1" Transparency="1" BlendMode="0" OutlineMode="0" LayerColor="#000000"/>
        <Printer firstUse="1" toFile="0" useAltPrintCommand="0" outputSeparations="0" useSpotColors="1" useColor="1" mirrorH="0" mirrorV="0" useICC="0" doGCR="0" doClip="0" setDevParam="0" useDocBleeds="1" cropMarks="0" bleedMarks="0" registrationMarks="0" colorMarks="0" includePDFMarks="1" PSLevel="3" PrintEngine="3" markLength="20.0016" markOffset="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" printer="File" filename="" separationName="All" printerCommand=""/>
        <PDF firstUse="1" Thumbnails="0" Articles="0" Bookmarks="0" Compress="1" CMethod="0" Quality="0" EmbedPDF="0" MirrorH="0" MirrorV="0" Clip="0" rangeSel="0" rangeTxt="" RotateDeg="0" PresentMode="0" RecalcPic="1" FontEmbedding="0" Grayscale="0" RGBMode="0" UseProfiles="0" UseProfiles2="0" Binding="0" PicRes="600" Resolution="300" Version="16" Intent="1" Intent2="0" SolidP="sRGB display profile (ICC v2.2)" ImageP="sRGB display profile (ICC v2.2)" PrintP="ISO Coated v2 300% (basICColor)" InfoString="" BTop="0" BLeft="0" BRight="0" BBottom="0" useDocBleeds="1" cropMarks="0" bleedMarks="0" registrationMarks="0" colorMarks="0" docInfoMarks="0" markLength="18" markOffset="0" ImagePr="0" PassOwner="" PassUser="" Permissions="-4" Encrypt="0" UseLayers="0" UseLpi="0" UseSpotColors="1" doMultiFile="0" displayBookmarks="0" displayFullscreen="0" displayLayers="0" displayThumbs="0" hideMenuBar="0" hideToolBar="0" fitWindow="0" openAfterExport="0" PageLayout="0" openAction="">
            <LPI Color="Black" Frequency="133" Angle="45" SpotFunction="3"/>
            <LPI Color="Cyan" Frequency="133" Angle="105" SpotFunction="3"/>
            <LPI Color="Magenta" Frequency="133" Angle="75" SpotFunction="3"/>
            <LPI Color="Yellow" Frequency="133" Angle="90" SpotFunction="3"/>
        </PDF>
        <DocItemAttributes/>
        <Indexes/>
        <TablesOfContents/>
        <NotesStyles>
            <notesStyle Name="Default" Start="1" Endnotes="0" Type="Type_1_2_3" Range="0" Prefix="" Suffix=")" AutoHeight="1" AutoWidth="1" AutoRemove="1" AutoWeld="1" SuperNote="1" SuperMaster="1" MarksStyle="" NotesStyle=""/>
        </NotesStyles>
        <OpticalMarginSets>
            <Set Id="preset_0" Type="preset" Name="Default">
                <Rules>
                    <Rule Left="0" Right="0.5" Unit="7" Characters="U+003A,U+003B,U+2013,U+2033"/>
                    <Rule Left="0" Right="0.75" Unit="7" Characters="U+002C,U+002D,U+002E,U+2010,U+2032"/>
                    <Rule Left="0.25" Right="0.25" Unit="7" Characters="U+2014"/>
                    <Rule Left="0.5" Right="0" Unit="7" Characters="U+2036"/>
                    <Rule Left="0.5" Right="0.5" Unit="7" Characters="U+0022,U+0028,U+0029,U+005B,U+005D,U+00AB,U+00BB,U+201C,U+201D,U+201E,U+201F"/>
                    <Rule Left="0.75" Right="0" Unit="7" Characters="U+2035"/>
                    <Rule Left="0.75" Right="0.75" Unit="7" Characters="U+0027,U+002A,U+0060,U+007E,U+00B4,U+2018,U+2019,U+201A,U+201B,U+2039,U+203A"/>
                </Rules>
            </Set>
        </OpticalMarginSets>
        <PageSets>
            <Set Name="Single Page" FirstPage="0" Rows="1" Columns="1"/>
            <Set Name="Facing Pages" FirstPage="1" Rows="1" Columns="2">
                <PageNames Name="Left Page"/>
                <PageNames Name="Right Page"/>
            </Set>
            <Set Name="3-Fold" FirstPage="0" Rows="1" Columns="3">
                <PageNames Name="Left Page"/>
                <PageNames Name="Middle"/>
                <PageNames Name="Right Page"/>
            </Set>
            <Set Name="4-Fold" FirstPage="0" Rows="1" Columns="4">
                <PageNames Name="Left Page"/>
                <PageNames Name="Middle Left"/>
                <PageNames Name="Middle Right"/>
                <PageNames Name="Right Page"/>
            </Set>
        </PageSets>
        <Sections>
            <Section Number="0" Name="Section 1" From="0" To="0" Type="Type_1_2_3" Start="1" Reversed="0" Active="1" FillChar="0" FieldWidth="0"/>
        </Sections>
        <MasterPage PageXPosition="108" PageYPosition="18" PageWidth="576" PageHeight="828" BorderLeft="36" BorderRight="36" BorderTop="36" BorderBottom="36" PageNumber="0" PageName="Normal Left" MasterPageName="" Size="Custom" Orientation="0" LeftPage="1" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
        <MasterPage PageXPosition="108" PageYPosition="18" PageWidth="576" PageHeight="828" BorderLeft="36" BorderRight="36" BorderTop="36" BorderBottom="36" PageNumber="1" PageName="Normal Right" MasterPageName="" Size="Custom" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
        <Page PageXPosition="684" PageYPosition="18" PageWidth="576" PageHeight="828" BorderLeft="36" BorderRight="36" BorderTop="36" BorderBottom="36" PageNumber="0" PageName="" MasterPageName="Normal Right" Size="Custom" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
        <PageObject XPosition="720" YPosition="54" OwnPage="0" ItemID="483980547" ItemType="4" Width="504" Height="756" FrameType="0" ClipEdited="0" LineWidth="1" LinePenStyle="1" ImageScaleX="1" ImageScaleY="1" ImageOffsetX="0" ImageOffsetY="0" ImageRotation="0" ImageVisible="1" ImageScaleType="1" ImageRatio="1" Columns="1" ColumnGap="0" AutomaticTextFrame="0" TextToFrameDistanceLeft="0" TextToFrameDistanceTop="0" TextToFrameDistanceBottom="0" TextToFrameDistanceRight="0" VerticalAlignment="0" FirstLineOffset="1" PathTextShowPath="0" PathTextDistanceFromPath="0" TextPathType="0" TextPathFlipped="0" Path="M0 0 L504 0 L504 756 L0 756 L0 0 Z" ContourLinePath="M0 0 L504 0 L504 756 L0 756 L0 0 Z" gXpos="720" gYpos="54" gWidth="0" gHeight="0" Layer="0" NextItem="-1" BackItem="-1">
            <StoryText>
                <DefaultStyle/>
                <Content Chars="PARA1_May, ar­riv­ing at Vi­enna early next morn­ing; should have ar­rived at 6:46, but train was an hour late. Buda-Pesth seems a won­der­ful place, from the glimpse which I got of it from the train and the little I could walk through the streets. I feared to go very far from the sta­tion, as we had ar­rived late and would start as near the cor­rect time as pos­sible."/>
                <para Parent="FIRST_PARA"/>
                <Content Chars="PARA2_I read that every known su­per­sti­tion in the world is gathered into the horse­shoe of the Carpath­i­ans, as if it were the centre of some sort of ima­gin­at­ive whirl­pool; if so my stay may be very in­ter­est­ing. (Mem., I must ask the Count all about them.)"/>
                <para/>
                <para/>
                <Content Chars="PARA3_The wo­men looked pretty, ex­cept when you got near them, but they were very clumsy about the waist. They had all full white sleeves of some kind or other, and most of them had big belts with a lot of strips of some­thing flut­ter­ing from them like the dresses in a bal­let.PARA4_I had for break­fast more paprika, and a sort of por­ridge of maize flour which they said was &quot;mam­a­liga&quot;, and egg-plant stuffed with force­meat, a very ex­cel­lent dish, which they call &quot;im­pletata&quot;. (Mem., get re­cipe for this also.)"/>
                <trail Parent="FIRST_PARA"/>
            </StoryText>
        </PageObject>
    </Document>
</SCRIBUSUTF8NEW>
previous_style_on_backspace.sla (20,628 bytes)   
PatchNo

Activities

qirat

2026-07-03 12:14

reporter   ~0053931

I understand that the PARA3 and PARA4 issue is the "Next Style" matter.

qirat

2026-07-08 08:57

reporter   ~0053989

I created this using an AI and it worked fine for me.
scribus-keep-left-paragraph-style-on-merge.patch (7,716 bytes)   
diff --git a/scribus/pageitem.cpp b/scribus/pageitem.cpp
index af8d4fd..6b5ec2b 100644
--- a/scribus/pageitem.cpp
+++ b/scribus/pageitem.cpp
@@ -7105,7 +7105,7 @@ void PageItem::restoreDeleteFrameText(SimpleState *ss, bool isUndo)
 
 void PageItem::restoreDeleteFrameParagraph(SimpleState *ss, bool isUndo)
 {
-	const auto *is = dynamic_cast<ScItemState<ParagraphStyle> *>(ss);
+	const auto *is = dynamic_cast<ScItemState<QPair<ParagraphStyle, ParagraphStyle> > *>(ss);
 	if (!is)
 	{
 		qFatal("PageItem::restoreDeleteFrameParagraph: dynamic cast failed");
@@ -7116,8 +7116,10 @@ void PageItem::restoreDeleteFrameParagraph(SimpleState *ss, bool isUndo)
 	itemText.deselectAll();
 	if (isUndo)
 	{
+		const QPair<ParagraphStyle, ParagraphStyle> styles = is->getItem();
 		itemText.insertChars(start, SpecialChars::PARSEP);
-		itemText.applyStyle(start, is->getItem());
+		itemText.applyStyle(start, styles.first);
+		itemText.applyStyle(start + 1, styles.second);
 		itemText.setCursorPosition(start + 1);
 		invalid = true;
 		invalidateLayout();
diff --git a/scribus/pageitem_textframe.cpp b/scribus/pageitem_textframe.cpp
index 1c5b95c..d5f0afc 100644
--- a/scribus/pageitem_textframe.cpp
+++ b/scribus/pageitem_textframe.cpp
@@ -27,6 +27,7 @@ for which a new license (GPL+exception) is in place.
 #include <QList>
 #include <QTransform>
 #include <QPalette>
+#include <QPair>
 #include <QPoint>
 #include <QPolygon>
 #include <QRegion>
@@ -4731,7 +4732,7 @@ void PageItem_TextFrame::deleteSelectedTextFromFrame(/*bool findNotes*/)
 		int lastPos = start;
 		CharStyle lastParent = itemText.charStyle(start);
 		UndoState* state = undoManager->getLastUndo();
-		ScItemState<ParagraphStyle> *ip = nullptr;
+		ScItemState<QPair<ParagraphStyle, ParagraphStyle> > *ip = nullptr;
 		ScItemState<CharStyle> *is = nullptr;
 		TransactionState *ts = nullptr;
 		bool added = false;
@@ -4869,11 +4870,11 @@ void PageItem_TextFrame::deleteSelectedTextFromFrame(/*bool findNotes*/)
 				UndoObject * undoTarget = this;
 				if (isNoteFrame())
 					undoTarget = m_Doc;
-				ip = new ScItemState<ParagraphStyle>(Um::DeleteText, "", Um::IDelete);
+				ip = new ScItemState<QPair<ParagraphStyle, ParagraphStyle> >(Um::DeleteText, "", Um::IDelete);
 				ip->set("DELETE_FRAMEPARA");
 				ip->set("ETEA", QString("delete_framepara"));
 				ip->set("START", start);
-				ip->setItem(itemText.paragraphStyle(i));
+				ip->setItem(qMakePair(itemText.paragraphStyle(i), itemText.paragraphStyle(i + 1)));
 				lastPos = i + 1;
 				if (lastPos < itemText.length())
 					lastParent = itemText.charStyle(lastPos);
diff --git a/scribus/tests/testStoryText.cpp b/scribus/tests/testStoryText.cpp
index a6ede8b..91411e8 100644
--- a/scribus/tests/testStoryText.cpp
+++ b/scribus/tests/testStoryText.cpp
@@ -82,6 +82,42 @@ void TestStoryText::removePars()
 			 QString("0123456789") + SpecialChars::PARSEP + QString("abcdefghijklmnopqrstuVWXYZ"));
 }
 
+void TestStoryText::removeParSepKeepsLeftParagraphStyle()
+{
+	StoryText story;
+	story.insertChars(0, QString("One") + SpecialChars::PARSEP + QString("Two"));
+
+	ParagraphStyle style1;
+	style1.setAlignment(ParagraphStyle::RightAligned);
+	ParagraphStyle style2;
+	style2.setAlignment(ParagraphStyle::Centered);
+
+	story.applyStyle(0, style1);
+	story.applyStyle(4, style2);
+	story.removeChars(3, 1);
+
+	QCOMPARE(story.text(0, story.length()), QString("OneTwo"));
+	QCOMPARE(static_cast<int>(story.paragraphStyle(0).alignment()), static_cast<int>(ParagraphStyle::RightAligned));
+}
+
+void TestStoryText::removeWholeLeftParagraphKeepsRightParagraphStyle()
+{
+	StoryText story;
+	story.insertChars(0, QString("One") + SpecialChars::PARSEP + QString("Two"));
+
+	ParagraphStyle style1;
+	style1.setAlignment(ParagraphStyle::RightAligned);
+	ParagraphStyle style2;
+	style2.setAlignment(ParagraphStyle::Centered);
+
+	story.applyStyle(0, style1);
+	story.applyStyle(4, style2);
+	story.removeChars(0, 4);
+
+	QCOMPARE(story.text(0, story.length()), QString("Two"));
+	QCOMPARE(static_cast<int>(story.paragraphStyle(0).alignment()), static_cast<int>(ParagraphStyle::Centered));
+}
+
 void TestStoryText::applyCharStyle()
 {
 	StoryText story;
diff --git a/scribus/tests/testStoryText.h b/scribus/tests/testStoryText.h
index 6558752..104dcff 100644
--- a/scribus/tests/testStoryText.h
+++ b/scribus/tests/testStoryText.h
@@ -25,6 +25,8 @@ private slots:
 	void insertPar();
 	void removePar();
 	void removePars();
+	void removeParSepKeepsLeftParagraphStyle();
+	void removeWholeLeftParagraphKeepsRightParagraphStyle();
 	void applyCharStyle();
 	void removeCharStyle();
 };
diff --git a/scribus/text/storytext.cpp b/scribus/text/storytext.cpp
index 4214bb5..04d70e9 100644
--- a/scribus/text/storytext.cpp
+++ b/scribus/text/storytext.cpp
@@ -549,8 +549,12 @@ void StoryText::insert(int pos, const StoryText& other, bool onlySelection)
 	 need to remove the ParagraphStyle structure and replace all pointers
 	 to it...
  */
-void StoryText::removeParSep(int pos)
+void StoryText::removeParSep(int pos, bool preserveParagraphStyle)
 {
+	ParagraphStyle preservedStyle;
+	if (preserveParagraphStyle)
+		preservedStyle = paragraphStyle(pos);
+
 	ScText* it = item(pos);
 	if (it->parstyle)
 	{
@@ -560,7 +564,33 @@ void StoryText::removeParSep(int pos)
 	// demote this parsep so the assert code in replaceCharStyleContextInParagraph()
 	// doesn't choke:
 	it->ch = QChar();
-	d->replaceCharStyleContextInParagraph(pos, paragraphStyle(pos+1).charStyleContext());
+
+	if (preserveParagraphStyle)
+	{
+		int stylePos = pos + 1;
+		while (stylePos < length() && d->at(stylePos)->ch != SpecialChars::PARSEP)
+			++stylePos;
+
+		if (stylePos < length())
+		{
+			if (!d->at(stylePos)->parstyle)
+			{
+				d->at(stylePos)->parstyle = new ParagraphStyle();
+				d->at(stylePos)->parstyle->setContext(&d->pstyleContext);
+			}
+			*d->at(stylePos)->parstyle = preservedStyle;
+			d->at(stylePos)->parstyle->setContext(&d->pstyleContext);
+			d->replaceCharStyleContextInParagraph(stylePos, d->at(stylePos)->parstyle->charStyleContext());
+		}
+		else
+		{
+			d->trailingStyle = preservedStyle;
+			d->trailingStyle.setContext(&d->pstyleContext);
+			d->replaceCharStyleContextInParagraph(length(), d->trailingStyle.charStyleContext());
+		}
+	}
+	else
+		d->replaceCharStyleContextInParagraph(pos, paragraphStyle(pos + 1).charStyleContext());
 }
 
 /**
@@ -673,7 +703,20 @@ void StoryText::removeChars(int pos, uint len)
 	{
 		ScText *it = d->at(i);
 		if (it->ch == SpecialChars::PARSEP)
-			removeParSep(i);
+		{
+			bool preserveParagraphStyle = false;
+			for (int j = i - 1; j >= 0; --j)
+			{
+				if (d->at(j)->ch == SpecialChars::PARSEP)
+					break;
+				if (j < pos)
+				{
+					preserveParagraphStyle = true;
+					break;
+				}
+			}
+			removeParSep(i, preserveParagraphStyle);
+		}
 		if ((it->ch == SpecialChars::OBJECT) && (it->mark != nullptr))
 			d->marksCount--;
 		d->takeAt(i);
@@ -851,7 +894,7 @@ void StoryText::replaceChar(int pos, QChar ch)
 	uint oldMarksCount = d->marksCount;
 	
 	if (item->ch == SpecialChars::PARSEP)
-		removeParSep(pos);
+		removeParSep(pos, pos > 0 && text(pos - 1) != SpecialChars::PARSEP);
 	if ((item->ch == SpecialChars::OBJECT) && (item->mark != nullptr))
 		d->marksCount--;
 	item->ch = ch;
diff --git a/scribus/text/storytext.h b/scribus/text/storytext.h
index 7920d56..ef49a29 100644
--- a/scribus/text/storytext.h
+++ b/scribus/text/storytext.h
@@ -335,7 +335,7 @@ private:
 	
 	/// mark these runs as invalid, ie. need itemize and shaping
 	void invalidate(int firstRun, int lastRun);
-	void removeParSep(int pos);
+	void removeParSep(int pos, bool preserveParagraphStyle = false);
 	void insertParSep(int pos);
 
 	// private:

qirat

2026-07-08 09:08

reporter   ~0053990

Here is more context of how it went.
context-for-keep-left-paragraph-style-on-merge.md (5,501 bytes)   
#THE PROMPT:
This file (uploaded) is the Scribus source code. Analyse this deeply. How much code change the following fix need:

When there are two paragraphs PARA1 and PARA2. PARA1 one is given a paragraph style STYLE1 and PARA2 is given STYLE2. When you put cursor in the start of the PARA2 and press backspace (so that PARA2 now merges with PARA1), PARA1 now takes the STYLE2, it should be so that the new PARA resulting from the merger of the two) should stay in STYLE1 instead. After all PARA2 came and mergedd with PARA1. PARA1 did not go anywhere, it's style should also not change.

#AI EXPLAINED:

I analysed the uploaded Scribus source. This is not a large feature. It is a small-to-medium text-model bug fix, but it must be done carefully because of undo/redo.

The bug is mainly here:

scribus/text/storytext.cpp

Scribus stores paragraph style on the paragraph separator after the paragraph:

PARA1 [PARSEP carrying STYLE1] PARA2 [STYLE2 / trailingStyle]

When Backspace is pressed at the start of PARA2, Scribus deletes the PARSEP between them. That separator is also where STYLE1 lives. So after deletion, the merged paragraph is left using STYLE2.

##Current flow:

PageItem_TextFrame::handleModeEditKey()
  Backspace
    selects previous character
    deleteSelectedTextFromFrame()

PageItem_TextFrame::deleteSelectedTextFromFrame()
  itemText.removeSelection()

StoryText::removeSelection()
  removeChars()

StoryText::removeChars()
  if char is PARSEP:
      removeParSep()

StoryText::removeParSep()
  deletes paragraph style attached to that PARSEP
  then reassigns char context from paragraphStyle(pos + 1)

That last part is the core problem: paragraphStyle(pos + 1) is effectively the style of the right paragraph, i.e. STYLE2.

##Code change estimate
###Bad/simple fix

A very small patch could be made in:

scribus/pageitem_textframe.cpp

around the Backspace handler:

case Qt::Key_Backspace:

Capture STYLE1 before deleting the separator, then apply it after deletion.

That would be around 10–20 lines.

But I would not recommend that as the real fix, because undo/redo would likely become wrong. Undo currently relies on the old behaviour where the right paragraph’s style survives after deletion.

###Proper fix

A proper fix should be in the text model, not just the keyboard handler.

Expected files touched:

scribus/text/storytext.cpp
scribus/text/storytext.h
scribus/pageitem_textframe.cpp
scribus/pageitem.cpp
scribus/tests/testStoryText.cpp
scribus/tests/testStoryText.h

Realistic size:

Core code:       ~50–70 changed lines
Tests included:  ~85–100 changed lines total

So: small patch, but central text-model logic.

###What the proper fix should do

When deleting a paragraph separator:

PARA1 STYLE1 + PARA2 STYLE2

the text model should detect whether the deletion is a real merge:

PARA1PARA2

If yes, move/preserve the left paragraph style onto the resulting paragraph:

merged paragraph keeps STYLE1

But it must not blindly preserve the left style in all cases. For example, if the user selects and deletes the whole first paragraph:

[PARA1 + separator deleted] PARA2

then PARA2 should probably keep STYLE2, not inherit deleted STYLE1.

So the fix needs this distinction:

Deleting only the separator / merging into left paragraph:
    keep left style

Deleting the whole left paragraph:
    keep right style

###Undo/redo issue

This is why the patch is not just 10 lines.

Currently, when deleting a paragraph separator, undo stores only the deleted separator’s paragraph style:

ip->setItem(itemText.paragraphStyle(i));

That is not enough after changing the merge behaviour. A correct undo needs to know both:

left paragraph style  = STYLE1
right paragraph style = STYLE2

So the undo state for DELETE_FRAMEPARA should store both styles, probably as something like:

QPair<ParagraphStyle, ParagraphStyle>

Then undo can restore:

PARA1 -> STYLE1
PARA2 -> STYLE2

while redo again merges to:

PARA1PARA2 -> STYLE1
My verdict

This is a good candidate for a clean developer patch.

It is not a UI feature and does not need large refactoring. The main change is in StoryText::removeParSep() / StoryText::removeChars(), with undo support in deleteSelectedTextFromFrame() and restoreDeleteFrameParagraph().

So:

When deleting a paragraph separator as a merge operation, Scribus currently drops the left paragraph’s style because the style is stored on the separator being removed. The merged paragraph should retain the left paragraph’s style. The fix should preserve the left style only for true merge deletions and update DELETE_FRAMEPARA undo data so undo restores both original paragraph styles.





#ASKED IT TO WRITE A PROPER PATCH AND IT CREATED ONE:


##What it changes:

scribus/text/storytext.cpp
scribus/text/storytext.h
scribus/pageitem_textframe.cpp
scribus/pageitem.cpp
scribus/tests/testStoryText.cpp
scribus/tests/testStoryText.h

##Core behaviour fixed:

PARA1 STYLE1 + PARA2 STYLE2
Backspace at start of PARA2
Merged paragraph keeps STYLE1

Undo/redo is handled by changing DELETE_FRAMEPARA undo data from storing only one ParagraphStyle to storing:

QPair<ParagraphStyle, ParagraphStyle>

##So undo can restore:

left paragraph  -> STYLE1
right paragraph -> STYLE2

The patch also adds two StoryText tests:

removeParSepKeepsLeftParagraphStyle()
removeWholeLeftParagraphKeepsRightParagraphStyle()

I did not compile full Scribus here, but the patch is structurally clean and applies cleanly to the uploaded source.

qirat

2026-07-08 09:13

reporter   ~0053991

The result:

qirat

2026-07-08 09:16

reporter   ~0053992

It seems Undo is not perfect but at least it is not broken :)

qirat

2026-07-11 09:59

reporter   ~0054021

Undo/redo fixed.
keep-left-paragraph-style-on-merge-undo-fixed-v2.patch (9,071 bytes)   
diff --git a/scribus/pageitem.cpp b/scribus/pageitem.cpp
index af8d4fd..8f0c9a1 100644
--- a/scribus/pageitem.cpp
+++ b/scribus/pageitem.cpp
@@ -7105,7 +7105,7 @@ void PageItem::restoreDeleteFrameText(SimpleState *ss, bool isUndo)
 
 void PageItem::restoreDeleteFrameParagraph(SimpleState *ss, bool isUndo)
 {
-	const auto *is = dynamic_cast<ScItemState<ParagraphStyle> *>(ss);
+	const auto *is = dynamic_cast<ScItemState<QPair<ParagraphStyle, ParagraphStyle> > *>(ss);
 	if (!is)
 	{
 		qFatal("PageItem::restoreDeleteFrameParagraph: dynamic cast failed");
@@ -7116,8 +7116,16 @@ void PageItem::restoreDeleteFrameParagraph(SimpleState *ss, bool isUndo)
 	itemText.deselectAll();
 	if (isUndo)
 	{
+		const QPair<ParagraphStyle, ParagraphStyle> styles = is->getItem();
 		itemText.insertChars(start, SpecialChars::PARSEP);
-		itemText.applyStyle(start, is->getItem());
+		// Restore the two paragraphs as exact styles, not incremental overlays.
+		// After the merge fix, the merged paragraph keeps the left style.  When
+		// undo inserts the separator again, the right paragraph initially inherits
+		// that left style, so applyStyle() can leave stale inherited/direct
+		// attributes behind.  setStyle() first removes the current paragraph style
+		// and then applies the saved one, restoring PARA1 and PARA2 independently.
+		itemText.setStyle(start, styles.first);
+		itemText.setStyle(start + 1, styles.second);
 		itemText.setCursorPosition(start + 1);
 		invalid = true;
 		invalidateLayout();
diff --git a/scribus/pageitem_textframe.cpp b/scribus/pageitem_textframe.cpp
index 1c5b95c..d5f0afc 100644
--- a/scribus/pageitem_textframe.cpp
+++ b/scribus/pageitem_textframe.cpp
@@ -27,6 +27,7 @@ for which a new license (GPL+exception) is in place.
 #include <QList>
 #include <QTransform>
 #include <QPalette>
+#include <QPair>
 #include <QPoint>
 #include <QPolygon>
 #include <QRegion>
@@ -4731,7 +4732,7 @@ void PageItem_TextFrame::deleteSelectedTextFromFrame(/*bool findNotes*/)
 		int lastPos = start;
 		CharStyle lastParent = itemText.charStyle(start);
 		UndoState* state = undoManager->getLastUndo();
-		ScItemState<ParagraphStyle> *ip = nullptr;
+		ScItemState<QPair<ParagraphStyle, ParagraphStyle> > *ip = nullptr;
 		ScItemState<CharStyle> *is = nullptr;
 		TransactionState *ts = nullptr;
 		bool added = false;
@@ -4869,11 +4870,11 @@ void PageItem_TextFrame::deleteSelectedTextFromFrame(/*bool findNotes*/)
 				UndoObject * undoTarget = this;
 				if (isNoteFrame())
 					undoTarget = m_Doc;
-				ip = new ScItemState<ParagraphStyle>(Um::DeleteText, "", Um::IDelete);
+				ip = new ScItemState<QPair<ParagraphStyle, ParagraphStyle> >(Um::DeleteText, "", Um::IDelete);
 				ip->set("DELETE_FRAMEPARA");
 				ip->set("ETEA", QString("delete_framepara"));
 				ip->set("START", start);
-				ip->setItem(itemText.paragraphStyle(i));
+				ip->setItem(qMakePair(itemText.paragraphStyle(i), itemText.paragraphStyle(i + 1)));
 				lastPos = i + 1;
 				if (lastPos < itemText.length())
 					lastParent = itemText.charStyle(lastPos);
diff --git a/scribus/tests/testStoryText.cpp b/scribus/tests/testStoryText.cpp
index a6ede8b..3b2a4cf 100644
--- a/scribus/tests/testStoryText.cpp
+++ b/scribus/tests/testStoryText.cpp
@@ -82,6 +82,64 @@ void TestStoryText::removePars()
 			 QString("0123456789") + SpecialChars::PARSEP + QString("abcdefghijklmnopqrstuVWXYZ"));
 }
 
+void TestStoryText::removeParSepKeepsLeftParagraphStyle()
+{
+	StoryText story;
+	story.insertChars(0, QString("One") + SpecialChars::PARSEP + QString("Two"));
+
+	ParagraphStyle style1;
+	style1.setAlignment(ParagraphStyle::RightAligned);
+	ParagraphStyle style2;
+	style2.setAlignment(ParagraphStyle::Centered);
+
+	story.applyStyle(0, style1);
+	story.applyStyle(4, style2);
+	story.removeChars(3, 1);
+
+	QCOMPARE(story.text(0, story.length()), QString("OneTwo"));
+	QCOMPARE(static_cast<int>(story.paragraphStyle(0).alignment()), static_cast<int>(ParagraphStyle::RightAligned));
+}
+
+void TestStoryText::removeWholeLeftParagraphKeepsRightParagraphStyle()
+{
+	StoryText story;
+	story.insertChars(0, QString("One") + SpecialChars::PARSEP + QString("Two"));
+
+	ParagraphStyle style1;
+	style1.setAlignment(ParagraphStyle::RightAligned);
+	ParagraphStyle style2;
+	style2.setAlignment(ParagraphStyle::Centered);
+
+	story.applyStyle(0, style1);
+	story.applyStyle(4, style2);
+	story.removeChars(0, 4);
+
+	QCOMPARE(story.text(0, story.length()), QString("Two"));
+	QCOMPARE(static_cast<int>(story.paragraphStyle(0).alignment()), static_cast<int>(ParagraphStyle::Centered));
+}
+
+void TestStoryText::restoreParSepRestoresRightParagraphStyle()
+{
+	StoryText story;
+	story.insertChars(0, QString("One") + SpecialChars::PARSEP + QString("Two"));
+
+	ParagraphStyle style1;
+	style1.setAlignment(ParagraphStyle::RightAligned);
+	ParagraphStyle style2;
+	style2.setAlignment(ParagraphStyle::Centered);
+
+	story.applyStyle(0, style1);
+	story.applyStyle(4, style2);
+	story.removeChars(3, 1);
+	story.insertChars(3, SpecialChars::PARSEP);
+	story.setStyle(3, style1);
+	story.setStyle(4, style2);
+
+	QCOMPARE(story.text(0, story.length()), QString("One") + SpecialChars::PARSEP + QString("Two"));
+	QCOMPARE(static_cast<int>(story.paragraphStyle(0).alignment()), static_cast<int>(ParagraphStyle::RightAligned));
+	QCOMPARE(static_cast<int>(story.paragraphStyle(4).alignment()), static_cast<int>(ParagraphStyle::Centered));
+}
+
 void TestStoryText::applyCharStyle()
 {
 	StoryText story;
diff --git a/scribus/tests/testStoryText.h b/scribus/tests/testStoryText.h
index 6558752..b1c6c2d 100644
--- a/scribus/tests/testStoryText.h
+++ b/scribus/tests/testStoryText.h
@@ -25,6 +25,9 @@ private slots:
 	void insertPar();
 	void removePar();
 	void removePars();
+	void removeParSepKeepsLeftParagraphStyle();
+	void removeWholeLeftParagraphKeepsRightParagraphStyle();
+	void restoreParSepRestoresRightParagraphStyle();
 	void applyCharStyle();
 	void removeCharStyle();
 };
diff --git a/scribus/text/storytext.cpp b/scribus/text/storytext.cpp
index 4214bb5..04d70e9 100644
--- a/scribus/text/storytext.cpp
+++ b/scribus/text/storytext.cpp
@@ -549,8 +549,12 @@ void StoryText::insert(int pos, const StoryText& other, bool onlySelection)
 	 need to remove the ParagraphStyle structure and replace all pointers
 	 to it...
  */
-void StoryText::removeParSep(int pos)
+void StoryText::removeParSep(int pos, bool preserveParagraphStyle)
 {
+	ParagraphStyle preservedStyle;
+	if (preserveParagraphStyle)
+		preservedStyle = paragraphStyle(pos);
+
 	ScText* it = item(pos);
 	if (it->parstyle)
 	{
@@ -560,7 +564,33 @@ void StoryText::removeParSep(int pos)
 	// demote this parsep so the assert code in replaceCharStyleContextInParagraph()
 	// doesn't choke:
 	it->ch = QChar();
-	d->replaceCharStyleContextInParagraph(pos, paragraphStyle(pos+1).charStyleContext());
+
+	if (preserveParagraphStyle)
+	{
+		int stylePos = pos + 1;
+		while (stylePos < length() && d->at(stylePos)->ch != SpecialChars::PARSEP)
+			++stylePos;
+
+		if (stylePos < length())
+		{
+			if (!d->at(stylePos)->parstyle)
+			{
+				d->at(stylePos)->parstyle = new ParagraphStyle();
+				d->at(stylePos)->parstyle->setContext(&d->pstyleContext);
+			}
+			*d->at(stylePos)->parstyle = preservedStyle;
+			d->at(stylePos)->parstyle->setContext(&d->pstyleContext);
+			d->replaceCharStyleContextInParagraph(stylePos, d->at(stylePos)->parstyle->charStyleContext());
+		}
+		else
+		{
+			d->trailingStyle = preservedStyle;
+			d->trailingStyle.setContext(&d->pstyleContext);
+			d->replaceCharStyleContextInParagraph(length(), d->trailingStyle.charStyleContext());
+		}
+	}
+	else
+		d->replaceCharStyleContextInParagraph(pos, paragraphStyle(pos + 1).charStyleContext());
 }
 
 /**
@@ -673,7 +703,20 @@ void StoryText::removeChars(int pos, uint len)
 	{
 		ScText *it = d->at(i);
 		if (it->ch == SpecialChars::PARSEP)
-			removeParSep(i);
+		{
+			bool preserveParagraphStyle = false;
+			for (int j = i - 1; j >= 0; --j)
+			{
+				if (d->at(j)->ch == SpecialChars::PARSEP)
+					break;
+				if (j < pos)
+				{
+					preserveParagraphStyle = true;
+					break;
+				}
+			}
+			removeParSep(i, preserveParagraphStyle);
+		}
 		if ((it->ch == SpecialChars::OBJECT) && (it->mark != nullptr))
 			d->marksCount--;
 		d->takeAt(i);
@@ -851,7 +894,7 @@ void StoryText::replaceChar(int pos, QChar ch)
 	uint oldMarksCount = d->marksCount;
 	
 	if (item->ch == SpecialChars::PARSEP)
-		removeParSep(pos);
+		removeParSep(pos, pos > 0 && text(pos - 1) != SpecialChars::PARSEP);
 	if ((item->ch == SpecialChars::OBJECT) && (item->mark != nullptr))
 		d->marksCount--;
 	item->ch = ch;
diff --git a/scribus/text/storytext.h b/scribus/text/storytext.h
index 7920d56..ef49a29 100644
--- a/scribus/text/storytext.h
+++ b/scribus/text/storytext.h
@@ -335,7 +335,7 @@ private:
 	
 	/// mark these runs as invalid, ie. need itemize and shaping
 	void invalidate(int firstRun, int lastRun);
-	void removeParSep(int pos);
+	void removeParSep(int pos, bool preserveParagraphStyle = false);
 	void insertParSep(int pos);
 
 	// private:

qirat

2026-07-11 10:01

reporter   ~0054022

Is issue 0011974 the same?

Issue History

Date Modified Username Field Change
2026-07-03 12:11 qirat New Issue
2026-07-03 12:11 qirat File Added: previous_style_on_backspace.mp4
2026-07-03 12:11 qirat File Added: previous_style_on_backspace.sla
2026-07-03 12:14 qirat Note Added: 0053931
2026-07-08 08:57 qirat Note Added: 0053989
2026-07-08 08:57 qirat File Added: scribus-keep-left-paragraph-style-on-merge.patch
2026-07-08 09:08 qirat Note Added: 0053990
2026-07-08 09:08 qirat File Added: context-for-keep-left-paragraph-style-on-merge.md
2026-07-08 09:13 qirat Note Added: 0053991
2026-07-08 09:13 qirat File Added: new_para_merge_patch_result.mp4
2026-07-08 09:16 qirat Note Added: 0053992
2026-07-11 09:59 qirat Note Added: 0054021
2026-07-11 09:59 qirat File Added: keep-left-paragraph-style-on-merge-undo-fixed-v2.patch
2026-07-11 09:59 qirat File Added: keep-left-style-backspace-undo-fix.mp4
2026-07-11 10:01 qirat Note Added: 0054022