This commit is contained in:
Enrico Forestieri 2017-06-05 23:14:48 +02:00
parent 4945fabff1
commit 59c22bd7b6
5 changed files with 112 additions and 28 deletions

View File

@ -447,6 +447,7 @@ int Font::latexWriteEndChanges(otexstream & os, BufferParams const & bparams,
OutputParams const & runparams, OutputParams const & runparams,
Font const & base, Font const & base,
Font const & next, Font const & next,
bool & needPar,
bool const & closeLanguage) const bool const & closeLanguage) const
{ {
int count = 0; int count = 0;
@ -491,6 +492,11 @@ int Font::latexWriteEndChanges(otexstream & os, BufferParams const & bparams,
if (f.size() != FONT_SIZE_INHERIT) { if (f.size() != FONT_SIZE_INHERIT) {
// We only have to close if only size changed // We only have to close if only size changed
if (!env) { if (!env) {
if (needPar && !closeLanguage) {
os << "\\par";
count += 4;
needPar = false;
}
os << '}'; os << '}';
++count; ++count;
} }

View File

@ -85,6 +85,7 @@ public:
OutputParams const & runparams, OutputParams const & runparams,
Font const & base, Font const & base,
Font const & next, Font const & next,
bool & needPar,
bool const & closeLanguage = true) const; bool const & closeLanguage = true) const;

View File

@ -51,6 +51,7 @@
#include "insets/InsetBibitem.h" #include "insets/InsetBibitem.h"
#include "insets/InsetLabel.h" #include "insets/InsetLabel.h"
#include "insets/InsetSpecialChar.h" #include "insets/InsetSpecialChar.h"
#include "insets/InsetText.h"
#include "mathed/InsetMathHull.h" #include "mathed/InsetMathHull.h"
@ -68,6 +69,15 @@
using namespace std; using namespace std;
using namespace lyx::support; using namespace lyx::support;
// gcc < 4.8.0 and msvc < 2015 do not support C++11 thread_local
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ < 8) || __cplusplus < 201103L)
#define THREAD_LOCAL_STATIC static __thread
#elif defined(_MSC_VER) && ((_MSC_VER < 1900) || __cplusplus < 201103L)
#define THREAD_LOCAL_STATIC static __declspec(thread)
#else
#define THREAD_LOCAL_STATIC thread_local static
#endif
namespace lyx { namespace lyx {
namespace { namespace {
@ -1033,9 +1043,10 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
os << '\n'; os << '\n';
} else { } else {
if (open_font) { if (open_font) {
bool needPar = false;
column += running_font.latexWriteEndChanges( column += running_font.latexWriteEndChanges(
os, bparams, runparams, os, bparams, runparams,
basefont, basefont); basefont, basefont, needPar);
open_font = false; open_font = false;
} }
@ -1093,10 +1104,12 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
bool arabtex = basefont.language()->lang() == "arabic_arabtex" bool arabtex = basefont.language()->lang() == "arabic_arabtex"
|| running_font.language()->lang() == "arabic_arabtex"; || running_font.language()->lang() == "arabic_arabtex";
if (open_font && !inset->inheritFont()) { if (open_font && !inset->inheritFont()) {
bool needPar = false;
bool closeLanguage = arabtex bool closeLanguage = arabtex
|| basefont.isRightToLeft() == running_font.isRightToLeft(); || basefont.isRightToLeft() == running_font.isRightToLeft();
unsigned int count = running_font.latexWriteEndChanges(os, unsigned int count = running_font.latexWriteEndChanges(os,
bparams, runparams, basefont, basefont, closeLanguage); bparams, runparams, basefont, basefont,
needPar, closeLanguage);
column += count; column += count;
// if any font properties were closed, update the running_font, // if any font properties were closed, update the running_font,
// making sure, however, to leave the language as it was // making sure, however, to leave the language as it was
@ -2360,14 +2373,19 @@ void Paragraph::latex(BufferParams const & bparams,
column += d->startTeXParParams(bparams, os, runparams); column += d->startTeXParParams(bparams, os, runparams);
} }
// Whether a \par can be issued for insets typeset inline with text.
// Yes if greater than 0. This has to be static.
THREAD_LOCAL_STATIC int parInline = 0;
for (pos_type i = 0; i < size(); ++i) { for (pos_type i = 0; i < size(); ++i) {
// First char in paragraph or after label? // First char in paragraph or after label?
if (i == body_pos) { if (i == body_pos) {
if (body_pos > 0) { if (body_pos > 0) {
if (open_font) { if (open_font) {
bool needPar = false;
column += running_font.latexWriteEndChanges( column += running_font.latexWriteEndChanges(
os, bparams, runparams, os, bparams, runparams,
basefont, basefont); basefont, basefont, needPar);
open_font = false; open_font = false;
} }
basefont = getLayoutFont(bparams, outerfont); basefont = getLayoutFont(bparams, outerfont);
@ -2420,8 +2438,10 @@ void Paragraph::latex(BufferParams const & bparams,
if (bparams.output_changes && runningChange != change) { if (bparams.output_changes && runningChange != change) {
if (open_font) { if (open_font) {
bool needPar = false;
column += running_font.latexWriteEndChanges( column += running_font.latexWriteEndChanges(
os, bparams, runparams, basefont, basefont); os, bparams, runparams,
basefont, basefont, needPar);
open_font = false; open_font = false;
} }
basefont = getLayoutFont(bparams, outerfont); basefont = getLayoutFont(bparams, outerfont);
@ -2449,9 +2469,11 @@ void Paragraph::latex(BufferParams const & bparams,
(font != running_font || (font != running_font ||
font.language() != running_font.language())) font.language() != running_font.language()))
{ {
bool needPar = false;
column += running_font.latexWriteEndChanges( column += running_font.latexWriteEndChanges(
os, bparams, runparams, basefont, os, bparams, runparams, basefont,
(i == body_pos-1) ? basefont : font); (i == body_pos-1) ? basefont : font,
needPar);
running_font = basefont; running_font = basefont;
open_font = false; open_font = false;
} }
@ -2565,9 +2587,40 @@ void Paragraph::latex(BufferParams const & bparams,
// and then split to handle the two modes separately. // and then split to handle the two modes separately.
if (c == META_INSET) { if (c == META_INSET) {
if (i >= start_pos && (end_pos == -1 || i < end_pos)) { if (i >= start_pos && (end_pos == -1 || i < end_pos)) {
// Greyedout notes and, in general, all insets
// with InsetLayout::isDisplay() == false,
// are typeset inline with the text. So, we
// can add a \par to the last paragraph of
// such insets only if nothing else follows.
bool incremented = false;
Inset const * inset = getInset(i);
InsetText const * textinset = inset
? inset->asInsetText()
: 0;
if (i + 1 == size() && textinset
&& !inset->getLayout().isDisplay()) {
ParagraphList const & pars =
textinset->text().paragraphs();
pit_type const pit = pars.size() - 1;
Font const last_font =
pit < 0 || pars[pit].empty()
? pars[pit].getLayoutFont(
bparams,
outerfont)
: pars[pit].getFont(bparams,
pars[pit].size() - 1,
outerfont);
if (last_font.fontInfo().size() !=
basefont.fontInfo().size()) {
++parInline;
incremented = true;
}
}
d->latexInset(bparams, os, rp, running_font, d->latexInset(bparams, os, rp, running_font,
basefont, outerfont, open_font, basefont, outerfont, open_font,
runningChange, style, i, column); runningChange, style, i, column);
if (incremented)
--parInline;
} }
} else if (i >= start_pos && (end_pos == -1 || i < end_pos)) { } else if (i >= start_pos && (end_pos == -1 || i < end_pos)) {
try { try {
@ -2601,22 +2654,62 @@ void Paragraph::latex(BufferParams const & bparams,
// If we have an open font definition, we have to close it // If we have an open font definition, we have to close it
if (open_font) { if (open_font) {
// Make sure that \\par is done with the font of the last
// character if this has another size as the default.
// This is necessary because LaTeX (and LyX on the screen)
// calculates the space between the baselines according
// to this font. (Matthias)
//
// We must not change the font for the last paragraph
// of non-multipar insets, tabular cells or commands,
// since this produces unwanted whitespace.
Font const font = empty()
? getLayoutFont(bparams, outerfont)
: getFont(bparams, size() - 1, outerfont);
InsetText const * textinset = inInset().asInsetText();
bool const maintext = textinset
? textinset->text().isMainText()
: false;
size_t const numpars = textinset
? textinset->text().paragraphs().size()
: 0;
bool needPar = false;
if (style.resfont.size() != font.fontInfo().size()
&& (!runparams.isLastPar || maintext
|| (numpars > 1 && d->ownerCode() != CELL_CODE
&& (inInset().getLayout().isDisplay()
|| parInline)))
&& !style.isCommand()) {
needPar = true;
}
#ifdef FIXED_LANGUAGE_END_DETECTION #ifdef FIXED_LANGUAGE_END_DETECTION
if (next_) { if (next_) {
running_font.latexWriteEndChanges(os, bparams, running_font.latexWriteEndChanges(os, bparams,
runparams, basefont, runparams, basefont,
next_->getFont(bparams, 0, outerfont)); next_->getFont(bparams, 0, outerfont),
needPar);
} else { } else {
running_font.latexWriteEndChanges(os, bparams, running_font.latexWriteEndChanges(os, bparams,
runparams, basefont, basefont); runparams, basefont, basefont, needPar);
} }
#else #else
//FIXME: For now we ALWAYS have to close the foreign font settings if they are //FIXME: For now we ALWAYS have to close the foreign font settings if they are
//FIXME: there as we start another \selectlanguage with the next paragraph if //FIXME: there as we start another \selectlanguage with the next paragraph if
//FIXME: we are in need of this. This should be fixed sometime (Jug) //FIXME: we are in need of this. This should be fixed sometime (Jug)
running_font.latexWriteEndChanges(os, bparams, runparams, running_font.latexWriteEndChanges(os, bparams, runparams,
basefont, basefont); basefont, basefont, needPar);
#endif #endif
if (needPar) {
// The \par could not be inserted at the same nesting
// level of the font size change, so do it now.
os << "{\\" << font.latexSize() << "\\par}";
}
} }
column += Changes::latexMarkChange(os, bparams, runningChange, column += Changes::latexMarkChange(os, bparams, runningChange,

View File

@ -962,30 +962,13 @@ void TeXOnePar(Buffer const & buf,
os << from_utf8(everypar); os << from_utf8(everypar);
par.latex(bparams, outerfont, os, runparams, start_pos, end_pos); par.latex(bparams, outerfont, os, runparams, start_pos, end_pos);
// Make sure that \\par is done with the font of the last
// character if this has another size as the default.
// This is necessary because LaTeX (and LyX on the screen)
// calculates the space between the baselines according
// to this font. (Matthias)
//
// We must not change the font for the last paragraph
// of non-multipar insets, tabular cells or commands,
// since this produces unwanted whitespace.
Font const font = par.empty() Font const font = par.empty()
? par.getLayoutFont(bparams, outerfont) ? par.getLayoutFont(bparams, outerfont)
: par.getFont(bparams, par.size() - 1, outerfont); : par.getFont(bparams, par.size() - 1, outerfont);
bool const is_command = style.isCommand(); bool const is_command = style.isCommand();
if (style.resfont.size() != font.fontInfo().size() if (is_command) {
&& (nextpar || maintext
|| (text.inset().paragraphs().size() > 1
&& text.inset().lyxCode() != CELL_CODE))
&& !is_command) {
os << '{';
os << "\\" << from_ascii(font.latexSize()) << " \\par}";
} else if (is_command) {
os << '}'; os << '}';
if (!style.postcommandargs().empty()) if (!style.postcommandargs().empty())
latexArgInsets(par, os, runparams, style.postcommandargs(), "post:"); latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");

View File

@ -39,7 +39,8 @@ What's new
* DOCUMENT INPUT/OUTPUT * DOCUMENT INPUT/OUTPUT
- Fix wrong spacing in output when the font size is changed inside
a center environment or a greyed out note (bugs 9598 and 10650).
* LYX2LYX * LYX2LYX