From 2eb75da023a138ba02258479b21341a0e745f524 Mon Sep 17 00:00:00 2001 From: Pavel Sanda Date: Thu, 24 Jan 2008 01:20:51 +0000 Subject: [PATCH] PDFoptions: improve the functionality in case the hyperrref is already loaded by the textclass. Some corner cases still missing (see fixme and link below). http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg134643.html git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22660 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferParams.cpp | 10 ++-------- src/PDFOptions.cpp | 27 +++++++++++++++++++++------ src/PDFOptions.h | 2 +- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 757ec2a35c..8767047248 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -1254,15 +1254,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // * Has to be loaded before the "LyX specific LaTeX commands" to // avoid errors with algorithm floats. // use hyperref explicitely when it is required - /** FIXME: If the textclass provides hyperref, the GUI is - non-functional. To fix this, we would need requires("hyperref") - below, pass getTextClass().provides("hyperref") to - pdfoptions().writeLaTeX(oss) and load the options via - \hypersetup instead of tha package's optional argument. - **/ - if (features.mustProvide("hyperref")) { + if (features.isRequired("hyperref")) { odocstringstream oss; - pdfoptions().writeLaTeX(oss); + pdfoptions().writeLaTeX(oss, getTextClass().provides("hyperref")); lyxpreamble += oss.str(); } diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index 62794946be..a4a4fcbe4b 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -87,11 +87,10 @@ void PDFOptions::writeFile(ostream & os) const } -void PDFOptions::writeLaTeX(odocstream & os) const +void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) const { string opt; - opt = "\\usepackage["; // since LyX uses unicode, also set the PDF strings to unicode strings with the // hyperref option "unicode" opt += "unicode=true, "; @@ -123,8 +122,7 @@ void PDFOptions::writeLaTeX(odocstream & os) const if (!pagemode.empty()) opt += "pdfpagemode=" + pagemode + ','; - opt = rtrim(opt,","); - opt += "]\n {hyperref}\n"; + // load the pdftitle etc. as hypersetup, otherwise you'll get // LaTeX-errors when using non-latin characters @@ -142,8 +140,25 @@ void PDFOptions::writeLaTeX(odocstream & os) const hyperset += quoted_options_get(); } hyperset = rtrim(hyperset,","); - if (!hyperset.empty()) - opt += "\\hypersetup{" + hyperset + "}\n "; + + + // use in \\usepackage parameter as not all options can be handled inside \\hypersetup + if (!hyperref_already_provided) { + opt = rtrim(opt,","); + opt = "\\usepackage[" + opt + "]\n {hyperref}\n"; + + if (!hyperset.empty()) + opt += "\\hypersetup{" + hyperset + "}\n "; + } else + // only in case hyperref is already loaded by the current text class + // try to put it into hyperset + // + // FIXME: this still does not fix the cases where hyperref is loaded + // and the option is active only when part of usepackage parameter + // (e.g. pdfusetitle). + { + opt = "\\hypersetup{" + opt + hyperset + "}\n "; + } // FIXME UNICODE os << from_utf8(opt); diff --git a/src/PDFOptions.h b/src/PDFOptions.h index 366ce20ab8..fa25371723 100644 --- a/src/PDFOptions.h +++ b/src/PDFOptions.h @@ -30,7 +30,7 @@ public: /// output to lyx header void writeFile(std::ostream &) const; /// output to tex header - void writeLaTeX(odocstream &) const; + void writeLaTeX(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