From de50c5248e149c183822847a201493c97879321d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Spitzm=C3=BCller?= Date: Mon, 1 Mar 2010 17:39:41 +0000 Subject: [PATCH] * handle encoding in PDF options gracefully. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33604 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferParams.cpp | 24 ++++++++++++------- src/PDFOptions.cpp | 56 ++++++++++++++++++++++++++++++++++---------- src/PDFOptions.h | 5 +++- 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 41e43e73dc..06bd898b5f 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -1534,13 +1534,23 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // before hyperref. Then hyperref has a chance to detect babel. // * Has to be loaded before the "LyX specific LaTeX commands" to // avoid errors with algorithm floats. - // use hyperref explicitly when it is required + // use hyperref explicitly if it is required if (features.isRequired("hyperref")) { - odocstringstream oss; - pdfoptions().writeLaTeX(oss, documentClass().provides("hyperref")); - lyxpreamble += oss.str(); + // pass what we have to stream here, since we need + // to access the stream itself in PDFOptions. + os << lyxpreamble; + + int lines = + int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); + + OutputParams tmp_params = features.runparams(); + lines += pdfoptions().writeLaTeX(tmp_params, os, + documentClass().provides("hyperref")); + texrow.newlines(lines); + // set back for the rest + lyxpreamble.clear(); } - + // Will be surrounded by \makeatletter and \makeatother when not empty docstring atlyxpreamble; @@ -1644,9 +1654,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, int const nlines = int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); - for (int j = 0; j != nlines; ++j) { - texrow.newline(); - } + texrow.newlines(nlines); os << lyxpreamble; diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index ecfc1d067c..af01b25b92 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author Pavel Sanda + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -12,6 +13,7 @@ #include "PDFOptions.h" +#include "Encoding.h" #include "Lexer.h" #include "support/convert.h" @@ -86,8 +88,11 @@ void PDFOptions::writeFile(ostream & os) const } -void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) const +int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, + bool hyperref_already_provided) const { + int lines = 0; + // FIXME Unicode string opt; // since LyX uses unicode, also set the PDF strings to unicode strings with the @@ -105,17 +110,18 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con opt += "bookmarksnumbered=" + convert(bookmarksnumbered) + ','; opt += "bookmarksopen=" + convert(bookmarksopen) + ','; if (bookmarksopen) - opt += "bookmarksopenlevel=" + convert(bookmarksopenlevel) + ','; + opt += "bookmarksopenlevel=" + + convert(bookmarksopenlevel) + ','; } opt += "\n "; - opt += "breaklinks=" + convert(breaklinks) + ','; + opt += "breaklinks=" + convert(breaklinks) + ','; - opt += "pdfborder={0 0 " ; - opt += (pdfborder ?'0':'1'); + opt += "pdfborder={0 0 "; + opt += (pdfborder ? '0' : '1'); opt += "},"; opt += "backref=" + backref + ','; - opt += "colorlinks=" + convert(colorlinks) + ','; + opt += "colorlinks=" + convert(colorlinks) + ','; if (!pagemode.empty()) opt += "pdfpagemode=" + pagemode + ','; @@ -125,9 +131,9 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con // LaTeX-errors when using non-latin characters string hyperset; if (!title.empty()) - hyperset += "pdftitle={" + title + "},"; + hyperset += "pdftitle={" + title + "},"; if (!author.empty()) - hyperset += "\n pdfauthor={" + author + "},"; + hyperset += "\n pdfauthor={" + author + "},"; if (!subject.empty()) hyperset += "\n pdfsubject={" + subject + "},"; if (!keywords.empty()) @@ -138,14 +144,25 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con } hyperset = rtrim(hyperset,","); + // check if the hyperref settings use an encoding that exceeds + // ours. If so, we have to switch to utf8. + Encoding const * const enc = runparams.encoding; + docstring const hs = from_utf8(hyperset); + bool need_unicode = false; + if (enc) { + for (size_t n = 0; n < hs.size(); ++n) { + if (enc->latexChar(hs[n], true) != docstring(1, hs[n])) + need_unicode = true; + } + } // use in \\usepackage parameter as not all options can be handled inside \\hypersetup if (!hyperref_already_provided) { - opt = rtrim(opt,","); + opt = rtrim(opt, ","); opt = "\\usepackage[" + opt + "]\n {hyperref}\n"; if (!hyperset.empty()) - opt += "\\hypersetup{" + hyperset + "}\n "; + opt += "\\hypersetup{" + hyperset + "}\n"; } else // only in case hyperref is already loaded by the current text class // try to put it into hyperset @@ -154,11 +171,24 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con // and the option is active only when part of usepackage parameter // (e.g. pdfusetitle). { - opt = "\\hypersetup{" + opt + hyperset + "}\n "; + opt = "\\hypersetup{" + opt + hyperset + "}\n"; } - - // FIXME UNICODE + + lines = int(count(opt.begin(), opt.end(), '\n')); + + // hyperref expects utf8! + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + os << "\\inputencoding{utf8}\n" + << setEncoding("UTF-8"); + ++lines; + } os << from_utf8(opt); + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + os << setEncoding(enc->iconvName()) + << "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n"; + ++lines; + } + return lines; } diff --git a/src/PDFOptions.h b/src/PDFOptions.h index 187e80c25f..a3e3cea14b 100644 --- a/src/PDFOptions.h +++ b/src/PDFOptions.h @@ -12,6 +12,8 @@ #ifndef PDFOPTIONS_H #define PDFOPTIONS_H +#include "OutputParams.h" + #include "support/strfwd.h" #include @@ -34,7 +36,8 @@ public: /// output to lyx header void writeFile(std::ostream &) const; /// output to tex header - void writeLaTeX(odocstream &, bool hyperref_already_provided) const; + int writeLaTeX(OutputParams &, odocstream &, + bool hyperref_already_provided) const; /// read tokens from lyx header std::string readToken(Lexer &lex, std::string const & token); /// set implicit settings for hyperref