Sie sind hier

Problem mit scrwfile und hyperref beim jeweils ersten LaTeX-Durchlauf

Hallo!

Ich weiß nicht, ob es sich um einen Fehler von hyperref oder um einen
Fehler von scrwfile handelt, aber aus irgendeinem Grunde liefert das
folgende Minimalbeispiel

\documentclass{scrartcl}
\makeatletter
\usepackage{hyperref}
\usepackage{scrwfile}
\newcount\mycount
\listfiles
\begin{document}
%   \show\@starttoc
\mycount=1
\loop
   \@starttoc{\the\mycount}%
   \addtocontents{\the\mycount}{file: \jobname.\the\mycount\\}%
   \advance\mycount by 1\relax
\ifnum\mycount<17
\repeat
\end{document}

jeweils beim _ersten_ LaTeX-Durchlauf die folgenden Fehlermeldungen:

|  ! No room for a new \write .
|  \ch@ck ...\else \errmessage {No room for a new #3}
|                                                    \fi
|  l.15 \repeat
|
|  ?
|  \tf@13=\write16
|  ! Bad number (16).
|  <recently read> \tf@13
|
|  l.15 \repeat
|
|  ?
|  ! No room for a new \write .
|  \ch@ck ...\else \errmessage {No room for a new #3}
|                                                    \fi
|  l.15 \repeat
|
|  ?
|  \tf@14=\write17
|  ! Bad number (17).
|  <recently read> \tf@14
|
|  l.15 \repeat
|
|  ?
|  ! No room for a new \write .
|  \ch@ck ...\else \errmessage {No room for a new #3}
|                                                    \fi
|  l.15 \repeat
|
|  ?
|  \tf@15=\write18
|  ! Bad number (18).
|  <recently read> \tf@15
|
|  l.15 \repeat
|
|  ?
|  ! No room for a new \write .
|  \ch@ck ...\else \errmessage {No room for a new #3}
|                                                    \fi
|  l.15 \repeat
|
|  ?
|  \tf@16=\write19
|  ! Bad number (19).
|  <recently read> \tf@16

Ich habe jetzt nicht groß Ursachenforschung betrieben, aber mir kommt es so vor,
als ob das hyperref-Paket die Eigenart hätte, nur beim ersten LaTeX-Durchlauf
das \@starttoc-Makro über den \AtBeginDocument-hook oder ähnliches nochmal
umzudefinieren und dabei die durch scrwfile nicht über diesen Hook und damit
schon vorher gegebene Definition zu überschreiben.

Hier noch der \listfiles-Auszug:

 *File List*
scrartcl.cls    2012/07/29 v3.11b KOMA-Script document class (article)
scrkbase.sty    2012/07/29 v3.11b KOMA-Script package (KOMA-Script-dependent ba
sics and keyval usage)
 scrbase.sty    2012/07/29 v3.11b KOMA-Script package (KOMA-Script-independent
basics and keyval usage)
  keyval.sty    1999/03/16 v1.13 key=value parser (DPC)
scrlfile.sty    2012/06/15 v3.12 KOMA-Script package (loading files)
tocbasic.sty    2012/04/04 v3.10b KOMA-Script package (handling toc-files)
scrsize11pt.clo    2012/07/29 v3.11b KOMA-Script font size class option (11pt)
typearea.sty    2012/07/29 v3.11b KOMA-Script package (type area)
hyperref.sty    2012/11/06 v6.83m Hypertext links for LaTeX
hobsub-hyperref.sty    2012/04/25 v1.12 Bundle oberdiek, subset hyperref (HO)
hobsub-generic.sty    2012/04/25 v1.12 Bundle oberdiek, subset generic (HO)
  hobsub.sty    2012/04/25 v1.12 Construct package bundles (HO)
infwarerr.sty    2010/04/08 v1.3 Providing info/warning/error messages (HO)
 ltxcmds.sty    2011/11/09 v1.22 LaTeX kernel commands for general use (HO)
ifluatex.sty    2010/03/01 v1.3 Provides the ifluatex switch (HO)
  ifvtex.sty    2010/03/01 v1.5 Detect VTeX and its facilities (HO)
 intcalc.sty    2007/09/27 v1.1 Expandable calculations with integers (HO)
   ifpdf.sty    2011/01/30 v2.3 Provides the ifpdf switch (HO)
etexcmds.sty    2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO)
kvsetkeys.sty    2012/04/25 v1.16 Key value parser (HO)
kvdefinekeys.sty    2011/04/07 v1.3 Define keys (HO)
pdftexcmds.sty    2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO)
pdfescape.sty    2011/11/25 v1.13 Implements pdfTeX's escape features (HO)
bigintcalc.sty    2012/04/08 v1.3 Expandable calculations on big integers (HO)
  bitset.sty    2011/01/30 v1.1 Handle bit-vector datatype (HO)
uniquecounter.sty    2011/01/30 v1.2 Provide unlimited unique counter (HO)
letltxmacro.sty    2010/09/02 v1.4 Let assignment for LaTeX macros (HO)
 hopatch.sty    2011/06/24 v1.1 Wrapper for package hooks (HO)
xcolor-patch.sty    2011/01/30 xcolor patch
atveryend.sty    2011/06/30 v1.8 Hooks at the very end of document (HO)
atbegshi.sty    2011/10/05 v1.16 At begin shipout hook (HO)
refcount.sty    2011/10/16 v3.4 Data extraction from label references (HO)
 hycolor.sty    2011/01/30 v1.7 Color options for hyperref/bookmark (HO)
 ifxetex.sty    2010/09/12 v0.6 Provides ifxetex conditional
 auxhook.sty    2011/03/04 v1.3 Hooks for auxiliary files (HO)
kvoptions.sty    2011/06/30 v3.11 Key value format for package options (HO)
  pd1enc.def    2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO)
hyperref.cfg    2002/06/06 v1.2 hyperref configuration of TeXLive
     url.sty    2006/04/12  ver 3.3  Verb mode for urls, etc.
  hdvips.def    2012/11/06 v6.83m Hyperref driver for dvips
 pdfmark.def    2012/11/06 v6.83m Hyperref definitions for pdfmark specials
rerunfilecheck.sty    2011/04/15 v1.7 Rerun checks for auxiliary files (HO)
scrwfile.sty    2012/03/05 v0.1d-alpha LaTeX2e KOMA-Script package (write and c
lone files)
 nameref.sty    2012/10/27 v2.43 Cross-referencing by name of section
gettitlestring.sty    2010/12/03 v1.4 Cleanup title references (HO)
forum: 
Bild von Markus Kohm

So ist es und noch dazu scheint es das nur zu machen, um eine weitgehend überflüssige Warnmeldung zu etwas auszugeben, was eigentlich gar nicht zum Aufgabenfeld von hyperref gehört …

Damit pfuscht es übrigens nicht nur scrwfile.sty ins Handwerk, sondern auch anderen Paketen, die \@starttoc umdefinieren, beispielsweise tocbasic.sty, falls in der Präambel \tocbasicautomode aufgerufen wird, aber auch den ganzen ams-Klassen, ltxutil.sty, reftex4.cls und sicher noch einigen anderen mehr.

Offenbar will sich der hyperref-Autor damit ersparen, nach der Aktivierung von hyperref auch mit den \contentsline-Anweisungen zurecht kommen zu müssen, die vor der Aktivierung von hyperref noch in Hilfsdateien geschrieben wurden. Aber wie er das macht, ist nicht die feine englische Art. Das könnte man an selbiger Stelle auch mit

\let\hyper@saved@starttoc\@starttoc
\def\@starttoc#1{%
  \begingroup
    \IfFileExists{\jobname.#1}{%
      \Hy@WarningNoLine{old #1 file detected, hyperref not used; run LaTeX again}%
      \let\contentsline\oldcontentsline
    }{}%
     \hyper@saved@starttoc{#1}%
  \endgroup
}

o. .ä. machen, so dass dabei ein geändertes \@starttoc nicht kaputt geht. Zumindest aber könnte hyperref testen, ob die Definition den Erwartungen entspricht, bevor es da einfach die eigene Definition drüber bügelt.

Aber Danke für den Hinweis. Ich werde mal gelegentlich sehen, wie ich da eine Lösung um hyperref (das in meinen Augen ohnehin viel zu viel per \AtBeginDocument macht) herum biege. Bis dahin gilt der Rat: scrwfile nicht zusammen mit hyperref verwenden.

Ich habe mittels filehhook-Package von Martin Scharrer einen Behelf
gebastelt, bei dem es egal zu sein scheint, ob bzw wann (vor oder nach
dem Behelf / vor oder nach dem scrwfile-Package) das hyperref-Package
geladen wird.

Ich muss aber dazu sagen, dass erstens ich das filehook-Package nicht genau
angeschaut habe und von daher nicht weiß, was für Probleme wiederum
durch dieses Package verursacht werden könnten und dass zweitens ich
mir auch nicht die Zeit genommen habe, den Behelf ausgiebig zu durchdenken/
zu testen.

In meinem konkreten Szenarium hat es jedenfalls funktioniert und damit war
ich erstmal zufrieden.

Mit freundlichem Gruß

Ulrich

\documentclass{scrartcl}
\makeatletter
%\usepackage{hyperref}
\usepackage{scrwfile}
%\usepackage{hyperref}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% BEHELF, UM MIT DEM PROBLEM UMZUGEHEN, DASS DAS HYPERREF-PAKET BEIM
% ERSTEN LATEX-DURCHLAUF DAS \@starttoc-MAKRO UMDEFINEIRT ANSTATT ES ZU
% PATCHEN:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Package filehook 2011/10/12 v0.5d Hooks for input files
% Copyright (c) 2010-2011 by Martin Scharrer <martin@scharrer-online.de>
% WWW: http://latex.scharrer-online.de/
% Code repository: https://bitbucket.org/martin_scharrer/filehook
% CTAN: http://www.ctan.org/pkg/filehook
\RequirePackage{filehook}%
\@ifpackageloaded{hyperref}%
                 {\@firstofone}%
                 {\AtEndOfFile{hyperref.sty}}%
                 {%
                   \Hy@AtBeginDocument{%
                     \ifx\scrwfile@starttoc\@starttoc
                     \else
                       \let\scrwfile@saved@starttoc\@starttoc
                       \let\@starttoc\scrwfile@starttoc
                     \fi
                   }%
                 }%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{hyperref}
\newcount\mycount
\listfiles
\begin{document}
Text
 
\mycount=1
\loop
   \@starttoc{\the\mycount}%
   \addtocontents{\the\mycount}{file: \jobname.\the\mycount\\}%
   \advance\mycount by 1\relax
\ifnum\mycount<17
\repeat
\end{document}
Bild von Markus Kohm

Einen Haken zu finden ist nicht das Problem. Davon bietet scrlfile bereits genügend. Alle Seiteneffekte zu bedenken, ist schon eher ein Problem. Außerdem will ich bei der Gelegenheit natürlich auch gleich Auswirkungen auf tocbasic berücksichtigen, falls das notwendig ist.

Bild von Markus Kohm

Ich habe nun einen Workaround für das unfreundliche Verhalten von hyperref eingebaut. Du kannst das gerne testen. Dazu benötigst Du die Dateien scrwfile.dtx und scrlogo.dtx aus dem Repository.

Comments for "Problem mit scrwfile und hyperref beim jeweils ersten LaTeX-Durchlauf" abonnieren