Hi Guillaume,

the iostream resp. sstream include issues I’ve changed myself.

The math related things I cannot fix.

Furthermore I’m seeing this warning:

In file included from /Users/stephan/git/lyx/src/lyxfind.cpp:42:
/Users/stephan/git/lyx/src/mathed/MathStream.h:29:1: warning: class 'RowEntry' 
was previously declared as a struct [-Wmismatched-tags]
class RowEntry;
^
/Users/stephan/git/lyx/src/TexRow.h:56:8: note: previous use is here
struct RowEntry {
       ^
/Users/stephan/git/lyx/src/mathed/MathStream.h:29:1: note: did you mean struct 
here?
class RowEntry;
^~~~~
struct


Stephan


> Am 04.07.2016 um 12:06 schrieb Stephan Witt <st.w...@gmx.net>:
> 
> Hi Guillaume,
> 
> now I’m getting:
> 
> /Users/stephan/git/lyx/src/output_docbook.cpp:108:7: error: invalid operands 
> to binary expression ('odocstream' (aka 'basic_ostream<wchar_t, 
> char_traits<wchar_t> >') and 'int')
>                        os << '\n';
>                        ~~ ^  ~~~~
> 
> I have to add another include in src/output_docbook.cpp
> +#include <iostream>
> 
> and in src/VCBackend.cpp
> +#include <iostream>
> 
> which leads to another error in VCBackend.cpp:
> 
> /Users/stephan/git/lyx/src/VCBackend.cpp:1338:16: error: implicit 
> instantiation of undefined template 'std::__1::basic_ostringstream<char, 
> std::__1::char_traits<char>,
>      std::__1::allocator<char> >'
>        ostringstream os;
>                      ^
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd:123:33:
>  note: template is declared here
>    class _LIBCPP_TYPE_VIS_ONLY basic_ostringstream;
>                                ^
> 
> The next problem is:
> 
> /Users/stephan/git/lyx/src/RowPainter.cpp:691:55: error: use of undeclared 
> identifier 'abs'
>                        pi_.pain.fillRectangle(int(xo_ + min(x1, x2)), y1, 
> abs(x2 - x1),
> 
> When adding the obvious include "#include <cmath>“ it turns out that there is 
> no abs for int values.
> 
> /Users/stephan/git/lyx/src/RowPainter.cpp:691:55: error: call to 'abs' is 
> ambiguous
>                        pi_.pain.fillRectangle(int(xo_ + min(x1, x2)), y1, 
> abs(x2 - x1),
>                                                                           ^~~
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:664:1:
>  note: candidate function
> abs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
> ^
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:668:1:
>  note: candidate function
> abs(double __lcpp_x) _NOEXCEPT {return fabs(__lcpp_x);}
> ^
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:672:1:
>  note: candidate function
> abs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
> ^
> 
> A change like the following helps.
> -                       pi_.pain.fillRectangle(int(xo_ + min(x1, x2)), y1, 
> abs(x2 - x1),
> +                       pi_.pain.fillRectangle(int(xo_ + min(x1, x2)), y1, 
> abs(float(x2 - x1)),
> 
> But then it's the same story in the next file. So I don’t know how the proper 
> fix should look like.
> 
> /Users/stephan/git/lyx/src/TextMetrics.cpp:1355:8: error: call to 'abs' is 
> ambiguous
>                        if (abs(p.x_ - x) < abs(p.x_ + dim.wid - x))
>                            ^~~
> 
> Stephan
> 
>> Am 04.07.2016 um 02:42 schrieb Guillaume Munch <g...@lyx.org>:
>> 
>> commit 670efa8f646218f2a378f0cc614c4c37a9f6b89a
>> Author: Guillaume Munch <g...@lyx.org>
>> Date:   Sun Jun 19 03:39:38 2016 +0100
>> 
>>   Rationalise includes
>> 
>>   Modifying TexRow.h or texstream.h no longer triggers the recompilation of 
>> the
>>   complete source tree.
>> ---
>> src/Buffer.cpp                       |   23 ++++++++++++-----------
>> src/Buffer.h                         |    6 +++---
>> src/BufferParams.cpp                 |    1 +
>> src/Changes.cpp                      |    1 +
>> src/Changes.h                        |    4 ++--
>> src/Compare.cpp                      |    1 +
>> src/Converter.h                      |    1 -
>> src/Cursor.cpp                       |    4 ++--
>> src/Font.cpp                         |    1 +
>> src/Format.cpp                       |    1 +
>> src/LaTeXFonts.cpp                   |    1 +
>> src/PDFOptions.cpp                   |    1 +
>> src/Paragraph.cpp                    |    4 ++--
>> src/TexRow.cpp                       |   20 ++++++++++----------
>> src/TexRow.h                         |   33 +++++++++++++++++----------------
>> src/frontends/qt4/FindAndReplace.cpp |    1 +
>> src/frontends/qt4/GuiViewSource.cpp  |    1 +
>> src/frontends/qt4/GuiViewSource.h    |    8 +++++++-
>> src/graphics/PreviewLoader.cpp       |    4 ++--
>> src/graphics/epstools.cpp            |    1 +
>> src/insets/ExternalSupport.cpp       |    1 +
>> src/insets/ExternalSupport.h         |    4 +++-
>> src/insets/InsetArgument.cpp         |    6 ++++--
>> src/insets/InsetBibtex.cpp           |    1 +
>> src/insets/InsetBox.cpp              |    2 ++
>> src/insets/InsetCaption.cpp          |    2 ++
>> src/insets/InsetCitation.cpp         |    1 +
>> src/insets/InsetCommand.cpp          |    1 +
>> src/insets/InsetExternal.cpp         |   10 ++++------
>> src/insets/InsetFloat.cpp            |   10 +++++-----
>> src/insets/InsetFloatList.cpp        |    1 +
>> src/insets/InsetGraphics.cpp         |    1 +
>> src/insets/InsetHyperlink.cpp        |    1 +
>> src/insets/InsetIPA.cpp              |    6 +++---
>> src/insets/InsetIPAMacro.cpp         |    1 +
>> src/insets/InsetInclude.cpp          |    4 ++--
>> src/insets/InsetIndex.cpp            |    4 ++--
>> src/insets/InsetLine.cpp             |    1 +
>> src/insets/InsetListings.cpp         |    4 ++--
>> src/insets/InsetNewline.cpp          |    1 +
>> src/insets/InsetNewpage.cpp          |    1 +
>> src/insets/InsetNomencl.cpp          |    1 +
>> src/insets/InsetPhantom.cpp          |    1 +
>> src/insets/InsetPreview.cpp          |    4 ++--
>> src/insets/InsetQuotes.cpp           |    1 +
>> src/insets/InsetRef.cpp              |    1 +
>> src/insets/InsetSeparator.cpp        |    1 +
>> src/insets/InsetSpace.cpp            |    1 +
>> src/insets/InsetSpecialChar.cpp      |    1 +
>> src/insets/InsetTabular.cpp          |    5 +++--
>> src/insets/InsetText.cpp             |    1 +
>> src/insets/InsetVSpace.cpp           |    1 +
>> src/insets/InsetWrap.cpp             |    1 +
>> src/lyxfind.cpp                      |    9 +++------
>> src/mathed/InsetMath.cpp             |    9 +++------
>> src/mathed/InsetMath.h               |    5 +++--
>> src/mathed/InsetMathGrid.cpp         |    9 +++++----
>> src/mathed/InsetMathHull.cpp         |   24 +++++++++---------------
>> src/mathed/InsetMathNest.cpp         |    8 ++++----
>> src/mathed/MacroTable.cpp            |    3 +--
>> src/mathed/MathFactory.cpp           |    4 ++--
>> src/mathed/MathMacroTemplate.cpp     |    3 +--
>> src/mathed/MathStream.cpp            |   13 ++++++++-----
>> src/mathed/MathStream.h              |    7 +++++--
>> src/mathed/MathSupport.cpp           |    9 +++------
>> src/output_latex.cpp                 |    1 +
>> src/tex2lyx/dummy_impl.cpp           |   13 -------------
>> src/texstream.cpp                    |   25 ++++++++++++++++++++++---
>> src/texstream.h                      |   26 ++++++++++++++++++--------
>> 69 files changed, 210 insertions(+), 157 deletions(-)
>> 
>> diff --git a/src/Buffer.cpp b/src/Buffer.cpp
>> index 08f3148..a64e4b6 100644
>> --- a/src/Buffer.cpp
>> +++ b/src/Buffer.cpp
>> @@ -57,6 +57,7 @@
>> #include "PDFOptions.h"
>> #include "SpellChecker.h"
>> #include "sgml.h"
>> +#include "texstream.h"
>> #include "TexRow.h"
>> #include "Text.h"
>> #include "TextClass.h"
>> @@ -1684,7 +1685,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
>>      ErrorList & errorList = d->errorLists["Export"];
>>      errorList.clear();
>>      bool failed_export = false;
>> -    otexstream os(ofs, d->texrow);
>> +    otexstream os(ofs);
>> 
>>      // make sure we are ready to export
>>      // this needs to be done before we validate
>> @@ -1694,7 +1695,6 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
>>      updateMacroInstances(OutputUpdate);
>> 
>>      try {
>> -            os.texrow().reset();
>>              writeLaTeXSource(os, original_path, runparams, output);
>>      }
>>      catch (EncodingException const & e) {
>> @@ -1725,6 +1725,8 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
>>              lyx_exit(1);
>>      }
>> 
>> +    d->texrow = move(os.texrow());
>> +
>>      ofs.close();
>>      if (ofs.fail()) {
>>              failed_export = true;
>> @@ -3715,14 +3717,13 @@ unique_ptr<TexRow> Buffer::getSourceCode(odocstream 
>> & os, string const & format,
>>                      LaTeXFeatures features(*this, params(), runparams);
>>                      params().validate(features);
>>                      runparams.use_polyglossia = features.usePolyglossia();
>> -                    texrow = make_unique<TexRow>();
>> -                    texrow->newline();
>> -                    texrow->newline();
>>                      // latex or literate
>> -                    otexstream ots(os, *texrow);
>> -
>> +                    otexstream ots(os);
>> +                    // output above
>> +                    ots.texrow().newlines(2);
>>                      // the real stuff
>>                      latexParagraphs(*this, text(), ots, runparams);
>> +                    texrow = ots.releaseTexRow();
>>                      texrow->finalize();
>> 
>>                      // Restore the parenthood
>> @@ -3758,13 +3759,13 @@ unique_ptr<TexRow> Buffer::getSourceCode(odocstream 
>> & os, string const & format,
>>                              writeDocBookSource(os, absFileName(), 
>> runparams, output);
>>              } else {
>>                      // latex or literate
>> -                    texrow = make_unique<TexRow>();
>> -                    texrow->newline();
>> -                    texrow->newline();
>> -                    otexstream ots(os, *texrow);
>> +                    otexstream ots(os);
>> +                    // output above
>> +                    ots.texrow().newlines(2);
>>                      if (master)
>>                              runparams.is_child = true;
>>                      writeLaTeXSource(ots, string(), runparams, output);
>> +                    texrow = ots.releaseTexRow();
>>                      texrow->finalize();
>>              }
>>      }
>> diff --git a/src/Buffer.h b/src/Buffer.h
>> index 7acf1f3..477a8ac 100644
>> --- a/src/Buffer.h
>> +++ b/src/Buffer.h
>> @@ -13,7 +13,6 @@
>> #define BUFFER_H
>> 
>> #include "OutputEnums.h"
>> -#include "OutputParams.h"
>> 
>> #include "support/unique_ptr.h"
>> #include "support/strfwd.h"
>> @@ -51,6 +50,7 @@ class MacroData;
>> class MacroNameSet;
>> class MacroSet;
>> class OutputParams;
>> +class otexstream;
>> class Paragraph;
>> class ParConstIterator;
>> class ParIterator;
>> @@ -325,13 +325,13 @@ public:
>>          method with a string stream if the output is supposed to go to a
>>          file. \code
>>          ofdocstream ofs;
>> -        otexstream os(ofs, texrow);
>> +        otexstream os(ofs);
>>          ofs.open("test.tex");
>>          writeLaTeXSource(os, ...);
>>          ofs.close();
>>          \endcode is NOT equivalent to \code
>>          odocstringstream oss;
>> -        otexstream os(oss, texrow);
>> +        otexstream os(oss);
>>          writeLaTeXSource(os, ...);
>>          ofdocstream ofs;
>>          ofs.open("test.tex");
>> diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
>> index d2218e0..7af4397 100644
>> --- a/src/BufferParams.cpp
>> +++ b/src/BufferParams.cpp
>> @@ -38,6 +38,7 @@
>> #include "LyXRC.h"
>> #include "OutputParams.h"
>> #include "Spacing.h"
>> +#include "texstream.h"
>> #include "TexRow.h"
>> #include "VSpace.h"
>> #include "PDFOptions.h"
>> diff --git a/src/Changes.cpp b/src/Changes.cpp
>> index 1626f50..0d464d8 100644
>> --- a/src/Changes.cpp
>> +++ b/src/Changes.cpp
>> @@ -22,6 +22,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "Paragraph.h"
>> +#include "texstream.h"
>> #include "TocBackend.h"
>> 
>> #include "support/debug.h"
>> diff --git a/src/Changes.h b/src/Changes.h
>> index 9638396..ea6e4b3 100644
>> --- a/src/Changes.h
>> +++ b/src/Changes.h
>> @@ -21,8 +21,6 @@
>> #include "support/types.h"
>> #include "support/lyxtime.h"
>> 
>> -#include "texstream.h"
>> -
>> #include <vector>
>> 
>> 
>> @@ -32,9 +30,11 @@ class AuthorList;
>> class Buffer;
>> class DocIterator;
>> class OutputParams;
>> +class otexstream;
>> class PainterInfo;
>> class FontInfo;
>> 
>> +
>> class Change {
>> public:
>>      /// the type of change
>> diff --git a/src/Compare.cpp b/src/Compare.cpp
>> index 68570b8..b2f6439 100644
>> --- a/src/Compare.cpp
>> +++ b/src/Compare.cpp
>> @@ -19,6 +19,7 @@
>> 
>> #include "insets/InsetText.h"
>> 
>> +#include "support/docstream.h"
>> #include "support/lassert.h"
>> #include "support/lyxalgo.h"
>> #include "support/qstring_helpers.h"
>> diff --git a/src/Converter.h b/src/Converter.h
>> index 9a72d8c..082b2d3 100644
>> --- a/src/Converter.h
>> +++ b/src/Converter.h
>> @@ -29,7 +29,6 @@ class Buffer;
>> class ErrorList;
>> class Format;
>> class Formats;
>> -class OutputParams;
>> 
>> 
>> ///
>> diff --git a/src/Cursor.cpp b/src/Cursor.cpp
>> index 2894f9d..8d5c63b 100644
>> --- a/src/Cursor.cpp
>> +++ b/src/Cursor.cpp
>> @@ -31,6 +31,7 @@
>> #include "Paragraph.h"
>> #include "ParIterator.h"
>> #include "Row.h"
>> +#include "texstream.h"
>> #include "Text.h"
>> #include "TextMetrics.h"
>> #include "TocBackend.h"
>> @@ -1566,8 +1567,7 @@ void Cursor::normalize()
>>                      << pos() << ' ' << lastpos() <<  " in idx: " << idx()
>>                     << " in atom: '";
>>              odocstringstream os;
>> -            TexRow texrow(false);
>> -            otexrowstream ots(os,texrow);
>> +            otexrowstream ots(os, false);
>>              WriteStream wi(ots, false, true, WriteStream::wsDefault);
>>              inset().asInsetMath()->write(wi);
>>              lyxerr << to_utf8(os.str()) << endl;
>> diff --git a/src/Font.cpp b/src/Font.cpp
>> index f0814a3..0ca4080 100644
>> --- a/src/Font.cpp
>> +++ b/src/Font.cpp
>> @@ -25,6 +25,7 @@
>> #include "LyXRC.h"
>> #include "output_latex.h"
>> #include "OutputParams.h"
>> +#include "texstream.h"
>> 
>> #include "support/lassert.h"
>> #include "support/convert.h"
>> diff --git a/src/Format.cpp b/src/Format.cpp
>> index eba00b9..503bfc5 100644
>> --- a/src/Format.cpp
>> +++ b/src/Format.cpp
>> @@ -23,6 +23,7 @@
>> #include "support/gettext.h"
>> #include "support/lstrings.h"
>> #include "support/mutex.h"
>> +#include "support/docstream.h"
>> #include "support/os.h"
>> #include "support/PathChanger.h"
>> #include "support/Systemcall.h"
>> diff --git a/src/LaTeXFonts.cpp b/src/LaTeXFonts.cpp
>> index 676179f..bc4151c 100644
>> --- a/src/LaTeXFonts.cpp
>> +++ b/src/LaTeXFonts.cpp
>> @@ -19,6 +19,7 @@
>> 
>> #include "support/convert.h"
>> #include "support/debug.h"
>> +#include "support/docstream.h"
>> #include "support/FileName.h"
>> #include "support/filetools.h"
>> #include "support/gettext.h"
>> diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp
>> index 6734bea..77763be 100644
>> --- a/src/PDFOptions.cpp
>> +++ b/src/PDFOptions.cpp
>> @@ -15,6 +15,7 @@
>> 
>> #include "Encoding.h"
>> #include "Lexer.h"
>> +#include "texstream.h"
>> 
>> #include "support/convert.h"
>> #include "support/debug.h"
>> diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
>> index c29ca4c..507702f 100644
>> --- a/src/Paragraph.cpp
>> +++ b/src/Paragraph.cpp
>> @@ -40,6 +40,7 @@
>> #include "ParagraphParameters.h"
>> #include "SpellChecker.h"
>> #include "sgml.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "TexRow.h"
>> #include "Text.h"
>> @@ -1377,13 +1378,12 @@ void Paragraph::Private::validate(LaTeXFeatures & 
>> features) const
>>              BufferParams const & bp = features.runparams().is_child
>>                      ? buf.masterParams() : buf.params();
>>              Font f;
>> -            TexRow texrow;
>>              // Using a string stream here circumvents the encoding
>>              // switching machinery of odocstream. Therefore the
>>              // output is wrong if this paragraph contains content
>>              // that needs to switch encoding.
>>              odocstringstream ods;
>> -            otexstream os(ods, texrow);
>> +            otexstream os(ods, false);
>>              if (is_command) {
>>                      os << '\\' << from_ascii(layout_->latexname());
>>                      // we have to provide all the optional arguments here, 
>> even though
>> diff --git a/src/TexRow.cpp b/src/TexRow.cpp
>> index 21be0b8..4e23cf7 100644
>> --- a/src/TexRow.cpp
>> +++ b/src/TexRow.cpp
>> @@ -53,7 +53,7 @@ void TexRow::RowEntryList::forceAddEntry(RowEntry const & 
>> entry)
>> }
>> 
>> 
>> -TexRow::TextEntry TexRow::RowEntryList::getTextEntry() const
>> +TextEntry TexRow::RowEntryList::getTextEntry() const
>> {
>>      if (text_entry_ < size())
>>              return operator[](text_entry_).text;
>> @@ -61,7 +61,7 @@ TexRow::TextEntry TexRow::RowEntryList::getTextEntry() 
>> const
>> }
>> 
>> 
>> -TexRow::RowEntry TexRow::RowEntryList::entry() const
>> +RowEntry TexRow::RowEntryList::entry() const
>> {
>>      if (0 < size())
>>              return operator[](0);
>> @@ -77,8 +77,8 @@ void TexRow::RowEntryList::append(RowEntryList const & row)
>> }
>> 
>> 
>> -TexRow::TextEntry const TexRow::text_none = { -1, 0 };
>> -TexRow::RowEntry const TexRow::row_none = { false, { TexRow::text_none } };
>> +TextEntry const TexRow::text_none = { -1, 0 };
>> +RowEntry const TexRow::row_none = { false, { TexRow::text_none } };
>> 
>> 
>> bool TexRow::isNone(TextEntry const & t)
>> @@ -101,7 +101,7 @@ void TexRow::reset(bool enable)
>> }
>> 
>> 
>> -TexRow::RowEntry TexRow::textEntry(int id, int pos)
>> +RowEntry TexRow::textEntry(int id, int pos)
>> {
>>      RowEntry entry;
>>      entry.is_math = false;
>> @@ -111,7 +111,7 @@ TexRow::RowEntry TexRow::textEntry(int id, int pos)
>> }
>> 
>> 
>> -TexRow::RowEntry TexRow::mathEntry(uid_type id, idx_type cell)
>> +RowEntry TexRow::mathEntry(uid_type id, idx_type cell)
>> {
>>      RowEntry entry;
>>      entry.is_math = true;
>> @@ -121,8 +121,8 @@ TexRow::RowEntry TexRow::mathEntry(uid_type id, idx_type 
>> cell)
>> }
>> 
>> 
>> -bool operator==(TexRow::RowEntry const & entry1,
>> -                            TexRow::RowEntry const & entry2)
>> +bool operator==(RowEntry const & entry1,
>> +                            RowEntry const & entry2)
>> {
>>      return entry1.is_math == entry2.is_math
>>              && (entry1.is_math
>> @@ -216,7 +216,7 @@ bool TexRow::getIdFromRow(int row, int & id, int & pos) 
>> const
>> }
>> 
>> 
>> -TexRow::RowEntry TexRow::rowEntryFromCursorSlice(CursorSlice const & slice)
>> +RowEntry TexRow::rowEntryFromCursorSlice(CursorSlice const & slice)
>> {
>>      RowEntry entry;
>>      InsetMath * insetMath = slice.asInsetMath();
>> @@ -408,7 +408,7 @@ std::pair<int,int> 
>> TexRow::rowFromDocIterator(DocIterator const & dit) const
>>              // matches either at a deeper level, or at the same level but 
>> not
>>              // before.
>>              for (size_t i = best_slice; i < n; ++i) {
>> -                    TexRow::RowEntry entry_i = 
>> rowEntryFromCursorSlice(dit[i]);
>> +                    RowEntry entry_i = rowEntryFromCursorSlice(dit[i]);
>>                      if (sameParOrInsetMath(*it, entry_i)) {
>>                              if (comparePos(*it, entry_i) >= 0
>>                                      && (i > best_slice
>> diff --git a/src/TexRow.h b/src/TexRow.h
>> index c072ec1..9e41b0a 100644
>> --- a/src/TexRow.h
>> +++ b/src/TexRow.h
>> @@ -46,26 +46,27 @@ typedef void const * uid_type;
>> typedef size_t idx_type;
>> 
>> 
>> +/// an individual par id/pos <=> row mapping
>> +struct TextEntry { int id; int pos; };
>> +
>> +/// an individual math id/cell <=> row mapping
>> +struct MathEntry { uid_type id; idx_type cell; };
>> +
>> +/// a container for passing entries around
>> +struct RowEntry {
>> +    bool is_math;// true iff the union is a math
>> +    union {
>> +            struct TextEntry text;
>> +            struct MathEntry math;
>> +    };
>> +};
>> +
>> +
>> /// Represents the correspondence between paragraphs and the generated
>> /// LaTeX file
>> 
>> class TexRow {
>> public:
>> -    /// an individual par id/pos <=> row mapping
>> -    struct TextEntry { int id; int pos; };
>> -
>> -    /// an individual math id/cell <=> row mapping
>> -    struct MathEntry { uid_type id; idx_type cell; };
>> -
>> -    /// a container for passing entries around
>> -    struct RowEntry {
>> -            bool is_math;// true iff the union is a math
>> -            union {
>> -                    struct TextEntry text;
>> -                    struct MathEntry math;
>> -            };
>> -    };
>> -
>>      // For each row we store a list of one special TextEntry and several
>>      // RowEntries. (The order is important.)  We only want one text entry
>>      // because we do not want to store every position in the lyx file. On 
>> the
>> @@ -205,7 +206,7 @@ private:
>>      bool enabled_;
>> };
>> 
>> -bool operator==(TexRow::RowEntry const &, TexRow::RowEntry const &);
>> +bool operator==(RowEntry const &, RowEntry const &);
>> 
>> LyXErr & operator<<(LyXErr &, TexRow &);
>> 
>> diff --git a/src/frontends/qt4/FindAndReplace.cpp 
>> b/src/frontends/qt4/FindAndReplace.cpp
>> index ac7084a..4411074 100644
>> --- a/src/frontends/qt4/FindAndReplace.cpp
>> +++ b/src/frontends/qt4/FindAndReplace.cpp
>> @@ -33,6 +33,7 @@
>> #include "frontends/alert.h"
>> 
>> #include "support/debug.h"
>> +#include "support/docstream.h"
>> #include "support/filetools.h"
>> #include "support/FileName.h"
>> #include "support/gettext.h"
>> diff --git a/src/frontends/qt4/GuiViewSource.cpp 
>> b/src/frontends/qt4/GuiViewSource.cpp
>> index 46dd358..4be43e2 100644
>> --- a/src/frontends/qt4/GuiViewSource.cpp
>> +++ b/src/frontends/qt4/GuiViewSource.cpp
>> @@ -22,6 +22,7 @@
>> #include "Cursor.h"
>> #include "Format.h"
>> #include "Paragraph.h"
>> +#include "TexRow.h"
>> 
>> #include "support/debug.h"
>> #include "support/lassert.h"
>> diff --git a/src/frontends/qt4/GuiViewSource.h 
>> b/src/frontends/qt4/GuiViewSource.h
>> index 428da05..dbe36c7 100644
>> --- a/src/frontends/qt4/GuiViewSource.h
>> +++ b/src/frontends/qt4/GuiViewSource.h
>> @@ -18,20 +18,26 @@
>> 
>> #include "Buffer.h"
>> #include "DockView.h"
>> -#include "TexRow.h"
>> 
>> #include <QDockWidget>
>> #include <QString>
>> #include <QTimer>
>> 
>> +
>> class QTextDocument;
>> 
>> +
>> namespace lyx {
>> +
>> +class TexRow;
>> +
>> +
>> namespace frontend {
>> 
>> class GuiViewSource;
>> class LaTeXHighlighter;
>> 
>> +
>> class ViewSourceWidget : public QWidget, public Ui::ViewSourceUi
>> {
>>      Q_OBJECT
>> diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp
>> index bc174da..1f78d77 100644
>> --- a/src/graphics/PreviewLoader.cpp
>> +++ b/src/graphics/PreviewLoader.cpp
>> @@ -25,6 +25,7 @@
>> #include "output.h"
>> #include "OutputParams.h"
>> #include "TexRow.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/Application.h" // hexName
>> 
>> @@ -625,8 +626,7 @@ void PreviewLoader::Impl::startLoading(bool wait)
>>              return;
>>      }
>> 
>> -    TexRow texrow;
>> -    otexstream os(of, texrow);
>> +    otexstream os(of);
>>      OutputParams runparams(&enc);
>>      LaTeXFeatures features(buffer_, buffer_.params(), runparams);
>> 
>> diff --git a/src/graphics/epstools.cpp b/src/graphics/epstools.cpp
>> index 17aedfc..2fd67dc 100644
>> --- a/src/graphics/epstools.cpp
>> +++ b/src/graphics/epstools.cpp
>> @@ -26,6 +26,7 @@
>> #include "Format.h"
>> 
>> #include "support/debug.h"
>> +#include "support/docstream.h"
>> #include "support/filetools.h"
>> #include "support/FileName.h"
>> #include "support/regex.h"
>> diff --git a/src/insets/ExternalSupport.cpp b/src/insets/ExternalSupport.cpp
>> index 7ea6d56..f208a95 100644
>> --- a/src/insets/ExternalSupport.cpp
>> +++ b/src/insets/ExternalSupport.cpp
>> @@ -22,6 +22,7 @@
>> #include "Exporter.h"
>> #include "Format.h"
>> #include "Mover.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/alert.h"
>> 
>> diff --git a/src/insets/ExternalSupport.h b/src/insets/ExternalSupport.h
>> index 1000735..cd42572 100644
>> --- a/src/insets/ExternalSupport.h
>> +++ b/src/insets/ExternalSupport.h
>> @@ -13,13 +13,15 @@
>> #ifndef EXTERNALSUPPORT_H
>> #define EXTERNALSUPPORT_H
>> 
>> -#include "texstream.h"
>> +#include <string>
>> +
>> 
>> namespace lyx {
>> 
>> class Buffer;
>> class ExportData;
>> class InsetExternalParams;
>> +class otexstream;
>> 
>> namespace external {
>> 
>> diff --git a/src/insets/InsetArgument.cpp b/src/insets/InsetArgument.cpp
>> index b65257a..da807d2 100644
>> --- a/src/insets/InsetArgument.cpp
>> +++ b/src/insets/InsetArgument.cpp
>> @@ -24,6 +24,8 @@
>> #include "Lexer.h"
>> #include "OutputParams.h"
>> #include "ParIterator.h"
>> +#include "TexRow.h"
>> +#include "texstream.h"
>> 
>> #include "support/convert.h"
>> #include "support/debug.h"
>> @@ -268,9 +270,8 @@ void InsetArgument::latexArgument(otexstream & os,
>>              OutputParams const & runparams_in, docstring const & ldelim,
>>              docstring const & rdelim, docstring const & presetarg) const
>> {
>> -    TexRow texrow;
>>      odocstringstream ss;
>> -    otexstream ots(ss, texrow);
>> +    otexstream ots(ss);
>>      OutputParams runparams = runparams_in;
>>      if (!pass_thru_chars_.empty())
>>              runparams.pass_thru_chars += pass_thru_chars_;
>> @@ -281,6 +282,7 @@ void InsetArgument::latexArgument(otexstream & os,
>>              str = presetarg + sep + str;
>>      if (ldelim != "{" && support::contains(str, rdelim))
>>              str = '{' + str + '}';
>> +    // TODO: append texrow information
>>      os << ldelim << str << rdelim;
>> }
>> 
>> diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp
>> index e3202ec..13c91b0 100644
>> --- a/src/insets/InsetBibtex.cpp
>> +++ b/src/insets/InsetBibtex.cpp
>> @@ -27,6 +27,7 @@
>> #include "output_xhtml.h"
>> #include "OutputParams.h"
>> #include "PDFOptions.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> 
>> #include "frontends/alert.h"
>> diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp
>> index ea18afa..28d79c0 100644
>> --- a/src/insets/InsetBox.cpp
>> +++ b/src/insets/InsetBox.cpp
>> @@ -27,6 +27,8 @@
>> #include "Lexer.h"
>> #include "MetricsInfo.h"
>> #include "output_xhtml.h"
>> +#include "TexRow.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> 
>> #include "support/debug.h"
>> diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp
>> index 05b7dc7..613249b 100644
>> --- a/src/insets/InsetCaption.cpp
>> +++ b/src/insets/InsetCaption.cpp
>> @@ -32,6 +32,8 @@
>> #include "OutputParams.h"
>> #include "Paragraph.h"
>> #include "ParIterator.h"
>> +#include "TexRow.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "TextMetrics.h"
>> #include "TocBackend.h"
>> diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp
>> index 2b9033f..13fddd7 100644
>> --- a/src/insets/InsetCitation.cpp
>> +++ b/src/insets/InsetCitation.cpp
>> @@ -24,6 +24,7 @@
>> #include "LaTeXFeatures.h"
>> #include "output_xhtml.h"
>> #include "ParIterator.h"
>> +#include "texstream.h"
>> #include "TocBackend.h"
>> 
>> #include "support/debug.h"
>> diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp
>> index fcda3cd..879d9a3 100644
>> --- a/src/insets/InsetCommand.cpp
>> +++ b/src/insets/InsetCommand.cpp
>> @@ -21,6 +21,7 @@
>> #include "FuncStatus.h"
>> #include "Lexer.h"
>> #include "MetricsInfo.h"
>> +#include "texstream.h"
>> 
>> #include "insets/InsetBox.h"
>> #include "insets/InsetBranch.h"
>> diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp
>> index 5a7a07a..1a19748 100644
>> --- a/src/insets/InsetExternal.cpp
>> +++ b/src/insets/InsetExternal.cpp
>> @@ -30,6 +30,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_latex.h"
>> +#include "texstream.h"
>> #include "TocBackend.h"
>> 
>> #include "frontends/alert.h"
>> @@ -560,9 +561,8 @@ static bool isPreviewWanted(InsetExternalParams const & 
>> params)
>> 
>> static docstring latexString(InsetExternal const & inset)
>> {
>> -    TexRow texrow;
>>      odocstringstream ods;
>> -    otexstream os(ods, texrow);
>> +    otexstream os(ods, false);
>>      // We don't need to set runparams.encoding since it is not used by
>>      // latex().
>>      OutputParams runparams(0);
>> @@ -730,8 +730,7 @@ int InsetExternal::plaintext(odocstringstream & os,
>>      if (runparams.for_tooltip)
>>              return 0;
>> 
>> -    TexRow texrow;
>> -    otexstream ots(os, texrow);
>> +    otexstream ots(os, false);
>>      ots << '\n'; // output external material on a new line
>>      external::writeExternal(params_, "Ascii", buffer(), ots,
>>                              *(runparams.exportdata), false,
>> @@ -743,9 +742,8 @@ int InsetExternal::plaintext(odocstringstream & os,
>> int InsetExternal::docbook(odocstream & os,
>>                         OutputParams const & runparams) const
>> {
>> -    TexRow texrow;
>>      odocstringstream ods;
>> -    otexstream ots(ods, texrow);
>> +    otexstream ots(ods, false);
>>      external::writeExternal(params_, "DocBook", buffer(), ots,
>>                              *(runparams.exportdata), false,
>>                              runparams.dryrun || runparams.inComment);
>> diff --git a/src/insets/InsetFloat.cpp b/src/insets/InsetFloat.cpp
>> index ae1bf63..8d35c64 100644
>> --- a/src/insets/InsetFloat.cpp
>> +++ b/src/insets/InsetFloat.cpp
>> @@ -29,6 +29,8 @@
>> #include "Lexer.h"
>> #include "output_xhtml.h"
>> #include "ParIterator.h"
>> +#include "TexRow.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> 
>> #include "support/debug.h"
>> @@ -493,9 +495,8 @@ bool InsetFloat::allowsCaptionVariation(std::string 
>> const & newtype) const
>> 
>> docstring InsetFloat::getCaption(OutputParams const & runparams) const
>> {
>> -    TexRow texrow(false);
>>      odocstringstream ods;
>> -    otexstream os(ods, texrow);
>> +    otexstream os(ods, false);
>>      getCaption(os, runparams);
>>      return ods.str();
>> }
>> @@ -514,15 +515,14 @@ void InsetFloat::getCaption(otexstream & os,
>>      ins->getArgs(os, runparams);
>> 
>>      os << '[';
>> -    TexRow texrow;
>>      odocstringstream ods;
>> -    otexstream oss(ods, texrow);
>> +    otexstream oss(ods);
>>      ins->getArgument(oss, runparams);
>>      docstring arg = ods.str();
>>      // Protect ']'
>>      if (arg.find(']') != docstring::npos)
>>              arg = '{' + arg + '}';
>> -    os.append(arg, texrow);
>> +    os.append(arg, move(oss.texrow()));
>>      os << ']';
>> }
>> 
>> diff --git a/src/insets/InsetFloatList.cpp b/src/insets/InsetFloatList.cpp
>> index 6deb46c..2d9c33d 100644
>> --- a/src/insets/InsetFloatList.cpp
>> +++ b/src/insets/InsetFloatList.cpp
>> @@ -26,6 +26,7 @@
>> #include "Lexer.h"
>> #include "Paragraph.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "TocBackend.h"
>> 
>> diff --git a/src/insets/InsetGraphics.cpp b/src/insets/InsetGraphics.cpp
>> index dc617fb..85f1a07 100644
>> --- a/src/insets/InsetGraphics.cpp
>> +++ b/src/insets/InsetGraphics.cpp
>> @@ -68,6 +68,7 @@ TODO
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> #include "sgml.h"
>> +#include "texstream.h"
>> #include "TocBackend.h"
>> 
>> #include "frontends/alert.h"
>> diff --git a/src/insets/InsetHyperlink.cpp b/src/insets/InsetHyperlink.cpp
>> index 54f1f2c..8b3433c 100644
>> --- a/src/insets/InsetHyperlink.cpp
>> +++ b/src/insets/InsetHyperlink.cpp
>> @@ -22,6 +22,7 @@
>> #include "LaTeXFeatures.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "support/docstream.h"
>> #include "support/FileName.h"
>> diff --git a/src/insets/InsetIPA.cpp b/src/insets/InsetIPA.cpp
>> index 1da5a24..3876358 100644
>> --- a/src/insets/InsetIPA.cpp
>> +++ b/src/insets/InsetIPA.cpp
>> @@ -22,6 +22,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "RenderPreview.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/Painter.h"
>> 
>> @@ -120,9 +121,8 @@ void InsetIPA::addPreview(DocIterator const & inset_pos,
>> 
>> void InsetIPA::preparePreview(DocIterator const & pos) const  
>> {
>> -    TexRow texrow;
>> -    odocstringstream str;  
>> -    otexstream os(str, texrow);
>> +    odocstringstream str;
>> +    otexstream os(str, false);
>>      OutputParams runparams(&pos.buffer()->params().encoding());
>>      latex(os, runparams);
>>      docstring const snippet = str.str();
>> diff --git a/src/insets/InsetIPAMacro.cpp b/src/insets/InsetIPAMacro.cpp
>> index fd96a19..0d7a41b 100644
>> --- a/src/insets/InsetIPAMacro.cpp
>> +++ b/src/insets/InsetIPAMacro.cpp
>> @@ -23,6 +23,7 @@
>> #include "Lexer.h"
>> #include "MetricsInfo.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/FontMetrics.h"
>> #include "frontends/Painter.h"
>> diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp
>> index 1031f3a..47c9a61 100644
>> --- a/src/insets/InsetInclude.cpp
>> +++ b/src/insets/InsetInclude.cpp
>> @@ -36,6 +36,7 @@
>> #include "output_plaintext.h"
>> #include "output_xhtml.h"
>> #include "OutputParams.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "TocBackend.h"
>> 
>> @@ -1085,9 +1086,8 @@ bool preview_wanted(InsetCommandParams const & params, 
>> Buffer const & buffer)
>> 
>> docstring latexString(InsetInclude const & inset)
>> {
>> -    TexRow texrow;
>>      odocstringstream ods;
>> -    otexstream os(ods, texrow);
>> +    otexstream os(ods, false);
>>      // We don't need to set runparams.encoding since this will be done
>>      // by latex() anyway.
>>      OutputParams runparams(0);
>> diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp
>> index aff4080..5c8a9dd 100644
>> --- a/src/insets/InsetIndex.cpp
>> +++ b/src/insets/InsetIndex.cpp
>> @@ -28,6 +28,7 @@
>> #include "output_latex.h"
>> #include "output_xhtml.h"
>> #include "sgml.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "TocBackend.h"
>> 
>> @@ -74,9 +75,8 @@ void InsetIndex::latex(otexstream & os, OutputParams const 
>> & runparams_in) const
>>      }
>> 
>>      // get contents of InsetText as LaTeX and plaintext
>> -    TexRow texrow;
>>      odocstringstream ourlatex;
>> -    otexstream ots(ourlatex, texrow);
>> +    otexstream ots(ourlatex);
>>      InsetText::latex(ots, runparams);
>>      odocstringstream ourplain;
>>      InsetText::plaintext(ourplain, runparams);
>> diff --git a/src/insets/InsetLine.cpp b/src/insets/InsetLine.cpp
>> index 087dba7..73ce540 100644
>> --- a/src/insets/InsetLine.cpp
>> +++ b/src/insets/InsetLine.cpp
>> @@ -25,6 +25,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> #include "Text.h"
>> 
>> #include "frontends/FontMetrics.h"
>> diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp
>> index 91125d8..e4b8c7f 100644
>> --- a/src/insets/InsetListings.cpp
>> +++ b/src/insets/InsetListings.cpp
>> @@ -30,6 +30,7 @@
>> #include "output_xhtml.h"
>> #include "OutputParams.h"
>> #include "TextClass.h"
>> +#include "texstream.h"
>> 
>> #include "support/debug.h"
>> #include "support/docstream.h"
>> @@ -395,9 +396,8 @@ docstring InsetListings::getCaption(OutputParams const & 
>> runparams) const
>>      if (ins == 0)
>>              return docstring();
>> 
>> -    TexRow texrow;
>>      odocstringstream ods;
>> -    otexstream os(ods, texrow);
>> +    otexstream os(ods, false);
>>      ins->getArgs(os, runparams);
>>      ins->getArgument(os, runparams);
>> 
>> diff --git a/src/insets/InsetNewline.cpp b/src/insets/InsetNewline.cpp
>> index 99cbf14..411da12 100644
>> --- a/src/insets/InsetNewline.cpp
>> +++ b/src/insets/InsetNewline.cpp
>> @@ -21,6 +21,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/Application.h"
>> #include "frontends/FontMetrics.h"
>> diff --git a/src/insets/InsetNewpage.cpp b/src/insets/InsetNewpage.cpp
>> index 418bf8b..b369ce1 100644
>> --- a/src/insets/InsetNewpage.cpp
>> +++ b/src/insets/InsetNewpage.cpp
>> @@ -20,6 +20,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> #include "Text.h"
>> #include "TextMetrics.h"
>> 
>> diff --git a/src/insets/InsetNomencl.cpp b/src/insets/InsetNomencl.cpp
>> index f75ef15..2595b14 100644
>> --- a/src/insets/InsetNomencl.cpp
>> +++ b/src/insets/InsetNomencl.cpp
>> @@ -31,6 +31,7 @@
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> #include "sgml.h"
>> +#include "texstream.h"
>> #include "TocBackend.h"
>> 
>> #include "frontends/FontMetrics.h"
>> diff --git a/src/insets/InsetPhantom.cpp b/src/insets/InsetPhantom.cpp
>> index c6efe9a..8fb9d94 100644
>> --- a/src/insets/InsetPhantom.cpp
>> +++ b/src/insets/InsetPhantom.cpp
>> @@ -28,6 +28,7 @@
>> #include "Lexer.h"
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> 
>> #include "support/docstream.h"
>> diff --git a/src/insets/InsetPreview.cpp b/src/insets/InsetPreview.cpp
>> index 7577741..53cfb23 100644
>> --- a/src/insets/InsetPreview.cpp
>> +++ b/src/insets/InsetPreview.cpp
>> @@ -19,6 +19,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "RenderPreview.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/Painter.h"
>> 
>> @@ -81,9 +82,8 @@ void InsetPreview::addPreview(DocIterator const & 
>> inset_pos,
>> 
>> void InsetPreview::preparePreview(DocIterator const & pos) const
>> {
>> -    TexRow texrow;
>>      odocstringstream str;
>> -    otexstream os(str, texrow);
>> +    otexstream os(str, false);
>>      OutputParams runparams(&pos.buffer()->params().encoding());
>>      latex(os, runparams);
>> 
>> diff --git a/src/insets/InsetQuotes.cpp b/src/insets/InsetQuotes.cpp
>> index ba5a127..84e004b 100644
>> --- a/src/insets/InsetQuotes.cpp
>> +++ b/src/insets/InsetQuotes.cpp
>> @@ -24,6 +24,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/FontMetrics.h"
>> #include "frontends/Painter.h"
>> diff --git a/src/insets/InsetRef.cpp b/src/insets/InsetRef.cpp
>> index 7731ad8..146a85d 100644
>> --- a/src/insets/InsetRef.cpp
>> +++ b/src/insets/InsetRef.cpp
>> @@ -23,6 +23,7 @@
>> #include "output_xhtml.h"
>> #include "ParIterator.h"
>> #include "sgml.h"
>> +#include "texstream.h"
>> #include "TocBackend.h"
>> 
>> #include "support/debug.h"
>> diff --git a/src/insets/InsetSeparator.cpp b/src/insets/InsetSeparator.cpp
>> index 27aeb7c..9beda1d 100644
>> --- a/src/insets/InsetSeparator.cpp
>> +++ b/src/insets/InsetSeparator.cpp
>> @@ -20,6 +20,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/Application.h"
>> #include "frontends/FontMetrics.h"
>> diff --git a/src/insets/InsetSpace.cpp b/src/insets/InsetSpace.cpp
>> index 6ab6f9a..7d76f3f 100644
>> --- a/src/insets/InsetSpace.cpp
>> +++ b/src/insets/InsetSpace.cpp
>> @@ -27,6 +27,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "support/debug.h"
>> #include "support/docstream.h"
>> diff --git a/src/insets/InsetSpecialChar.cpp 
>> b/src/insets/InsetSpecialChar.cpp
>> index 8671d2b..3d32f40 100644
>> --- a/src/insets/InsetSpecialChar.cpp
>> +++ b/src/insets/InsetSpecialChar.cpp
>> @@ -20,6 +20,7 @@
>> #include "Lexer.h"
>> #include "MetricsInfo.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> 
>> #include "frontends/FontMetrics.h"
>> #include "frontends/Painter.h"
>> diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
>> index 7804232..0834f1a 100644
>> --- a/src/insets/InsetTabular.cpp
>> +++ b/src/insets/InsetTabular.cpp
>> @@ -45,6 +45,8 @@
>> #include "Paragraph.h"
>> #include "ParagraphParameters.h"
>> #include "ParIterator.h"
>> +#include "TexRow.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "TextMetrics.h"
>> 
>> @@ -2685,8 +2687,7 @@ void Tabular::TeXRow(otexstream & os, row_type row,
>> void Tabular::latex(otexstream & os, OutputParams const & runparams) const
>> {
>>      bool const is_tabular_star = !tabular_width.zero();
>> -    TexRow::RowEntry pos = TexRow::textEntry(runparams.lastid,
>> -                                                                            
>>          runparams.lastpos);
>> +    RowEntry pos = TexRow::textEntry(runparams.lastid, runparams.lastpos);
>> 
>>      //+---------------------------------------------------------------------
>>      //+                      first the opening preamble                    +
>> diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
>> index 99b1381..b67f6b4 100644
>> --- a/src/insets/InsetText.cpp
>> +++ b/src/insets/InsetText.cpp
>> @@ -48,6 +48,7 @@
>> #include "Row.h"
>> #include "sgml.h"
>> #include "TexRow.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> #include "Text.h"
>> #include "TextMetrics.h"
>> diff --git a/src/insets/InsetVSpace.cpp b/src/insets/InsetVSpace.cpp
>> index 7edbebf..461933c 100644
>> --- a/src/insets/InsetVSpace.cpp
>> +++ b/src/insets/InsetVSpace.cpp
>> @@ -24,6 +24,7 @@
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> #include "Text.h"
>> 
>> #include "support/debug.h"
>> diff --git a/src/insets/InsetWrap.cpp b/src/insets/InsetWrap.cpp
>> index 00223ad..c8c0ef8 100644
>> --- a/src/insets/InsetWrap.cpp
>> +++ b/src/insets/InsetWrap.cpp
>> @@ -27,6 +27,7 @@
>> #include "LaTeXFeatures.h"
>> #include "Lexer.h"
>> #include "output_xhtml.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> 
>> #include "support/debug.h"
>> diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
>> index 69a9b80..cc8d1cf 100644
>> --- a/src/lyxfind.cpp
>> +++ b/src/lyxfind.cpp
>> @@ -727,9 +727,8 @@ private:
>> static docstring buffer_to_latex(Buffer & buffer)
>> {
>>      OutputParams runparams(&buffer.params().encoding());
>> -    TexRow texrow(false);
>>      odocstringstream ods;
>> -    otexstream os(ods, texrow);
>> +    otexstream os(ods, false);
>>      runparams.nice = true;
>>      runparams.flavor = OutputParams::LATEX;
>>      runparams.linelen = 80; //lyxrc.plaintext_linelen;
>> @@ -1048,9 +1047,8 @@ docstring latexifyFromCursor(DocIterator const & cur, 
>> int len)
>>      Buffer const & buf = *cur.buffer();
>>      LBUFERR(buf.params().isLatex());
>> 
>> -    TexRow texrow(false);
>>      odocstringstream ods;
>> -    otexstream os(ods, texrow);
>> +    otexstream os(ods, false);
>>      OutputParams runparams(&buf.params().encoding());
>>      runparams.nice = false;
>>      runparams.flavor = OutputParams::LATEX;
>> @@ -1395,9 +1393,8 @@ static void findAdvReplace(BufferView * bv, 
>> FindAndReplaceOptions const & opt, M
>>              LYXERR(Debug::FIND, "After pasteParagraphList() cur=" << cur << 
>> endl);
>>              sel_len = repl_buffer.paragraphs().begin()->size();
>>      } else if (cur.inMathed()) {
>> -            TexRow texrow(false);
>>              odocstringstream ods;
>> -            otexstream os(ods, texrow);
>> +            otexstream os(ods, false);
>>              OutputParams runparams(&repl_buffer.params().encoding());
>>              runparams.nice = false;
>>              runparams.flavor = OutputParams::LATEX;
>> diff --git a/src/mathed/InsetMath.cpp b/src/mathed/InsetMath.cpp
>> index f71febc..87952f5 100644
>> --- a/src/mathed/InsetMath.cpp
>> +++ b/src/mathed/InsetMath.cpp
>> @@ -53,8 +53,7 @@ void InsetMath::dump() const
>> {
>>      lyxerr << "---------------------------------------------" << endl;
>>      odocstringstream os;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(os,texrow);
>> +    otexrowstream ots(os, false);
>>      WriteStream wi(ots, false, true, WriteStream::wsDefault);
>>      write(wi);
>>      lyxerr << to_utf8(os.str());
>> @@ -158,8 +157,7 @@ HullType InsetMath::getType() const
>> ostream & operator<<(ostream & os, MathAtom const & at)
>> {
>>      odocstringstream oss;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(oss,texrow);
>> +    otexrowstream ots(oss, false);
>>      WriteStream wi(ots, false, false, WriteStream::wsDefault);
>>      at->write(wi);
>>      return os << to_utf8(oss.str());
>> @@ -168,8 +166,7 @@ ostream & operator<<(ostream & os, MathAtom const & at)
>> 
>> odocstream & operator<<(odocstream & os, MathAtom const & at)
>> {
>> -    TexRow texrow(false);
>> -    otexrowstream ots(os,texrow);
>> +    otexrowstream ots(os, false);
>>      WriteStream wi(ots, false, false, WriteStream::wsDefault);
>>      at->write(wi);
>>      return os;
>> diff --git a/src/mathed/InsetMath.h b/src/mathed/InsetMath.h
>> index 088fce6..3bab681 100644
>> --- a/src/mathed/InsetMath.h
>> +++ b/src/mathed/InsetMath.h
>> @@ -17,8 +17,6 @@
>> 
>> #include "insets/Inset.h"
>> 
>> -#include "TexRow.h"
>> -
>> 
>> namespace lyx {
>> 
>> @@ -93,6 +91,9 @@ class TextPainter;
>> class TextMetricsInfo;
>> class ReplaceData;
>> 
>> +/// Type of unique identifiers for math insets (used in TexRow)
>> +typedef void const * uid_type;
>> +
>> 
>> class InsetMath : public Inset {
>> public:
>> diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp
>> index 1c830c1..f2d88a2 100644
>> --- a/src/mathed/InsetMathGrid.cpp
>> +++ b/src/mathed/InsetMathGrid.cpp
>> @@ -22,10 +22,11 @@
>> #include "Buffer.h"
>> #include "BufferParams.h"
>> #include "BufferView.h"
>> -#include "CutAndPaste.h"
>> -#include "FuncStatus.h"
>> #include "Cursor.h"
>> +#include "CutAndPaste.h"
>> #include "FuncRequest.h"
>> +#include "FuncStatus.h"
>> +#include "TexRow.h"
>> 
>> #include "frontends/Clipboard.h"
>> #include "frontends/Painter.h"
>> @@ -1268,8 +1269,8 @@ void InsetMathGrid::write(WriteStream & os,
>>              for (col_type col = beg_col; col < end_col;) {
>>                      int nccols = 1;
>>                      idx_type const idx = index(row, col);
>> -                    TexRow::RowEntry entry = 
>> os.texrow().mathEntry(id(),idx);
>> -                    os.texrow().startMath(id(),idx);
>> +                    RowEntry entry = TexRow::mathEntry(id(),idx);
>> +                    os.texrow().start(entry);
>>                      if (col >= lastcol) {
>>                              ++col;
>>                              continue;
>> diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp
>> index 88a4c1d..5dffc3d 100644
>> --- a/src/mathed/InsetMathHull.cpp
>> +++ b/src/mathed/InsetMathHull.cpp
>> @@ -43,6 +43,7 @@
>> #include "Paragraph.h"
>> #include "ParIterator.h"
>> #include "sgml.h"
>> +#include "TexRow.h"
>> #include "TextClass.h"
>> #include "TextPainter.h"
>> #include "TocBackend.h"
>> @@ -614,8 +615,7 @@ void InsetMathHull::metricsT(TextMetricsInfo const & mi, 
>> Dimension & dim) const
>>              InsetMathGrid::metricsT(mi, dim);
>>      } else {
>>              odocstringstream os;
>> -            TexRow texrow(false);
>> -            otexrowstream ots(os,texrow);
>> +            otexrowstream ots(os, false);
>>              WriteStream wi(ots, false, true, WriteStream::wsDefault);
>>              write(wi);
>>              dim.wid = os.str().size();
>> @@ -631,8 +631,7 @@ void InsetMathHull::drawT(TextPainter & pain, int x, int 
>> y) const
>>              InsetMathGrid::drawT(pain, x, y);
>>      } else {
>>              odocstringstream os;
>> -            TexRow texrow(false);
>> -            otexrowstream ots(os,texrow);
>> +            otexrowstream ots(os, false);
>>              WriteStream wi(ots, false, true, WriteStream::wsDefault);
>>              write(wi);
>>              pain.draw(x, y, os.str().c_str());
>> @@ -651,8 +650,7 @@ static docstring latexString(InsetMathHull const & inset)
>>      static Encoding const * encoding = 0;
>>      if (inset.isBufferValid())
>>              encoding = &(inset.buffer().params().encoding());
>> -    TexRow texrow(false);
>> -    otexrowstream ots(ls,texrow);
>> +    otexrowstream ots(ls, false);
>>      WriteStream wi(ots, false, true, WriteStream::wsPreview, encoding);
>>      inset.write(wi);
>>      return ls.str();
>> @@ -2182,8 +2180,7 @@ bool InsetMathHull::searchForward(BufferView * bv, 
>> string const & str,
>> void InsetMathHull::write(ostream & os) const
>> {
>>      odocstringstream oss;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(oss,texrow);
>> +    otexrowstream ots(oss, false);
>>      WriteStream wi(ots, false, false, WriteStream::wsDefault);
>>      oss << "Formula ";
>>      write(wi);
>> @@ -2226,8 +2223,7 @@ int InsetMathHull::plaintext(odocstringstream & os,
>>      }
>> 
>>      odocstringstream oss;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(oss,texrow);
>> +    otexrowstream ots(oss, false);
>>      Encoding const * const enc = encodings.fromLyXName("utf8");
>>      WriteStream wi(ots, false, true, WriteStream::wsDefault, enc);
>> 
>> @@ -2269,8 +2265,7 @@ int InsetMathHull::docbook(odocstream & os, 
>> OutputParams const & runparams) cons
>>      ++ms.tab(); ms.cr(); ms.os() << '<' << bname << '>';
>> 
>>      odocstringstream ls;
>> -    TexRow texrow;
>> -    otexstream ols(ls, texrow);
>> +    otexstream ols(ls);
>>      if (runparams.flavor == OutputParams::XML) {
>>              ms << MTag("alt role='tex' ");
>>              // Workaround for db2latex: db2latex always includes equations 
>> with
>> @@ -2288,7 +2283,7 @@ int InsetMathHull::docbook(odocstream & os, 
>> OutputParams const & runparams) cons
>>      } else {
>>              ms << MTag("alt role='tex'");
>>              latex(ols, runparams);
>> -            res = texrow.rows();
>> +            res = ols.texrow().rows();
>>              ms << from_utf8(subst(subst(to_utf8(ls.str()), "&", "&amp;"), 
>> "<", "&lt;"));
>>              ms << ETag("alt");
>>      }
>> @@ -2537,8 +2532,7 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, 
>> OutputParams const & op) const
>>              // Unfortunately, we cannot use latexString() because we do not 
>> want
>>              // $...$ or whatever.
>>              odocstringstream ls;
>> -            TexRow texrow(false);
>> -            otexrowstream ots(ls,texrow);
>> +            otexrowstream ots(ls, false);
>>              WriteStream wi(ots, false, true, WriteStream::wsPreview);
>>              ModeSpecifier specifier(wi, MATH_MODE);
>>              mathAsLatex(wi);
>> diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp
>> index 87b7f42..223e31a 100644
>> --- a/src/mathed/InsetMathNest.cpp
>> +++ b/src/mathed/InsetMathNest.cpp
>> @@ -52,6 +52,7 @@
>> #include "LyXRC.h"
>> #include "MetricsInfo.h"
>> #include "OutputParams.h"
>> +#include "TexRow.h"
>> #include "Text.h"
>> 
>> #include "frontends/Application.h"
>> @@ -251,8 +252,7 @@ bool InsetMathNest::idxLast(Cursor & cur) const
>> void InsetMathNest::dump() const
>> {
>>      odocstringstream oss;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(oss,texrow);
>> +    otexrowstream ots(oss, false);
>>      WriteStream os(ots);
>>      os << "---------------------------------------------\n";
>>      write(os);
>> @@ -407,8 +407,8 @@ void InsetMathNest::latex(otexstream & os, OutputParams 
>> const & runparams) const
>>                      runparams.dryrun ? WriteStream::wsDryrun : 
>> WriteStream::wsDefault,
>>                      runparams.encoding);
>>      wi.canBreakLine(os.canBreakLine());
>> -    Changer dummy = 
>> wi.changeRowEntry(os.texrow().textEntry(runparams.lastid,
>> -                                                            
>> runparams.lastpos));
>> +    Changer dummy = wi.changeRowEntry(TexRow::textEntry(runparams.lastid,
>> +                                                        runparams.lastpos));
>>      write(wi);
>>      // Reset parbreak status after a math inset.
>>      os.lastChar(0);
>> diff --git a/src/mathed/MacroTable.cpp b/src/mathed/MacroTable.cpp
>> index 9ff4bfe..5f43fa7 100644
>> --- a/src/mathed/MacroTable.cpp
>> +++ b/src/mathed/MacroTable.cpp
>> @@ -200,8 +200,7 @@ int MacroData::write(odocstream & os, bool 
>> overwriteRedefinition) const
>>      // output template
>>      MathMacroTemplate const & tmpl =
>>              static_cast<MathMacroTemplate const &>(*inset);
>> -    TexRow texrow(false);
>> -    otexrowstream ots(os,texrow);
>> +    otexrowstream ots(os, false);
>>      WriteStream wi(ots, false, true, WriteStream::wsDefault);
>>      return tmpl.write(wi, overwriteRedefinition);
>> }
>> diff --git a/src/mathed/MathFactory.cpp b/src/mathed/MathFactory.cpp
>> index 82f885b..f7c21e8 100644
>> --- a/src/mathed/MathFactory.cpp
>> +++ b/src/mathed/MathFactory.cpp
>> @@ -73,6 +73,7 @@
>> #include "LyX.h" // use_gui
>> #include "OutputParams.h"
>> 
>> +
>> using namespace std;
>> using namespace lyx::support;
>> 
>> @@ -669,9 +670,8 @@ bool createInsetMath_fromDialogStr(docstring const & 
>> str, MathData & ar)
>>              InsetSpaceParams isp(true);
>>              InsetSpace::string2params(to_utf8(str), isp);
>>              InsetSpace is(isp);
>> -            TexRow texrow;
>>              odocstringstream ods;
>> -            otexstream os(ods, texrow);
>> +            otexstream os(ods, false);
>>              Encoding const * const ascii = encodings.fromLyXName("ascii");
>>              OutputParams op(ascii);
>>              is.latex(os, op);
>> diff --git a/src/mathed/MathMacroTemplate.cpp 
>> b/src/mathed/MathMacroTemplate.cpp
>> index 5c7ae70..31250e2 100644
>> --- a/src/mathed/MathMacroTemplate.cpp
>> +++ b/src/mathed/MathMacroTemplate.cpp
>> @@ -1172,8 +1172,7 @@ void MathMacroTemplate::read(Lexer & lex)
>> void MathMacroTemplate::write(ostream & os) const
>> {
>>      odocstringstream oss;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(oss,texrow);
>> +    otexrowstream ots(oss, false);
>>      WriteStream wi(ots, false, false, WriteStream::wsDefault);
>>      oss << "FormulaMacro\n";
>>      write(wi);
>> diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp
>> index c1c0830..eb567ff 100644
>> --- a/src/mathed/MathStream.cpp
>> +++ b/src/mathed/MathStream.cpp
>> @@ -16,6 +16,8 @@
>> #include "MathData.h"
>> #include "MathExtern.h"
>> 
>> +#include "TexRow.h"
>> +
>> #include "support/docstring.h"
>> #include "support/RefChanger.h"
>> #include "support/textutils.h"
>> @@ -128,7 +130,8 @@ WriteStream::WriteStream(otexrowstream & os, bool 
>> fragile, bool latex,
>>      : os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
>>        output_(output), pendingspace_(false), pendingbrace_(false),
>>        textmode_(false), locked_(0), ascii_(0), canbreakline_(true),
>> -      line_(0), encoding_(encoding), row_entry_(TexRow::row_none)
>> +      line_(0), encoding_(encoding),
>> +      row_entry_(make_unique<RowEntry>(TexRow::row_none))
>> {}
>> 
>> 
>> @@ -177,17 +180,17 @@ void WriteStream::asciiOnly(bool ascii)
>> }
>> 
>> 
>> -Changer WriteStream::changeRowEntry(TexRow::RowEntry entry)
>> +Changer WriteStream::changeRowEntry(RowEntry entry)
>> {
>> -    return make_change(row_entry_, entry);
>> +    return make_change(*row_entry_, entry);
>> }
>> 
>> 
>> bool WriteStream::startOuterRow()
>> {
>> -    if (TexRow::isNone(row_entry_))
>> +    if (TexRow::isNone(*row_entry_))
>>              return false;
>> -    return texrow().start(row_entry_);
>> +    return texrow().start(*row_entry_);
>> }
>> 
>> 
>> diff --git a/src/mathed/MathStream.h b/src/mathed/MathStream.h
>> index a9465cc..d1cfb94 100644
>> --- a/src/mathed/MathStream.h
>> +++ b/src/mathed/MathStream.h
>> @@ -17,6 +17,7 @@
>> 
>> #include "support/Changer.h"
>> #include "support/strfwd.h"
>> +#include "support/unique_ptr.h"
>> 
>> 
>> namespace lyx {
>> @@ -25,6 +26,7 @@ class Encoding;
>> class InsetMath;
>> class MathAtom;
>> class MathData;
>> +class RowEntry;
>> 
>> //
>> // LaTeX/LyX
>> @@ -88,7 +90,7 @@ public:
>>      Encoding const * encoding() const { return encoding_; }
>> 
>>      /// Temporarily change the TexRow information about the outer row entry.
>> -    Changer changeRowEntry(TexRow::RowEntry entry);
>> +    Changer changeRowEntry(RowEntry entry);
>>      /// TexRow::starts the innermost outer math inset
>>      /// returns true if the outer row entry will appear at this line
>>      bool startOuterRow();
>> @@ -120,7 +122,8 @@ private:
>>      ///
>>      Encoding const * encoding_;
>>      /// Row entry we are in
>> -    TexRow::RowEntry row_entry_;
>> +    /// (it is a pointer to allow forward-declaration)
>> +    unique_ptr<RowEntry> row_entry_;
>> };
>> 
>> ///
>> diff --git a/src/mathed/MathSupport.cpp b/src/mathed/MathSupport.cpp
>> index e18a351..42f7376 100644
>> --- a/src/mathed/MathSupport.cpp
>> +++ b/src/mathed/MathSupport.cpp
>> @@ -919,8 +919,7 @@ bool isAlphaSymbol(MathAtom const & at)
>> docstring asString(MathData const & ar)
>> {
>>      odocstringstream os;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(os,texrow);
>> +    otexrowstream ots(os, false);
>>      WriteStream ws(ots);
>>      ws << ar;
>>      return os.str();
>> @@ -938,8 +937,7 @@ void asArray(docstring const & str, MathData & ar, 
>> Parse::flags pf)
>> docstring asString(InsetMath const & inset)
>> {
>>      odocstringstream os;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(os,texrow);
>> +    otexrowstream ots(os, false);
>>      WriteStream ws(ots);
>>      inset.write(ws);
>>      return os.str();
>> @@ -949,8 +947,7 @@ docstring asString(InsetMath const & inset)
>> docstring asString(MathAtom const & at)
>> {
>>      odocstringstream os;
>> -    TexRow texrow(false);
>> -    otexrowstream ots(os,texrow);
>> +    otexrowstream ots(os, false);
>>      WriteStream ws(ots);
>>      at->write(ws);
>>      return os.str();
>> diff --git a/src/output_latex.cpp b/src/output_latex.cpp
>> index 5d385e5..370b7a0 100644
>> --- a/src/output_latex.cpp
>> +++ b/src/output_latex.cpp
>> @@ -23,6 +23,7 @@
>> #include "OutputParams.h"
>> #include "Paragraph.h"
>> #include "ParagraphParameters.h"
>> +#include "texstream.h"
>> #include "TextClass.h"
>> 
>> #include "insets/InsetBibitem.h"
>> diff --git a/src/tex2lyx/dummy_impl.cpp b/src/tex2lyx/dummy_impl.cpp
>> index 7807a7d..7709663 100644
>> --- a/src/tex2lyx/dummy_impl.cpp
>> +++ b/src/tex2lyx/dummy_impl.cpp
>> @@ -48,19 +48,6 @@ namespace Alert {
>> 
>> 
>> //
>> -// Dummy TexRow support (needed by docstream)
>> -//
>> -
>> -
>> -void TexRow::newline()
>> -{}
>> -
>> -
>> -void TexRow::newlines(int)
>> -{}
>> -
>> -
>> -//
>> // Dummy LyXRC support
>> //
>> 
>> diff --git a/src/texstream.cpp b/src/texstream.cpp
>> index 16f8dfb..f748f8a 100644
>> --- a/src/texstream.cpp
>> +++ b/src/texstream.cpp
>> @@ -11,6 +11,9 @@
>> #include <config.h>
>> 
>> #include "texstream.h"
>> +
>> +#include "TexRow.h"
>> +
>> #include "support/lstrings.h"
>> #include "support/unicode.h"
>> 
>> @@ -30,10 +33,26 @@ using lyx::support::split;
>> namespace lyx {
>> 
>> 
>> -void otexrowstream::append(docstring const & str, TexRow const & texrow)
>> +otexrowstream::otexrowstream(odocstream & os, bool enable)
>> +    : os_(os), texrow_(make_unique<TexRow>(enable))
>> +{}
>> +
>> +
>> +otexrowstream::~otexrowstream() = default;
>> +
>> +
>> +unique_ptr<TexRow> && otexrowstream::releaseTexRow()
>> +{
>> +    auto p = make_unique<TexRow>();
>> +    swap(texrow_, p);
>> +    return move(p);
>> +}
>> +
>> +
>> +void otexrowstream::append(docstring const & str, TexRow texrow)
>> {
>>      os_ << str;
>> -    texrow_.append(texrow);
>> +    texrow_->append(move(texrow));
>> }
>> 
>> 
>> @@ -41,7 +60,7 @@ void otexrowstream::put(char_type const & c)
>> {
>>      os_.put(c);
>>      if (c == '\n')
>> -            texrow_.newline();
>> +            texrow_->newline();
>> }
>> 
>> 
>> diff --git a/src/texstream.h b/src/texstream.h
>> index c81bbf9..f6f4211 100644
>> --- a/src/texstream.h
>> +++ b/src/texstream.h
>> @@ -12,11 +12,17 @@
>> #ifndef LYX_TEXSTREAM_H
>> #define LYX_TEXSTREAM_H
>> 
>> -#include "TexRow.h"
>> #include "support/docstream.h"
>> +#include "support/unique_ptr.h"
>> 
>> namespace lyx {
>> 
>> +class TexRow;
>> +
>> +
>> +// declared below
>> +class otexstringstream;
>> +
>> /** Wrapper class for odocstream.
>>    This class is used to automatically count the lines of the exported latex
>>    code.
>> @@ -25,21 +31,24 @@ namespace lyx {
>> class otexrowstream {
>> public:
>>      ///
>> -    otexrowstream(odocstream & os, TexRow & texrow)
>> -            : os_(os), texrow_(texrow) {}
>> +    explicit otexrowstream(odocstream & os, bool enable = true);
>> +    /// defaulted
>> +    ~otexrowstream();
>>      ///
>>      odocstream & os() { return os_; }
>>      ///
>> -    TexRow & texrow() { return texrow_; }
>> +    TexRow & texrow() { return *texrow_; }
>> +    ///
>> +    unique_ptr<TexRow> && releaseTexRow();
>>      ///
>>      void put(char_type const & c);
>>      ///
>> -    void append(docstring const &, TexRow const &);
>> +    void append(docstring const & str, TexRow texrow);
>> private:
>>      ///
>>      odocstream & os_;
>>      ///
>> -    TexRow & texrow_;
>> +    unique_ptr<TexRow> texrow_;
>> };
>> 
>> ///
>> @@ -70,8 +79,8 @@ otexrowstream & operator<<(otexrowstream & ots, Type 
>> value);
>> class otexstream : public otexrowstream {
>> public:
>>      ///
>> -    otexstream(odocstream & os, TexRow & texrow)
>> -            : otexrowstream(os, texrow), canbreakline_(false),
>> +    explicit otexstream(odocstream & os, bool enable = true)
>> +            : otexrowstream(os, enable), canbreakline_(false),
>>                protectspace_(false), parbreak_(true), lastchar_(0) {}
>>      ///
>>      void put(char_type const & c);
>> @@ -135,6 +144,7 @@ otexstream & operator<<(otexstream &, char);
>> template <typename Type>
>> otexstream & operator<<(otexstream & ots, Type value);
>> 
>> +
>> }
>> 
>> #endif
> 

Reply via email to