> > > ouch. e.g. pdfusetitle stops working via \hypersetup. > > > > What we can do in these cases is to pass those options as global document > > options (if hyperref is provided by the class). > > dont know how to do. > > > (however, conflicts can not be avoided in general probably, since we do not > > know what options the classes use). > > another direction would be: > - use hyperref arguments by default > - in case text class provides hyperref only then use hypersetup > > so such option as pdfusetitle would be ignored only in beamer etc.
it will be like the patch below (more or less, really want to go sleep now;) which i propose to put into trunk for the time beeing. if you can be more verbose how the 'global document options' solution looks in latex i may try something later. opinions? pavel
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 5e884e6..c03c93f 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -1247,15 +1247,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 6279494..34504bb 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -87,11 +87,12 @@ 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 +124,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 +142,22 @@ void PDFOptions::writeLaTeX(odocstream & os) const hyperset += quoted_options_get(); } hyperset = rtrim(hyperset,","); - if (!hyperset.empty()) - opt += "\\hypersetup{" + hyperset + "}\n "; + + + // use \\usepackage parameter as not all options can be handled inside \\hypersetup + if (!hyperref_already_provided) { + opt = rtrim(opt,","); + opt = "\\usepackage[" + opt; + 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 as much as possible into hyperset + { + opt = "\\hypersetup{" + opt + hyperset + "}\n "; + { // FIXME UNICODE os << from_utf8(opt); diff --git a/src/PDFOptions.h b/src/PDFOptions.h index 366ce20..fa25371 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