mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 10:00:33 +00:00
* 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:
parent
5558074452
commit
de50c5248e
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user