Definieren eines Lyx-Inset, das im Editor immer die volle Zeilenbreite hat

Definieren eines Lyx-Inset, das im Editor immer die volle Zeilenbreite hat

Korrektur: Im Originaltext hatte ich geschrieben, dass Floats in voller Breite angezeigt werden. Das war ein Fehler; sie InsetLayoutwerden, genau wie die mit erstellten „Flexi-Insets“, nur dann in voller Breite angezeigt, wenn sie mehr als eine Zeile umfassen. Daher funktioniert auch der Workaround nicht wie vorgesehen.

In LyX gibt es einige integrierte Layouts, Resources/layouts/stdlayouts.incdie beim Einfügen die gesamte Breite des Editors ausfüllen. Dieses Verhalten gilt für das Prototyp-Layout Boxund die Box:<SpecificName>Layout-Familie. Ein ähnliches Verhalten gilt für Floats.

Ich wollte ein lokales Layout definieren, das einen Absatz in die widetextUmgebung einschließt. Das Layout

InsetLayout WideText 
    LyXType          Custom
    LabelString      WideText
    LatexType        environment
    LatexName        widetext
    Decoration       classic
    LabelFont        
        Color        blue
        Size         Small
    EndFont
    MultiPar         true
    OptionalArgs     0
    Preamble
        \RequirePackage{widetext}
    EndPreamble 
End

tut dies, aber in LyX wird das Inset nur so breit wie sein Inhalt angezeigt – was eine schlechte Darstellung der tatsächlichen Umgebung ist. Ich würde es vorziehen, wenn mein Inset im Stil von Boxen und Floats angezeigt würde, ohne eines von beiden zu sein: BoxenstetsFügen Sie eine Minipage-Umgebung hinzu (was unerwünscht ist) und Floats verursachen unerwünschte Änderungen an der Präambel, sofern sie nicht durch einen Hack unterdrückt werden (was daher in zukünftigen Versionen von LyX nicht mehr funktionieren kann).

Als Workaround verwende ich das Layout

Float
    Type         widetext
    GuiName      widetext
    IsPredefined true
End 

wobei IsPredefineein Eintrag in der Präambel unterdrückt wird, der mit der Definition der widetextUmgebung kollidiert. Der Einschub wird dann aufgelistet inEinfügen → FloatDie Ergebnisse sehen so aus

Widetext-Einfügung vs. Pseudo-Float und das kompilierte Verhalten ist in beiden Fällen korrekt.

Aber gibt es eine saubere Lösung, um das gewünschte Verhalten ohne den Float-Hack zu erreichen?

Antwort1

So wie ich das verstehe, ist dies bei Flex-Insets nicht möglich.

Wenn wir uns den Quellcode ansehen, sehen wir, dass Inset.h Folgendes hat

/// Is the width forced to some value?
virtual bool hasFixedWidth() const { return false; }

In der Vererbungskette zu InsetFlex wird diese Memberfunktion nie überschrieben.

Boxen haben Folgendes (siehe InsetBox.cpp):

bool InsetBox::hasFixedWidth() const
{
    return !params_.width.empty();
}

Wenn Sie diese Rückgabe in ändern return false;, haben sie auch nicht mehr die volle Seitenbreite, von der Sie sprechen.

Beachten Sie, dass ich beim Kopieren/Einfügen Ihrer Definition in Dokument > Einstellungen > Lokales Layout die folgende Ausgabe auf meinem Terminal erhalte:

insets/InsetLayout.cpp (206): Flex insets must have names of the form `Flex:<name>'.
This one has the name `WideText'
Ignoring LyXType declaration.
LyX: Unknown InsetLayout tag [around line 2 of file  current token: 'Custom' context: '']
LyX: Unknown InsetLayout tag [around line 11 of file  current token: 'OptionalArgs' context: '']
LyX: Unknown InsetLayout tag [around line 12 of file  current token: '0' context: '']
frontends/qt4/GuiDocument.cpp (571): Format 49
InsetLayout "Flex:WideText"
    LyXType          Custom
    LabelString      WideText
    LatexType        environment
    LatexName        widetext
    Decoration       classic
    LabelFont        
        Color        blue
        Size         Small
    EndFont
    MultiPar         true
    ResetArgs   1
    Preamble
        \RequirePackage{widetext}
    EndPreamble 
    ResetsFont true
End

Möglicherweise möchten Sie diese Fehler korrigieren.

Abschließend sei noch darauf hingewiesen, dass ich nur wenig Erfahrung mit Layouts in LyX habe, sodass die oben genannten Angaben falsch sein können. Sie sollten sich in unsere Mailingliste eintragen unter[email geschützt]und dort weitere Fragen stellen. Die Experten dort wissen mehr als ich.

verwandte Informationen