commit c527035b70ffc9f4d606e8b89c4b7bb8f39831f4
Author: Juergen Spitzmueller <[email protected]>
Date:   Sat Dec 16 16:11:25 2017 +0100

    Consistent output of breakable/non-breakable dashes on all TeX engines.
    
    Fixes: #10839
    (cherry picked from commit d56a5447f30688286c1fe19f3b51225f4b586b3e)
---
 lib/RELEASE-NOTES                 |   24 ++++++++++++------------
 src/LaTeXFeatures.cpp             |    3 +++
 src/Paragraph.cpp                 |   26 +++++++++++++++++++++-----
 src/frontends/qt4/GuiDocument.cpp |    5 ++---
 src/frontends/qt4/ui/FontUi.ui    |    4 ++--
 5 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index ff7e67e..1788167 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -14,11 +14,11 @@
   if needed, as usual.
 
 * The new setting
-  "Document->Settings->Fonts->Output em- and en-dash as ligatures" forces
-  output of en- and em-dashes as -- and --- when exporting to LaTeX.
-  It is is "true" by default but "false" when opening documents edited
-  with LyX 2.2.
-  See chapter 3.9.1.1 "Dashes and line breaks" of the User Guide and
+  "Document->Settings->Fonts->Disallow line breaks after dashes" forces
+  output of en- and em-dashes as \textendash and \textemdash when exporting
+  to LaTeX. It is is "false" by default but "true" when opening documents
+  edited with LyX 2.2.
+  See chapter 3.9.1.1 "Dashes and Line Breaks" of the User Guide and
   "Caveats when upgrading from earlier versions to 2.3.x" below.
 
 * The following UI translations were dropped, because the lack of translation
@@ -212,19 +212,19 @@
   the external_templates file, you will have to move the modifications to
   the respective *.xtemplate file manually.
 
-* By default, LyX 2.3 forces output of all en and em dashes as -- and ---
-  when exporting to LaTeX. This can lead to incorrect line breaks, wrong
-  characters in typewriter fonts, and problems with some LaTeX packages.
-  Unselect "Document->Settings->Fonts->Output em- and en-dash as ligatures"
-  to keep the LyX 2.2 behaviour and avoid these problems. See chapter 3.9.1.1
-  "Dashes and line breaks" of the User Guide for details.
+* By default, LyX 2.3 outputs en- and em-dashes after which a line break can
+  occur in the output. Sometimes, this results in undesired line breaks.
+  Select "Document->Settings->Fonts->Disallow line breaks after dashes"
+  to keep the LyX 2.2 behaviour, where such line breaks have been generally
+  suppressed. See chapter 3.9.1.1, "Dashes and Line Breaks", of the User Guide
+  for details.
 
 * ZWSP characters (u200b) following literal em- and en-dashes are deleted by
   lyx2lyx when converting to 2.3 format. If you used them as optional line
   breaks after dashes, convert them to space insets before opening your
   document with LyX 2.3 or the optional line breaks will be lost!
 
-* If using TeX fonts and en- and em-dashes are output as font ligatures,
+* If using TeX fonts and en- and em-dashes are output in breakable form,
   when exporting documents containing en- and em-dashes to the format of
   LyX 2.0 or earlier, the following line has to be manually added to the
   unicodesymbols file of that LyX version:<br>
diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp
index 3f9eb67..d4b0018 100644
--- a/src/LaTeXFeatures.cpp
+++ b/src/LaTeXFeatures.cpp
@@ -1318,6 +1318,9 @@ TexString LaTeXFeatures::getMacros() const
                macros << getPreambleSnippets();
        }
 
+       if (mustProvide("xetexdashbreakstate"))
+               macros << "\\XeTeXdashbreakstate 0" << '\n';
+
        if (mustProvide("papersize")) {
                if (runparams_.flavor == OutputParams::LATEX
                    || runparams_.flavor == OutputParams::DVILUATEX)
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index 2918819..fcf4a73 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -1289,7 +1289,10 @@ void Paragraph::Private::latexSpecialChar(otexstream & 
os,
 
        case 0x2013:
        case 0x2014:
-               if (bparams.use_dash_ligatures && !bparams.useNonTeXFonts) {
+               // XeTeX's dash behaviour is determined via a global setting
+               if (bparams.use_dash_ligatures
+                   && owner_->getFontSettings(bparams, i).fontInfo().family() 
!= TYPEWRITER_FAMILY
+                   && (!bparams.useNonTeXFonts || runparams.flavor != 
OutputParams::XETEX)) {
                        if (c == 0x2013) {
                                // en-dash
                                os << "--";
@@ -1417,6 +1420,14 @@ bool Paragraph::Private::latexSpecialT3(char_type const 
c, otexstream & os,
                os << "\\textvertline" << termcmd;
                column += 14;
                return true;
+       case 0x2013:
+               os << "\\textendash" << termcmd;
+               column += 12;
+               return true;
+       case 0x2014:
+               os << "\\textemdash" << termcmd;
+               column += 12;
+               return true;
        default:
                return false;
        }
@@ -1425,11 +1436,11 @@ bool Paragraph::Private::latexSpecialT3(char_type const 
c, otexstream & os,
 
 void Paragraph::Private::validate(LaTeXFeatures & features) const
 {
+       Buffer const & buf = inset_owner_->buffer();
+       BufferParams const & bp = features.runparams().is_child
+               ? buf.masterParams() : buf.params();
        if (layout_->inpreamble && inset_owner_) {
                bool const is_command = layout_->latextype == LATEX_COMMAND;
-               Buffer const & buf = inset_owner_->buffer();
-               BufferParams const & bp = features.runparams().is_child
-                       ? buf.masterParams() : buf.params();
                Font f;
                // Using a string stream here circumvents the encoding
                // switching machinery of odocstream. Therefore the
@@ -1509,7 +1520,6 @@ void Paragraph::Private::validate(LaTeXFeatures & 
features) const
        }
 
        // then the contents
-       BufferParams const bp = features.buffer().masterParams();
        for (pos_type i = 0; i < int(text_.size()) ; ++i) {
                char_type c = text_[i];
                if (c == 0x0022) {
@@ -1519,6 +1529,12 @@ void Paragraph::Private::validate(LaTeXFeatures & 
features) const
                                 || ((&owner_->getFontSettings(bp, 
i))->language()->internalFontEncoding()))
                                features.require("textquotedbl");
                }
+               if (!bp.use_dash_ligatures
+                   && (c == 0x2013 || c == 0x2014)
+                   && bp.useNonTeXFonts
+                   && features.runparams().flavor == OutputParams::XETEX)
+                       // XeTeX's dash behaviour is determined via a global 
setting
+                       features.require("xetexdashbreakstate");
                BufferEncodings::validate(c, features);
        }
 }
diff --git a/src/frontends/qt4/GuiDocument.cpp 
b/src/frontends/qt4/GuiDocument.cpp
index 385b376..cea4e78 100644
--- a/src/frontends/qt4/GuiDocument.cpp
+++ b/src/frontends/qt4/GuiDocument.cpp
@@ -2073,7 +2073,6 @@ void GuiDocument::updateFontOptions()
                                
fontModule->fontsRomanCO->currentIndex()).toString();
        fontModule->fontScCB->setEnabled(providesSC(font));
        fontModule->fontOsfCB->setEnabled(providesOSF(font));
-       fontModule->dashesCB->setEnabled(tex_fonts);
        updateMathFonts(font);
 }
 
@@ -3209,7 +3208,7 @@ void GuiDocument::applyView()
                fromqstr(fontModule->cjkFontLE->text());
 
        bp_.use_microtype = fontModule->microtypeCB->isChecked();
-       bp_.use_dash_ligatures = fontModule->dashesCB->isChecked();
+       bp_.use_dash_ligatures = !fontModule->dashesCB->isChecked();
 
        bp_.fonts_sans_scale[nontexfonts] = fontModule->scaleSansSB->value();
        bp_.fonts_sans_scale[!nontexfonts] = fontModule->font_sf_scale;
@@ -3744,7 +3743,7 @@ void GuiDocument::paramsToDialog()
                fontModule->cjkFontLE->setText(QString());
 
        fontModule->microtypeCB->setChecked(bp_.use_microtype);
-       fontModule->dashesCB->setChecked(bp_.use_dash_ligatures);
+       fontModule->dashesCB->setChecked(!bp_.use_dash_ligatures);
 
        fontModule->fontScCB->setChecked(bp_.fonts_expert_sc);
        fontModule->fontOsfCB->setChecked(bp_.fonts_old_figures);
diff --git a/src/frontends/qt4/ui/FontUi.ui b/src/frontends/qt4/ui/FontUi.ui
index f0b3fb7..fc98c1b 100644
--- a/src/frontends/qt4/ui/FontUi.ui
+++ b/src/frontends/qt4/ui/FontUi.ui
@@ -297,10 +297,10 @@
    <item row="11" column="1">
     <widget class="QCheckBox" name="dashesCB">
      <property name="toolTip">
-      <string>Use font ligatures -- and --- instead of \textendash and 
\textemdash for en- and em-dashes</string>
+      <string>By default, a line break can occur after en- and em-dashes and 
before em-dashes. Checking this box prevents that.</string>
      </property>
      <property name="text">
-      <string>Output en- and &amp;em-dashes as ligatures</string>
+      <string>Disallow l&amp;ine breaks at dashes</string>
      </property>
     </widget>
    </item>

Reply via email to