+ if (lyxrc.language_command_end.empty())
+ os << from_ascii(subst(
+ lyxrc.language_command_begin,
+ "$$lang",
+ doc_language->babel()))
+ << endl;
+ else
+ os << from_ascii(subst(
+ lyxrc.language_command_end,
+ "$$lang",
+ language->babel()))
+ << endl;
+ texrow.newline();
+ }
+
+ // we don't need it for the last paragraph!!!
+ // Note from JMarc: we will re-add a \n explicitely in
+ // TeXEnvironment, because it is needed in this case
+ if (boost::next(pit) != paragraphs.end()) {
+ os << '\n';
+ texrow.newline();
+ }
+
+ if (boost::next(pit) != paragraphs.end() &&
+ lyxerr.debugging(Debug::LATEX))
+ lyxerr << "TeXOnePar...done " << &*boost::next(pit) << endl;
+
+ if (change_encoding) {
+ lyxerr[Debug::LATEX] << "Converting paragraph to encoding "
+ << language->encoding()->iconvName() << endl;
+ docstring const par = par_stream.str();
+ // Convert the paragraph to the 8bit encoding that we need to
+ // output.
+ std::vector<char> const encoded = lyx::ucs4_to_eightbit(par.c_str(),
+ par.size(), language->encoding()->iconvName());
+ // Interpret this as if it was in the 8 bit encoding of the
+ // document language and convert it back to UCS4. That means
+ // that faked does not contain pure UCS4 anymore, but what
+ // will be written to the output file will be correct, because
+ // the real output stream will do a UCS4 -> document language
+ // encoding conversion.
+ // This is of course a hack, but not a bigger one than mixing
+ // two encodings in one file.
+ // FIXME: Catch iconv conversion errors and display an error
+ // dialog.
+
+ // Here follows an explanation how I (gb) came to the current
+ // solution:
+
+ // codecvt facets are only used by file streams -> OK, maybe
+ // we could use file streams and not generic streams in the
+ // latex() methods? No, that does not work, we use them at
+ // several places to write to string streams.
+ // Next try: Maybe we could do something else than codecvt
+ // in our streams, and add a setEncoding() method? That
+ // does not work unless we rebuild the functionality of file
+ // and string streams, since both odocfstream and
+ // odocstringstream inherit from std::basic_ostream<docstring>
+ // and we can neither add a method to that class nor change
+ // the inheritance of the file and string streams.
+
+ // What might be possible is to encapsulate the real file and
+ // string streams in our own version, and use a homemade
+ // streambuf that would do the encoding conversion and then
+ // forward to the real stream. That would probably work, but
+ // would require far more code and a good understanding of
+ // stream buffers to get it right.
+
+ // Another idea by JMarc is to use a modifier like
+ // os << setencoding("iso-8859-1");
+ // That currently looks like the best idea.
+
+ std::vector<char_type> const faked = lyx::eightbit_to_ucs4(&(encoded[0]),
+ encoded.size(), doc_language->encoding()->iconvName());
+ std::vector<char_type>::const_iterator const end = faked.end();
+ std::vector<char_type>::const_iterator it = faked.begin();
+ for (; it != end; ++it)
+ ucs4.put(*it);