* 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,11 +1534,21 @@ 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
@ -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;

View File

@ -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,7 +110,8 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con
opt += "bookmarksnumbered=" + convert<string>(bookmarksnumbered) + ',';
opt += "bookmarksopen=" + convert<string>(bookmarksopen) + ',';
if (bookmarksopen)
opt += "bookmarksopenlevel=" + convert<string>(bookmarksopenlevel) + ',';
opt += "bookmarksopenlevel="
+ convert<string>(bookmarksopenlevel) + ',';
}
opt += "\n ";
opt += "breaklinks=" + convert<string>(breaklinks) + ',';
@ -138,6 +144,17 @@ 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) {
@ -157,8 +174,21 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con
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;
}

View File

@ -12,6 +12,8 @@
#ifndef PDFOPTIONS_H
#define PDFOPTIONS_H
#include "OutputParams.h"
#include "support/strfwd.h"
#include <string>
@ -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