* handle encoding in PDF options gracefully.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33604 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2010-03-01 17:39:41 +00:00
parent 5558074452
commit de50c5248e
3 changed files with 63 additions and 22 deletions

View File

@ -1534,13 +1534,23 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
// before hyperref. Then hyperref has a chance to detect babel. // before hyperref. Then hyperref has a chance to detect babel.
// * Has to be loaded before the "LyX specific LaTeX commands" to // * Has to be loaded before the "LyX specific LaTeX commands" to
// avoid errors with algorithm floats. // avoid errors with algorithm floats.
// use hyperref explicitly when it is required // use hyperref explicitly if it is required
if (features.isRequired("hyperref")) { if (features.isRequired("hyperref")) {
odocstringstream oss; // pass what we have to stream here, since we need
pdfoptions().writeLaTeX(oss, documentClass().provides("hyperref")); // to access the stream itself in PDFOptions.
lyxpreamble += oss.str(); 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 // Will be surrounded by \makeatletter and \makeatother when not empty
docstring atlyxpreamble; docstring atlyxpreamble;
@ -1644,9 +1654,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
int const nlines = int const nlines =
int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
for (int j = 0; j != nlines; ++j) { texrow.newlines(nlines);
texrow.newline();
}
os << lyxpreamble; os << lyxpreamble;

View File

@ -4,6 +4,7 @@
* Licence details can be found in the file COPYING. * Licence details can be found in the file COPYING.
* *
* \author Pavel Sanda * \author Pavel Sanda
* \author Jürgen Spitzmüller
* *
* Full author contact details are available in file CREDITS. * Full author contact details are available in file CREDITS.
*/ */
@ -12,6 +13,7 @@
#include "PDFOptions.h" #include "PDFOptions.h"
#include "Encoding.h"
#include "Lexer.h" #include "Lexer.h"
#include "support/convert.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; string opt;
// since LyX uses unicode, also set the PDF strings to unicode strings with the // 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<string>(bookmarksnumbered) + ','; opt += "bookmarksnumbered=" + convert<string>(bookmarksnumbered) + ',';
opt += "bookmarksopen=" + convert<string>(bookmarksopen) + ','; opt += "bookmarksopen=" + convert<string>(bookmarksopen) + ',';
if (bookmarksopen) if (bookmarksopen)
opt += "bookmarksopenlevel=" + convert<string>(bookmarksopenlevel) + ','; opt += "bookmarksopenlevel="
+ convert<string>(bookmarksopenlevel) + ',';
} }
opt += "\n "; opt += "\n ";
opt += "breaklinks=" + convert<string>(breaklinks) + ','; opt += "breaklinks=" + convert<string>(breaklinks) + ',';
opt += "pdfborder={0 0 " ; opt += "pdfborder={0 0 ";
opt += (pdfborder ?'0':'1'); opt += (pdfborder ? '0' : '1');
opt += "},"; opt += "},";
opt += "backref=" + backref + ','; opt += "backref=" + backref + ',';
opt += "colorlinks=" + convert<string>(colorlinks) + ','; opt += "colorlinks=" + convert<string>(colorlinks) + ',';
if (!pagemode.empty()) if (!pagemode.empty())
opt += "pdfpagemode=" + pagemode + ','; opt += "pdfpagemode=" + pagemode + ',';
@ -125,9 +131,9 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con
// LaTeX-errors when using non-latin characters // LaTeX-errors when using non-latin characters
string hyperset; string hyperset;
if (!title.empty()) if (!title.empty())
hyperset += "pdftitle={" + title + "},"; hyperset += "pdftitle={" + title + "},";
if (!author.empty()) if (!author.empty())
hyperset += "\n pdfauthor={" + author + "},"; hyperset += "\n pdfauthor={" + author + "},";
if (!subject.empty()) if (!subject.empty())
hyperset += "\n pdfsubject={" + subject + "},"; hyperset += "\n pdfsubject={" + subject + "},";
if (!keywords.empty()) if (!keywords.empty())
@ -138,14 +144,25 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con
} }
hyperset = rtrim(hyperset,","); 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 // use in \\usepackage parameter as not all options can be handled inside \\hypersetup
if (!hyperref_already_provided) { if (!hyperref_already_provided) {
opt = rtrim(opt,","); opt = rtrim(opt, ",");
opt = "\\usepackage[" + opt + "]\n {hyperref}\n"; opt = "\\usepackage[" + opt + "]\n {hyperref}\n";
if (!hyperset.empty()) if (!hyperset.empty())
opt += "\\hypersetup{" + hyperset + "}\n "; opt += "\\hypersetup{" + hyperset + "}\n";
} else } else
// only in case hyperref is already loaded by the current text class // only in case hyperref is already loaded by the current text class
// try to put it into hyperset // 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 // and the option is active only when part of usepackage parameter
// (e.g. pdfusetitle). // (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); 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;
} }

View File

@ -12,6 +12,8 @@
#ifndef PDFOPTIONS_H #ifndef PDFOPTIONS_H
#define PDFOPTIONS_H #define PDFOPTIONS_H
#include "OutputParams.h"
#include "support/strfwd.h" #include "support/strfwd.h"
#include <string> #include <string>
@ -34,7 +36,8 @@ public:
/// output to lyx header /// output to lyx header
void writeFile(std::ostream &) const; void writeFile(std::ostream &) const;
/// output to tex header /// 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 /// read tokens from lyx header
std::string readToken(Lexer &lex, std::string const & token); std::string readToken(Lexer &lex, std::string const & token);
/// set implicit settings for hyperref /// set implicit settings for hyperref