> > > 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

Reply via email to