更正: 在原文中,我写道浮动元素会全宽显示。这是一个错误;就像用 创建的“flexi-insets”一样,InsetLayout
它们只有包含多行时才会全宽显示。因此,解决方法也无法按预期工作。
LyX 中有一些内置布局,Resources/layouts/stdlayouts.inc
插入后会填充编辑器的整个宽度。此行为适用于原型布局Box
和Box:<SpecificName>
布局系列。浮动也适用类似的行为。
我想定义一个将段落包含在widetext
环境中的本地布局。布局
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
这样做,但在 LyX 中,插图的显示宽度仅等于其内容的宽度——这不能很好地反映实际环境。我希望我的插图以框和浮动的样式显示,而不是以下任一样式:框总是包括一个小页面环境(这是不受欢迎的),并且浮动会导致序言发生不良变化,除非被黑客抑制(因此可能会在 LyX 的未来版本中中断)。
作为一种解决方法,我正在使用布局
Float
Type widetext
GuiName widetext
IsPredefined true
End
抑制序言中的条目IsPredefine
,与定义相冲突widetext
。然后,插入内容列在插入 → 浮动结果如下
并且在两种情况下编译的行为都是正确的。
但是,有没有一个干净的解决方案可以在不使用浮动黑客的情况下获得所需的行为?
答案1
据我所知,对于 Flex 插图来说这是不可能的。
查看源代码,我们发现 Inset.h 有以下内容
/// Is the width forced to some value?
virtual bool hasFixedWidth() const { return false; }
在 InsetFlex 的继承链中,此成员函数从未被覆盖。
盒子有以下内容(参见InsetBox.cpp):
bool InsetBox::hasFixedWidth() const
{
return !params_.width.empty();
}
如果将该返回更改为return false;
,那么它们也不会具有您所谈论的完整页面宽度。
请注意,当我将您的定义复制/粘贴到文档>设置>本地布局中时,我在终端上得到以下输出:
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
您可能想要纠正这些错误。
最后,请注意,我对 LyX 布局经验不多,因此以上任何内容都可能不准确。您应该加入我们的邮件列表[电子邮件保护]并在那里发布更多问题。那里的专家比我知道的更多。