]> git.lyx.org Git - features.git/commitdiff
Load hyperref with a suitable driver
authorJuergen Spitzmueller <spitz@lyx.org>
Sun, 8 Apr 2018 17:02:01 +0000 (19:02 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 8 Apr 2018 17:02:01 +0000 (19:02 +0200)
This is mandatory for some features (such as bookmarks,pdfusetitle)
to work, and only a handful of drivers can be auto-detected by hyperref.

Fixes: #6418
lib/configure.py
lib/doc/Customization.lyx
lib/doc/de/Customization.lyx
src/Buffer.cpp
src/BufferParams.cpp
src/Converter.cpp
src/Converter.h
src/OutputParams.h
src/PDFOptions.cpp

index df07e4612962ac9b4117911f2d8cacdb96bed501..34916d8e6a1336ff4bb547267c4246e0105db544 100644 (file)
@@ -772,10 +772,10 @@ def checkFormatEntries(dtl_tools):
 def checkConverterEntries():
     ''' Check all converters (\converter entries) '''
     checkProg('the pdflatex program', ['pdflatex $$i'],
-        rc_entry = [ r'\converter pdflatex   pdf2       "%%"   "latex=pdflatex"' ])
+        rc_entry = [ r'\converter pdflatex   pdf2       "%%"   "latex=pdflatex,hyperref-driver=pdftex"' ])
 
     checkProg('XeTeX', ['xelatex $$i'],
-        rc_entry = [ r'\converter xetex      pdf4       "%%"   "latex=xelatex"' ])
+        rc_entry = [ r'\converter xetex      pdf4       "%%"   "latex=xelatex,hyperref-driver=xetex"' ])
 
     checkLuatex()
 
@@ -927,7 +927,7 @@ def checkConverterEntries():
         rc_entry = [ r'\converter rtf      html        "%%"    ""' ])
     # Do not define a converter to pdf6, ps is a pure export format
     checkProg('a PS to PDF converter', ['ps2pdf $$i $$o'],
-        rc_entry = [ r'\converter ps         pdf        "%%"   ""' ])
+        rc_entry = [ r'\converter ps         pdf        "%%"   "hyperref-driver=dvips"' ])
     #
     checkProg('a PS to TXT converter', ['pstotext $$i > $$o'],
         rc_entry = [ r'\converter ps         text2      "%%"   ""' ])
@@ -977,13 +977,13 @@ def checkConverterEntries():
         rc_entry = [ r'\converter dvi        text4      "%%"   ""' ])
     #
     checkProg('a DVI to PS converter', ['dvips -o $$o $$i'],
-        rc_entry = [ r'\converter dvi        ps         "%%"   ""' ])
+        rc_entry = [ r'\converter dvi        ps         "%%"   "hyperref-driver=dvips"' ])
     #
     checkProg('a DVI to cropped EPS converter', ['dvips -E -o $$o $$i'],
         rc_entry = [ r'\converter dvi        eps3         "%%" ""' ])
     #
-    checkProg('a DVI to PDF converter', ['dvipdfmx -o $$o $$i', 'dvipdfm -o $$o $$i'],
-        rc_entry = [ r'\converter dvi        pdf3       "%%"   ""' ])
+    checkProg('a DVI to PDF converter', ['dvipdfmx', 'dvipdfm'],
+        rc_entry = [ r'\converter dvi        pdf3       "%%  -o $$o $$i"       "hyperref-driver=%%"' ])
     #
     checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i', 'hylapex $$i'],
         rc_entry = [ r'\converter ps         fax        "%%"   ""'])
index 40b32b4f1597ae9497dc6c74a8e07c4f7cff425b..7b81ff850e36b15e06499e2627c353252fb9bbb6 100644 (file)
@@ -124,11 +124,12 @@ logicalmkup
 \papercolumns 1
 \papersides 2
 \paperpagestyle headings
-\tracking_changes false
+\tracking_changes true
 \output_changes false
 \html_math_output 0
 \html_css_as_file 0
 \html_be_strict true
+\author -712698321 "Jürgen Spitzmüller"
 \end_header
 
 \begin_body
@@ -2515,6 +2516,35 @@ value
  format:
 \end_layout
 
+\begin_layout Labeling
+\labelwidthstring 00.00.0000
+
+\change_inserted -712698321 1523206314
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1523206193
+hyperref-driver
+\end_layout
+
+\end_inset
+
+ The name of the driver that needs to be loaded with the 
+\family sans
+hyperref
+\family default
+ package for this converter.
+ The loading of the correct driver is necessary to get some PDF-specific
+ features.
+ See the 
+\family sans
+hyperref
+\family default
+ manual for details.
+\end_layout
+
 \begin_layout Labeling
 \labelwidthstring 00.00.0000
 \begin_inset Flex Code
@@ -2622,8 +2652,34 @@ $$b
 \end_layout
 
 \begin_layout Standard
-None of these last three are presently used in any of the converters that
- are installed with \SpecialChar LyX
+
+\change_inserted -712698321 1523206384
+A suitable hyperref-driver is set for some converters that are installed
+ with \SpecialChar LyX
+.
+\change_deleted -712698321 1523206388
+None of these
+\change_inserted -712698321 1523206389
+The
+\change_unchanged
+ last three
+\change_inserted -712698321 1523206400
+ flags, however,
+\change_unchanged
+ are presently 
+\change_inserted -712698321 1523206407
+not 
+\change_unchanged
+used in any of the 
+\change_inserted -712698321 1523206437
+pre-installed 
+\change_unchanged
+converters
+\change_deleted -712698321 1523206442
+ that are installed with \SpecialChar LyX
+
+\change_unchanged
 .
  
 \end_layout
index 270e385de6d2aec7213804520ccbf87ed07344e0..0420dad76e977f5948f1ff0fce89e65f22b8b684 100644 (file)
@@ -1989,6 +1989,25 @@ key=value
 \begin_layout Labeling
 \labelwidthstring 00.00.0000
 
+\family typewriter
+hyperref-driver 
+\family default
+Der Name der Treiberdatei, die für diesen Konverter mit dem 
+\family sans
+Hyperref
+\family default
+-Paket geladen werden soll.
+ Dies ist nötig, um bestimmte PDF-Features verwenden zu können.
+ Konsultieren Sie das 
+\family sans
+Hyperref
+\family default
+-Handbuch für Einzelheiten.
+\end_layout
+
+\begin_layout Labeling
+\labelwidthstring 00.00.0000
+
 \family typewriter
 parselog
 \family default
@@ -2082,9 +2101,11 @@ index
 \end_layout
 
 \begin_layout Standard
-Keines dieser Flags wird zur Zeit in einem Konverter benutzt, der zusammen
- mit \SpecialChar LyX
- installiert wird.
+Ein passender Hyperref-Treiber wird für einige mit \SpecialChar LyX
+ installierten Konverter
+ definiert.
+ Die zuletzt aufgeführten drei Flags hingegen werden zurzeit von keinem
+ der vorinstallierten Konverter verwendet.
 \end_layout
 
 \begin_layout Standard
index 09dfff970147ff3cbeaa23a025c3bfffbc23b3f3..867c4c56504717c3c282e46fa4d027d8da3b68b8 100644 (file)
@@ -4267,6 +4267,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir
                        return ExportNoPathToFormat;
                }
                runparams.flavor = converters.getFlavor(path, this);
+               runparams.hyperref_driver = converters.getHyperrefDriver(path);
                for (auto const & edge : path)
                        if (theConverters().get(edge).nice()) {
                                need_nice_file = true;
index a28f34a0310290434a27249dec234a51cbf0593b..f0be844870c8f079659574683f242380a36e2f13 100644 (file)
@@ -2094,8 +2094,8 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                OutputParams tmp_params = features.runparams();
                pdfoptions().writeLaTeX(tmp_params, os,
                                        features.isProvided("hyperref"));
-               // correctly break URLs with hyperref and dvi output
-               if (features.runparams().flavor == OutputParams::LATEX
+               // correctly break URLs with hyperref and dvi/ps output
+               if (features.runparams().hyperref_driver == "dvips"
                    && features.isAvailable("breakurl"))
                        os << "\\usepackage{breakurl}\n";
        } else if (features.isRequired("nameref"))
index d433f83c98d8581c28d45af308b0e26e699985cb..37977b46c089a7fde1030a95db8d6cbc4917df09 100644 (file)
@@ -136,6 +136,8 @@ void Converter::readFlags()
                        nice_ = true;
                else if (flag_name == "needauth")
                        need_auth_ = true;
+               else if (flag_name == "hyperref-driver")
+                       href_driver_ = flag_value;
        }
        if (!result_dir_.empty() && result_file_.empty())
                result_file_ = "index." + theFormats().extension(to_);
@@ -283,6 +285,18 @@ OutputParams::FLAVOR Converters::getFlavor(Graph::EdgePath const & path,
 }
 
 
+string Converters::getHyperrefDriver(Graph::EdgePath const & path)
+{
+       for (Graph::EdgePath::const_iterator cit = path.begin();
+            cit != path.end(); ++cit) {
+               Converter const & conv = converterlist_[*cit];
+               if (!conv.hyperref_driver().empty())
+                       return conv.hyperref_driver();
+       }
+       return string();
+}
+
+
 bool Converters::checkAuth(Converter const & conv, string const & doc_fname,
                           bool use_shell_escape)
 {
index 8f63aba5124f4f08cc33a87519299029ed514d2f..e144ca2fa46459764d6492e83b0b9ff1ec029c8e 100644 (file)
@@ -79,6 +79,8 @@ public:
        std::string const result_file() const { return result_file_; }
        ///
        std::string const parselog() const { return parselog_; }
+       ///
+       std::string const hyperref_driver() const { return href_driver_; }
 
 private:
        ///
@@ -114,6 +116,8 @@ private:
        trivstring result_file_;
        /// Command to convert the program output to a LaTeX log file format
        trivstring parselog_;
+       /// The hyperref driver
+       trivstring href_driver_;
 };
 
 
@@ -159,6 +163,8 @@ public:
        ///
        OutputParams::FLAVOR getFlavor(Graph::EdgePath const & path,
                                       Buffer const * buffer = 0);
+       ///
+       std::string getHyperrefDriver(Graph::EdgePath const & path);
        /// Flags for converting files
        enum ConversionFlags {
                /// No special flags
index 1631dac9d09d2989994bf44cafe5bfcdfc53e878..ff9491205ba90b35f2721d76acc21725019badc8 100644 (file)
@@ -172,6 +172,10 @@ public:
        */
        std::string index_command;
 
+       /** Hyperref driver
+       */
+       std::string hyperref_driver;
+
        /** Line length to use with plaintext or LaTeX export.
        */
        size_type linelen;
index a4d23ee5a96627d870981b4908b3162c460d9c47..b030baa62e93dc7784801cd0e604718c9965c12e 100644 (file)
@@ -97,6 +97,10 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os,
        string opt;
        string hyperset;
 
+       // Driver needed by specific converters
+       if (!runparams.hyperref_driver.empty())
+               opt += runparams.hyperref_driver + ",";
+
        // since LyX uses unicode, also set the PDF strings to unicode strings with the
        // hyperref option "unicode"
        opt += "unicode=true,";