Sie sind hier

scrwfile.sty auch fürs Erzeugen von sehr vielen Dateien nutzen, bei denen der Dateiname nicht durch \jobname vorgegeben sein sol

Neulich habe ich LaTeX und das scrwfile-Package verwendet, um zum einen
ein in Kapitel und Abschnitte eingeteiltes pdf-Dokument zu erzeugen und
zum anderen die im pdf-Dokument bereitgestellten Informationen auch in
eine Ansammlung vieler kleiner .htm-Dateien (mehr als 1000) zu
schreiben.

( Die .htm-Dateien sind im Web-Browser durch ein Frameset mit zwei
Frames aufrufbar. Im einen Frame wird immer das Inhaltsverzeichnis
angezeigt, im anderen Frame diejenige .htm-Datei, die man im
Inhaltsverzeichnis gerade ausgewählt hat. )

Bei (La)TeX gibt es zwar nur 16 \write-Register von denen etliche von
vorneherein vergeben sind. Aber mithilfe des scrwfile-Package kann man
ja im Prinzip beliebig viele Dateien erzeugen.

Es ist aber so, dass die Dateien, die mit dem scrwfile-Package erzeugt
werden können, alle den selben durch \jobname vorgegebenen Dateinamen
haben und sich hinsichtlich ihrer Benennung nur in der
Dateinamenserweiterung unterscheiden.
Ich brauchte aber Dateien, die allesamt die selbe Dateinamenserweiterung
haben (.htm) und sich im Dateinamen unterscheiden.

Ich habe also (mittels eines Zählers) so getan, als würde ich jeder zu
erzeugenden Datei eine Zahl als Dateinamenserweiterung zuweisen:

\newcommand\my@starttoc[1]{%
  \@bsphack
  \begingroup
  \let\@input\@gobble % htm-Dateien sollen nur geschrieben,
  \@starttoc{#1}%     % aber nicht gelesen werden.
  \endgroup
  \@esphack
}%
 
 
\my@starttoc{0001}
\my@starttoc{0002}
...
\my@starttoc{1243}

Gleichzeitig habe ich zu jeder so eingeführten Dateinamenserweiterung
(bzw zu jedem Zählerwert) ein Makro definiert, welches dem jeweiligen
Zählerwert zuordnet, wie die zu schreibende Datei tatsächlich heißen
soll:

\@namedef{FileNameRepl@0001}{file0001.htm}
\@namedef{FileNameRepl@0002}{file0002.htm}
...
\@namedef{FileNameRepl@1243}{file1243.htm}

Nun musste ich nur noch scrwfile.sty leicht abwandeln:

Und zwar werden dort die externen zu schreibenden Dateien über den
\AfterReadingMainAux - Hook erzeugt und dabei wird ihnen ein Name
gegeben. Ich musste also nur dafür sorgen, dass dort nicht sofort ein
Dateiname der Form \jobname.<Extension> zugewiesen wird, sondern dass
zuerst überprüft wird, ob in Wirklichkeit ein anderer Dateiname
verwendet werden soll, d.h., ob ein Makro \FileNameRepl@<Extension>
definiert ist. Wenn so ein Makro definiert ist, muss dessen Expansion
als Dateiname verwendet werden.
Ansonsten ein Dateiname der Form \jobname.<Extension> .

Statt:

\AfterReadingMainAux{%
  \ifx\scrwfile@writefilelist\@empty\else
    \immediate\closeout\scrwfile@wrtout
    \chardef\scrwfile@wrtout\z@
    \begingroup
      \let\@writefile\scrwfile@saved@writefile
      \@for\@currext:=\scrwfile@writefilelist\do{%
        \begingroup
          \ifx\@currext\@empty\else
            \scr@ifundefinedorrelax{tf@\@currext}{%
              \typeout{Process extension: `\@currext'}%%%%%%%%%%%%%%%
              \immediate\openout\@partaux \jobname.\@currext
              \expandafter\let\csname tf@\@currext\endcsname\@partaux
              \@input@{\jobname.wrt}%
              \immediate\closeout\@partaux
            }{}%
          \fi
        \endgroup
      }%
    \endgroup
  \fi
}

also:

\AfterReadingMainAux{%
  \ifx\scrwfile@writefilelist\@empty\else
    \immediate\closeout\scrwfile@wrtout
    \chardef\scrwfile@wrtout\z@
    \begingroup
      \let\@writefile\scrwfile@saved@writefile
      \@for\@currext:=\scrwfile@writefilelist\do{%
        \begingroup
          \ifx\@currext\@empty\else
            \scr@ifundefinedorrelax{tf@\@currext}{%
              \typeout{Process extension: `\@currext'%
                \@ifundefined{FileNameRepl@\@currext}{}{%
                  -> \csname FileNameRepl@\@currext\endcsname
                }%
              }%
              \immediate\openout\@partaux
              \@ifundefined{FileNameRepl@\@currext}{%
                \jobname.\@currext
              }{%
                \csname FileNameRepl@\@currext\endcsname
              }%
              \expandafter\let\csname tf@\@currext\endcsname\@partaux
              \@input@{\jobname.wrt}%
              \immediate\closeout\@partaux
            }{}%
          \fi
        \endgroup
      }%
    \endgroup
  \fi
}

Es steht die \immediate\openout-Anweisung im scrwfile-Paket direkt in
der \AfterReadingMainAux - Anweisung.

Um zu ändern, wie sich diese \immediate\openout-Anweisung verhält,
musste ich also direkt die Datei scrwfile.sty ändern. (Habe sie dazu
natürlich unter anderem Namen abgespeichert und dazugeschrieben, dass
es sich um ein scrwfile.sty-"Plagiat" handelt.)

Wenn diese \immediate\openout-Anweisung noch in ein Makro gepackt wäre,
und statt direkt der \immediate\openout-Anweisung eben der Makroaufruf
in der \AfterReadingMainAux-Anweisung enthalten wäre, könnten Leute wie
ich das scrwfile-Package laden und danach einfach das Makro
umdefinieren, anstatt direkt am .sty-file herumzupfuschen.

(Zusätzlich könnte für die Namensersetzungen an dieser Stelle eine Liste
mit bereits vergebenen Dateinamen verwaltet werden, sodass an dieser
Stelle immer dann eine Fehlermeldung ausgegeben wird, wenn ihr ein
Element hinzugefügt werden soll, welches schon enthalten ist...)

Meine Frage:

Ist meine Art, scrwfile.sty zu verwenden, zu abwegig als dass es lohnen
würde, bei der Paketpflege auf mit derartigem verbundene Erfordernisse
einzugehen?

forum: 
Bild von Markus Kohm

Abwegig ist es nicht, aber es entspricht auch nicht ganz der Intention. Die Intention des war ja, die ganzen \newwrite und \openout, die \@starttoc (eigentlich unnötiger Weise) verursacht, zu reduzieren. Und dieses \@starttoc aus dem LaTeX-Kern arbeitet nun einmal auf \jobname. Bei ähnlichen Problemen wie Deinem wird deshalb als Endung ganz gerne mal <Nr>.\jobname verwendet. Damit hat man immer dieselbe Endung aber trotzdem für LaTeX immer eine andere.

Nichtsdestotrotz muss das Verhalten von scrwfile nicht in Stein gemeiselt sein. Im Hinterkopf habe ich da ohnehin noch den einen oder anderen Punkt, den ich mir noch einmal vornehmen wollte. Bei der Gelegenheit werde ich dann auch über Deinen Vorschlag noch einmal gründlich nachdenken.

Comments for "scrwfile.sty auch fürs Erzeugen von sehr vielen Dateien nutzen, bei denen der Dateiname nicht durch \jobname vorgegeben sein sol" abonnieren