diff --git a/nw/core/tohtml.py b/nw/core/tohtml.py
index 3aa6f5fc..2434b55c 100644
--- a/nw/core/tohtml.py
+++ b/nw/core/tohtml.py
@@ -333,10 +333,12 @@ class ToHtml(Tokenizer):
textAlign = "justify" if self.doJustify else "left"
- theStyles.append("body {font-family: '%s'; font-size: %dpt}" % (
- self.textFont, self.textSize)
- )
- theStyles.append("p {text-align: %s;}" % textAlign)
+ theStyles.append("body {font-family: '%s'; font-size: %dpt;}" % (
+ self.textFont, self.textSize
+ ))
+ theStyles.append("p {text-align: %s; line-height: %d%%;}" % (
+ textAlign, round(100 * self.lineHeight)
+ ))
theStyles.append("h1, h2 {color: rgb(66, 113, 174);}")
theStyles.append("h3, h4 {color: rgb(50, 50, 50);}")
theStyles.append("h1, h2, h3, h4 {page-break-after: avoid;}")
diff --git a/nw/core/toodt.py b/nw/core/toodt.py
index ee83673c..b9cffc3c 100644
--- a/nw/core/toodt.py
+++ b/nw/core/toodt.py
@@ -194,23 +194,25 @@ class ToOdt(Tokenizer):
self._fSizeHead = f"{round(1.15 * self.textSize):d}pt"
self._fSizeText = f"{self.textSize:d}pt"
- self._mTopTitle = self._emToCm(self.marginTitle[0])
- self._mTopHead1 = self._emToCm(self.marginHead1[0])
- self._mTopHead2 = self._emToCm(self.marginHead2[0])
- self._mTopHead3 = self._emToCm(self.marginHead3[0])
- self._mTopHead4 = self._emToCm(self.marginHead4[0])
- self._mTopHead = self._emToCm(self.marginHead4[0])
- self._mTopText = self._emToCm(self.marginText[0])
- self._mTopMeta = self._emToCm(self.marginMeta[0])
+ mScale = self.lineHeight/1.15
- self._mBotTitle = self._emToCm(self.marginTitle[1])
- self._mBotHead1 = self._emToCm(self.marginHead1[1])
- self._mBotHead2 = self._emToCm(self.marginHead2[1])
- self._mBotHead3 = self._emToCm(self.marginHead3[1])
- self._mBotHead4 = self._emToCm(self.marginHead4[1])
- self._mBotHead = self._emToCm(self.marginHead4[1])
- self._mBotText = self._emToCm(self.marginText[1])
- self._mBotMeta = self._emToCm(self.marginMeta[1])
+ self._mTopTitle = self._emToCm(mScale * self.marginTitle[0])
+ self._mTopHead1 = self._emToCm(mScale * self.marginHead1[0])
+ self._mTopHead2 = self._emToCm(mScale * self.marginHead2[0])
+ self._mTopHead3 = self._emToCm(mScale * self.marginHead3[0])
+ self._mTopHead4 = self._emToCm(mScale * self.marginHead4[0])
+ self._mTopHead = self._emToCm(mScale * self.marginHead4[0])
+ self._mTopText = self._emToCm(mScale * self.marginText[0])
+ self._mTopMeta = self._emToCm(mScale * self.marginMeta[0])
+
+ self._mBotTitle = self._emToCm(mScale * self.marginTitle[1])
+ self._mBotHead1 = self._emToCm(mScale * self.marginHead1[1])
+ self._mBotHead2 = self._emToCm(mScale * self.marginHead2[1])
+ self._mBotHead3 = self._emToCm(mScale * self.marginHead3[1])
+ self._mBotHead4 = self._emToCm(mScale * self.marginHead4[1])
+ self._mBotHead = self._emToCm(mScale * self.marginHead4[1])
+ self._mBotText = self._emToCm(mScale * self.marginText[1])
+ self._mBotMeta = self._emToCm(mScale * self.marginMeta[1])
if self.colourHead:
self._colHead12 = "#2a6099"
diff --git a/nw/gui/build.py b/nw/gui/build.py
index 14ffa0d1..38fbd727 100644
--- a/nw/gui/build.py
+++ b/nw/gui/build.py
@@ -93,6 +93,9 @@ class GuiBuildNovel(QDialog):
self.docView = GuiBuildNovelDocView(self, self.theProject)
+ hS = self.theTheme.fontPixelSize
+ wS = 2*hS
+
# Title Formats
# =============
@@ -191,12 +194,12 @@ class GuiBuildNovel(QDialog):
self.titleForm.setColumnStretch(0, 0)
self.titleForm.setColumnStretch(1, 1)
- # Text Options
- # =============
+ # Font Options
+ # ============
- self.formatGroup = QGroupBox("Formatting Options", self)
- self.formatForm = QGridLayout(self)
- self.formatGroup.setLayout(self.formatForm)
+ self.fontGroup = QGroupBox("Font Options", self)
+ self.fontForm = QGridLayout(self)
+ self.fontGroup.setLayout(self.fontForm)
## Font Family
self.textFont = QLineEdit()
@@ -225,17 +228,7 @@ class GuiBuildNovel(QDialog):
self.lineHeight.setSingleStep(0.05)
self.lineHeight.setDecimals(2)
self.lineHeight.setValue(
- self.optState.getInt("GuiBuildNovel", "lineHeight", 1.15)
- )
-
- self.justifyText = QSwitch()
- self.justifyText.setChecked(
- self.optState.getBool("GuiBuildNovel", "justifyText", False)
- )
-
- self.noStyling = QSwitch()
- self.noStyling.setChecked(
- self.optState.getBool("GuiBuildNovel", "noStyling", False)
+ self.optState.getFloat("GuiBuildNovel", "lineHeight", 1.15)
)
# Dummy box due to QGridView and QLineEdit expand bug
@@ -248,45 +241,66 @@ class GuiBuildNovel(QDialog):
justifyLabel = QLabel("Justify text")
stylingLabel = QLabel("Disable styling")
- self.formatForm.addWidget(fontFamilyLabel, 0, 0, 1, 1, Qt.AlignLeft)
- self.formatForm.addLayout(self.boxFont, 0, 1, 1, 1, Qt.AlignRight)
- self.formatForm.addWidget(self.fontButton, 0, 2, 1, 1, Qt.AlignRight)
- self.formatForm.addWidget(fontSizeLabel, 1, 0, 1, 1, Qt.AlignLeft)
- self.formatForm.addWidget(self.textSize, 1, 1, 1, 2, Qt.AlignRight)
- self.formatForm.addWidget(lineHeightLabel, 2, 0, 1, 1, Qt.AlignLeft)
- self.formatForm.addWidget(self.lineHeight, 2, 1, 1, 2, Qt.AlignRight)
- self.formatForm.addWidget(justifyLabel, 3, 0, 1, 1, Qt.AlignLeft)
- self.formatForm.addWidget(self.justifyText, 3, 1, 1, 2, Qt.AlignRight)
- self.formatForm.addWidget(stylingLabel, 4, 0, 1, 1, Qt.AlignLeft)
- self.formatForm.addWidget(self.noStyling, 4, 1, 1, 2, Qt.AlignRight)
+ self.fontForm.addWidget(fontFamilyLabel, 0, 0, 1, 1, Qt.AlignLeft)
+ self.fontForm.addLayout(self.boxFont, 0, 1, 1, 1, Qt.AlignRight)
+ self.fontForm.addWidget(self.fontButton, 0, 2, 1, 1, Qt.AlignRight)
+ self.fontForm.addWidget(fontSizeLabel, 1, 0, 1, 1, Qt.AlignLeft)
+ self.fontForm.addWidget(self.textSize, 1, 1, 1, 2, Qt.AlignRight)
+ self.fontForm.addWidget(lineHeightLabel, 2, 0, 1, 1, Qt.AlignLeft)
+ self.fontForm.addWidget(self.lineHeight, 2, 1, 1, 2, Qt.AlignRight)
- self.formatForm.setColumnStretch(0, 0)
- self.formatForm.setColumnStretch(1, 1)
- self.formatForm.setColumnStretch(2, 0)
+ self.fontForm.setColumnStretch(0, 0)
+ self.fontForm.setColumnStretch(1, 1)
+ self.fontForm.setColumnStretch(2, 0)
- # Include Switches
- # ================
+ # Styling Options
+ # ===============
- self.textGroup = QGroupBox("Text Options", self)
+ self.styleGroup = QGroupBox("Styling Options", self)
+ self.styleForm = QGridLayout(self)
+ self.styleGroup.setLayout(self.styleForm)
+
+ self.justifyText = QSwitch(width=wS, height=hS)
+ self.justifyText.setChecked(
+ self.optState.getBool("GuiBuildNovel", "justifyText", False)
+ )
+
+ self.noStyling = QSwitch(width=wS, height=hS)
+ self.noStyling.setChecked(
+ self.optState.getBool("GuiBuildNovel", "noStyling", False)
+ )
+
+ self.styleForm.addWidget(justifyLabel, 1, 0, 1, 1, Qt.AlignLeft)
+ self.styleForm.addWidget(self.justifyText, 1, 1, 1, 2, Qt.AlignRight)
+ self.styleForm.addWidget(stylingLabel, 2, 0, 1, 1, Qt.AlignLeft)
+ self.styleForm.addWidget(self.noStyling, 2, 1, 1, 2, Qt.AlignRight)
+
+ self.styleForm.setColumnStretch(0, 0)
+ self.styleForm.setColumnStretch(1, 1)
+
+ # Include Options
+ # ===============
+
+ self.textGroup = QGroupBox("Include Options", self)
self.textForm = QGridLayout(self)
self.textGroup.setLayout(self.textForm)
- self.includeSynopsis = QSwitch()
+ self.includeSynopsis = QSwitch(width=wS, height=hS)
self.includeSynopsis.setChecked(
self.optState.getBool("GuiBuildNovel", "incSynopsis", False)
)
- self.includeComments = QSwitch()
+ self.includeComments = QSwitch(width=wS, height=hS)
self.includeComments.setChecked(
self.optState.getBool("GuiBuildNovel", "incComments", False)
)
- self.includeKeywords = QSwitch()
+ self.includeKeywords = QSwitch(width=wS, height=hS)
self.includeKeywords.setChecked(
self.optState.getBool("GuiBuildNovel", "incKeywords", False)
)
- self.includeBody = QSwitch()
+ self.includeBody = QSwitch(width=wS, height=hS)
self.includeBody.setChecked(
self.optState.getBool("GuiBuildNovel", "incBodyText", True)
)
@@ -315,7 +329,7 @@ class GuiBuildNovel(QDialog):
self.fileForm = QGridLayout(self)
self.fileGroup.setLayout(self.fileForm)
- self.novelFiles = QSwitch()
+ self.novelFiles = QSwitch(width=wS, height=hS)
self.novelFiles.setToolTip(
"Include files with layouts 'Book', 'Page', 'Partition', "
"'Chapter', 'Unnumbered', and 'Scene'."
@@ -324,13 +338,13 @@ class GuiBuildNovel(QDialog):
self.optState.getBool("GuiBuildNovel", "addNovel", True)
)
- self.noteFiles = QSwitch()
+ self.noteFiles = QSwitch(width=wS, height=hS)
self.noteFiles.setToolTip("Include files with layout 'Note'.")
self.noteFiles.setChecked(
self.optState.getBool("GuiBuildNovel", "addNotes", False)
)
- self.ignoreFlag = QSwitch()
+ self.ignoreFlag = QSwitch(width=wS, height=hS)
self.ignoreFlag.setToolTip(
"Ignore the 'Include when building project' setting and include "
"all files in the output."
@@ -360,7 +374,7 @@ class GuiBuildNovel(QDialog):
self.exportForm = QGridLayout(self)
self.exportGroup.setLayout(self.exportForm)
- self.replaceTabs = QSwitch()
+ self.replaceTabs = QSwitch(width=wS, height=hS)
self.replaceTabs.setChecked(
self.optState.getBool("GuiBuildNovel", "replaceTabs", False)
)
@@ -458,7 +472,8 @@ class GuiBuildNovel(QDialog):
# The Tool Box
self.toolsBox = QVBoxLayout()
self.toolsBox.addWidget(self.titleGroup)
- self.toolsBox.addWidget(self.formatGroup)
+ self.toolsBox.addWidget(self.fontGroup)
+ self.toolsBox.addWidget(self.styleGroup)
self.toolsBox.addWidget(self.textGroup)
self.toolsBox.addWidget(self.fileGroup)
self.toolsBox.addWidget(self.exportGroup)