% \iffalse meta-comment -*- coding: utf-8 -*- %<*package|driver> %% (C) 2006, 2009, 2012 Paul Ebermann (Hauptautor) %% (C) 2006 Rolf Niepraschk (einiges an Code gespendet) %% %% Package dateiliste - Zur Ausgabe der Liste der Dateien im Dokument. %% %% Die Datei dateiliste.dtx sowie die dazugehörige %% dateiliste.ins sowie die damit generierte %% dateiliste.sty stehen unter der %% "LaTeX Project Public License" (LPPL, zu finden %% unter http://www.latex-project.org/lppl/, sowie %% auch in den meisten TeX-Distributionen in %% texmf/docs/latex/base/lppl*.txt), Version 1.3b oder %% später (nach Wahl des Verwenders). %% %% Der 'maintenance-status' ist (zur Zeit) 'maintained'. %% %% Das heißt in etwa, die Dateien dürfen frei vertrieben werden, %% bei Änderungen (durch andere Personen als Paul Ebermann) %% ist aber der Name der Datei zu ändern. % % \fi % % \ProvideFileInfos{$Id$} % {Dokumentation fuer dateiliste.sty } % % \iffalse %<*driver> \documentclass[draft% ]% {ltxdoc} %\PassOptionsToPackage{utf8}{inputenc} \usepackage[utf8]{pauldoc}[2009/11/03] % dox liefert uns die Möglichkeit, Package-Optionen als % solche zu dokumentieren. \usepackage{dox}[2009/09/28] \doxitem{Option}{option}{Optionen} \usepackage[showpages, svn]{dateiliste} \usepackage{enumerate} \begin{filecontents}{test_datei} % Dies ist nur ein Test. \ProvidesFile{test_datei.tex}[2006/09/19 v0.0 Eine \csname @secondoftwo\expandafter\endcsname\string\%-$-Beis^p_iel-3-&-Datei ##$ mit \string{Test\string} und noch einer Gruppe. ] \end{filecontents} \errorcontextlines=20 \listfiles %\input{test_datei} %\inputencoding{utf8} \begin{document} \input{test_datei.tex} \DocInput{dateiliste.dtx} \errorcontextlines=20 \tracingmacros=2 \tracingcommands=2 \end{document} % % %This README is for version: %Tiu README (legumin) estas por versio: %Dieses README ist für Version: %\NeedsTeXFormat{LaTeX2e}[2003/12/01] %\ProvidesPackage{dateiliste}[% % % % 2012/10/13 v0.6 % % % % Ausgabe der Dateiliste (PE)] %---------------- % % Hier noch der Inhalt der Readme-Datei. %<*readme> ([de] unten - [eo] sube) ---------------- [en] % %<*en|readme> LaTeX-package 'dateiliste' - include list of used files (like \listfiles) in the document, and related features. Author: Paul Ebermann License: LPPL 1.3b or later, author-maintained (see http://www.latex-project.org/lppl/). All Documentation (other than this file) is in german. The typesetting of the documentation needs 'pauldoc' (from the same author). Additionally you'll need the packages 'ltxtable', 'tabularx', 'longtable' and 'rcsinfo'. The package comes as .dtx + .ins. Run "latex dateiliste.ins" to create the style file and the README-files (and maybe put them to texmf/tex/latex/paul/, if your docstrip is configured accordingly), (after that and maybe updating your TeX hash) run "latex dateiliste.dtx" (some times) to create the documentation. Usage ------- The package has three main features, which can be used independently, but together are specially useful. (1) automatic version infos: If you use a version control system like RCS, CVS, Subversion for your LaTeX source files, you may use the Id tag to generate the date and version number for the version string in \listfiles. Use \ProvideFileInfos{$<>Id$}{short description} (without '<>' [0]) in your file, and do a 'cvs commit' (or 'svn commit'). In the svn case, use the package-option 'svn' (or 'subversion') to indicate the parsing format to the package, and tell Subversion to expand Id: svn propset svn:keywords Id (2) include main file: Normally the "main" file (given on the command line to LaTeX) does not appear in the list given by \listfiles. This is changed by the package for the case that the file has the name \jobname.tex. (More precisely, the package adds \jobname.tex iff this file exists and it not can be determinded[1] to be already in the file list [2].) This is enabled by default and may be disabled using the package option 'noaddmain'. The macro \mainFileToList may also be invoked manually to add the main file. (3) include file list also in the (dvi) result You can use the command \printFileList[
] to include a pretty-printed version of the file list as a section (by default \section*, any sectioning command may be given as an optional argument). You also have to use \listfiles in the document preamble (otherwise you'll only get an error message). The table only appears from the second LaTeX-run, from the third one is complete, and may need some more runs to align correctly. The title, preamble and table headers may be localized with babel - translations for 'english', 'german', 'ngerman' and 'esperanto' are included. If you need something else or don't use babel, you have to redefine the following macros: \fileListName - title ("List of Files") \fileListPreamble - preamble (typeset before the table) \fileNameName - table header "file name" \dateName - table header "date" \verName - table header "version" \descriptionName - table header "description" ----- [0] The <> are inserted here to avoid Subversion expanding this line. If someone has an idea how to have this in plain format in the README (maybe with some complicated magic in the .dtx and/or .ins), please contact me. [1] this determination can be configured with the package options nocat12 - does only work with eTeX, else may give double entry cat12 - works also without eTeX, but may have some side effects to other macro packages, since it converts \@filelist to cat 12. The default setting works like cat12 on non-eTeX and like nocat12 on eTeX. [2] this may occur when you invoke LaTeX with "\input{mainfile.tex}". % %<*readme> ---------------- [de] % %<*de|readme> LaTeX-Paket 'dateiliste' - Liste der verwendeten Dateien im Dokument und verwandte Funktionen. Autor: Paul Ebermann (Paul-Ebermann@gmx.de). Lizenz: LPPL 1.3b oder später, mit Maintenance-Status "author-maintained". Siehe http://www.latex-project.org/lppl/. Geschrieben für den eigenen Gebrauch (-> http://www.math.hu-berlin.de/~ebermann/alg-script/), aber vielleicht ist es auch für andere von Nutzen. Zum Setzen der Dokumentation wird das Paket 'pauldoc' (vom selben Autor) benötigt. Das Paket kommt als .dtx + .ins. Mit "latex dateiliste.ins" wird die .sty-Datei erstellt (und eventuell gleich nach texmf/tex/latex/paul/ installiert, wenn docstrip entsprechend eingerichtet ist), mit latex dateiliste.dtx kann (danach und eventuell nach einer Aktualisierung der TeX-Dateidatenbank) die Dokumentation neu erstellt werden. Zur Verwendung siehe dateiliste.pdf. % %<*readme> ---------------- [eo] % %<*eo|readme> LaTeX-pakaĵo 'dateiliste' - Variaĵo de \DeclareRobustCommand, kiu antaŭe elprovas, ĉu la nomo jam ekzistas. Aŭtoro: Paŭlo Ebermann (Paul-Ebermann@gmx.de). Licenzo: LPPL 1.3, 'author-maintained' (-> http://www.latex-project.org/lppl/). Kreitaj por propra uzo, sed eble iom de ĝi ankaŭ uzeblas por aliaj. La dokumentaro (escepte tiu ĉi dosiero) estas nur en la germana lingvo. La pakaĵo bezonas la pakaĵojn 'ltxtable', 'longtable', 'tabularx' kaj 'rcsinfo'. Por krei la dokumentadon vi krome bezonas 'pauldoc' (de la sama aŭtoro). La pakaĵo venas en .dtx + .ins. Voku "latex dateiliste.ins" por krei la .sty-dosieron (kaj eble meti ĝin al texmf/tex/latex/paul/, se via docstrip estis konfigurita laŭe), voku "latex dateiliste.dtx" por rekrei la dokumentaron. Uzado ------- La pakaĵo konsistas el tri ĉefaj bonaĵoj, kiujn oni povas uzi sendepende, sed kune ili estas speciale utile. (1) Aŭtomataj versio-informoj. Se vi uzas versio-kontrolan sistemon kiel Subversion aŭ CVS/RCS, vi povas uzi tion por aŭtomate generi la daton kaj versi-numeron por la listo kreita de \listfiles (kaj la listo de (3).) Uzu \ProvideFileInfos{$<>Id$}{mallonga priskribo} en via dosiero, forprenu la '<>', kaj faru 'svn commit' aŭ 'cvs commit'. (CVS aŭ SVN tiam enmetos informojn, kiun \ProvideFileInfos uzos.) En la Subversion-kazo necesas antaŭe informi Subversion pri tio, ke vi volas anstataŭi 'Id' per alia afero: svn propset svn:keywords Id Ankaŭ necesas uzi la pakaĵ-opcion 'svn' aŭ 'subversion', kiel tie: \usepackage[svn]{dateiliste} (2) Aldono de ĉefa dosiero Kutime la ĉefa dosiero (kiun vi donis en la latex-voko) ne aperas en la listo kreita de \listfiles. Tion la pakaĵo ŝanĝas, se tiu dosiero havas la nomfinaĵon .tex (Pli precize, la pakaĵo aldonas '\jobname.tex', se tiu dosiero ekzistas, kaj se ne eblas eltrovi[1], ke la dosiero estas jam en la listo[2].) Tiu aldonado estas kutime ŝaltita, sed eblas malŝalti ĝin per la pakaĵ-opcio 'noaddmain'. Tiam ankaŭ eblas voki \mainFileToList por fari tion. (3) Enmetu la dosierliston en la rezulton Vi povas uzi la komandon \printFileList[
] por enmeti bele formatitan version de la dosierlisto kiel sekcio (kutime '\section*', sed vi povas uzi iun ajn sekci-komandon kiel opcia argumento) en la dokumenton. Vi krome devas uzi \listfiles en la komenca parto de la dokumento (antaŭ \begin{document}), alikaze vi nur ricevos erarmesaĝon. La tabelo nur aperos ekde la dua LaTeX-voko, kaj eble bezonos kelkajn pliajn por aspekti ĝuste. Eblas traduki la titolon de la sekcio, la antaŭtekston kaj la tabelkapoj helpe de la babel-pakaĵo - tradukojn por 'english', 'german', 'ngerman' kaj 'esperanto' la pakaĵo jam enhavas. Se vi bezonas aliajn lingvojn aŭ ne uzas 'babel', redifinu la sekvajn makroojn: \fileListName - titolo ("Listo de dosieroj") \fileListPreamble - antaŭteksto (printita inter titolo kaj tabelo) \fileNameName - tabelkapo "dosiernomo" \dateName - tabelkapo "dato" \verName - tabelkapo "versio" \descriptionName - tabelkapo "priskribo" ----- [1] Tiun determinadon vi povas konfiguri per la pakaĵ-opcioj: nocat12 - nur funkcias se vi uzas eTeX, alikaze eble la cxef-dosiero aperos dufoje. cat12 - funkcias kun aŭ sen eTeX, konvertante la enhavon de \@filelist al kategorio 12. Se vi neniun de tiuj opcioj donas, ĝi laboras kiel 'nocat12' en eTeX kaj kiel 'cat12' en ne-eTeX. [2] Tio povas okazi ekzemple, se vi invokas LaTeX kun "\input{mainfile.tex}". % % % \fi % \CheckSum{0} % % \changes{v0.0}{2006/03/23}{Erste Fassung} % \changes{v0.1a}{2006/04/05}{Kleine Änderungen der Dokumentation.} % \changes{v0.2}{2006/04/19}{README-Dateien werden jetzt auch aus % der .dtx-Datei generiert.} % \changes{v0.5}{2009/11/01}{Umstellung der Dokumentation auf Unicode.} % % \GetFileInfo{dateiliste.sty} % % % \title{Das \pack{dateiliste}-Package -- Liste der verwendeten Dateien im Dokument\thanks{% % Dieses Dokument gehört zu \pack{dateiliste}~\fileversion, % vom~\filedate.}} % \author{Paul Ebermann\thanks{E-Mail: \texttt{Paul-Ebermann@gmx.de}} % \thanks{Rolf Niepraschk (\texttt{Rolf.Niepraschk@ptb.de}) % hat das Package \pack{printfilelist} % geschrieben und mir geschickt, dessen Code bildete % die Basis % für \cs{printFileList}. Für den jetztigen Code % (insbesondere dessen Fehler) bin ich (Paul) aber % selbst verantwortlich.}} % % \maketitle % % \begin{abstract} % Dieses Paket implementiert einige Befehle, um den % Überblick über Versionen und Änderungsdaten von \LaTeX-Quelltexten % zu behalten: Automatische Versionsinfos aus dem Versionskontrollsystem % (CVS/RCS oder Subversion), Hauptdatei in der Dateiliste, % Inklusion der Dateiliste als Tabelle im Dokument. % \end{abstract} % % \tableofcontents % % % \section{Benutzerdokumentation der Befehle} % % Die drei Teile \emph{automatische Versionsinfos} (mittels % '\ProvideFileInfos'), \emph{Hauptdatei in der Dateiliste} % (mittels '\mainFileToList' bzw. der 'addmain'-Package-Option) % und \emph{Dateilisten-Ausgabe} (mittels 'printFileList') % sind unabhängig voneinander nutzbar, aber die ersten beiden % Features werden durch das letzte erst richtig nützlich, % und damit das letzte eine vernünftige Ausgabe hat, sind % die ersten beiden hilfreich. % Daher also alles in einem Package. % % \subsection{README in Englisch, Deutsch und Esperanto} % % Eine README-Datei mit einer Kurzübersicht des Paketes auf % Englisch, Deutsch und Esperanto (sowie einzel-Dateien für % diese Sprachen) kann ebenfalls mit \pack{docstrip} % aus der dtx-Datei generiert werden, die beiliegende Datei % 'dateiliste.ins' tut dies neben der Generierung der % '.sty'-Datei. % % \subsection{Automatische Versionsinfos} % % % \noindent\DescribeMacro{\ProvideFileInfos}\marg{id-string}\marg{kurzbeschreibung} % % Ändert die Informationen für die Datei, in der es aufgerufen % wurde (bzw. fügt neue hinzu). % % \meta{kurzbeschreibung} sollte eine kurze Beschreibung der Funktion/des % Inhaltes der Datei sein, optimalerweise nur ASCII-Zeichen. % % \meta{id-string} sollte ein String sein, der (im RCS-Modus) wie % \begin{quote} % '$''Id: dateiliste.dtx,v 4.1 2009/10/31 19:58:13 epaul Exp $' % \end{quote} % oder (im Subversion-Modus) wie % \begin{quote} % '$Id$' % \end{quote} % aussieht. Diesen lässt man am besten von seinem Versionskontrollsystem % produzieren -- dieses Paket unterstützt die Syntax von % RCS und CVS (RCS-Modus) sowie die Syntax von Subversion (svn). % % Der Modus kann durch Paket-Optionen ausgewählt werden: % \begin{itemize} % \item \DescribeOption{rcs}\DescribeOption{cvs} % Die Option 'rcs' oder 'cvs' wählt den RCS-Modus aus, in dem % das Datum mit '/' getrennt wird, der Dateiname von ',v' gefolgt % wird, am Ende ein Status gezeigt wird (meist 'Exp'), und die % Versionsnommer eine mit '.' getrennte Zahlenfolge ist. (Es kann % außerdem noch der Nutzername desjenigen enthalten sein, der eine % Sperre auf diese Datei hält.) % \item \DescribeOption{subversion}\DescribeOption{svn} % Die Option 'svn' oder 'subversion' wählt den Subversion-Modus % aus, in dem der Dateiname ohne Zusatz auftaucht, Datum und Uhrzeit % im ISO-8601-Format mit Zeitzonenanzeiger 'Z' dargestellt werden, % und die Versionsnummer nur eine Zahl ist. % \end{itemize} % % Aus Kompatibilitätsgründen zu früheren Versionen % dieses Paketes (vor 0.5) ist der Default-Modus (d.h. wenn keine % dieser Optionen angegeben wurde) 'rcs'. % % Wir schreiben also etwas wie %\begin{quote} % '\ProvideFileInfos{$''Id$}{Algebraische Geometrie I}' %\end{quote} % in unsere Datei (üblicherweise ziemlich am Anfang) und rufen dann % 'cvs commit' bzw. 'svn commit' auf -- dadurch werden von CVS bzw. % Subversion die passenden Informationen in unsere Arbeitskopie % eingefüllt. (Bei Subversion muss vorher % die Keyword-Ersetzung eingeschaltet werden, etwa mit % \begin{quote} % 'svn propset svn:keywords Id '\meta{dateiname}, % \end{quote} % bei CVS muss man nur darauf achten, sie nicht abzuschalten.) % Analoges geschieht auch beim Checkout. % % Das Makro sorgt dann dafür, dass in der durch '\listfiles' sowie % auch der durch '\printFileList' (siehe Abschnitt % \ref{describe:printfilelist}) % erzeugten Liste die richtigen Daten (d.h. das Commit-Datum und die % RCS/CVS/SVN-Versionsnummer) stehen. % % Dies ist besonders nützlich, wenn man ein Dokument hat, welches % sich aus mehreren Quelltextdateien zusammensetzt, welche üblicherweise % dann auch nicht immer gleichzeitig bearbeitet werden. % % \subsection{Hauptdatei in der Dateiliste} % % \DescribeMacro{\mainFileToList} % Fügt die Haupt-Datei (\meta{jobname}'.tex') am Anfang der Dateiliste % ein, falls sie existiert. Zuvor wird versucht, ein etwaiges Vorkommen % dieses Namens in der Liste aus dieser zu entfernen. % (Ein solches Vorkommen kann nur dann sein, wenn die Haupt-Datei mit % '\input{...}' geladen wurde, anstatt einfach so den Namen auf der % Kommandozeile anzugeben, oder wenn die Hauptdatei sich selbst noch % einmal einliest, wie in diesem Dokument.) % % \DescribeOption{cat12} % Die interne Funktionsweise (und damit etwaige Nebenwirkungen) % hängt davon ab, ob eine der % Package-Optionen 'cat12' oder 'nocat12' \DescribeOption{nocat12} % gegeben wurde: % \begin{itemize} % \item Mit Option 'cat12' wird die interne Liste der geladenen Dateien % in Kategorie-12-Zeichen (d.h. other) umgewandelt, um den eventuell % dort schon vorhandenen Namen der Hauptdatei zu löschen. Dies kann % Nebenwirkungen auf andere Pakete haben, wenn diese ebenfalls diese % Liste verarbeiten und dabei auf die Kategorien der Zeichen % angewiesen sind. % \item Mit Option 'nocat12' funktioniert es bei Verwendung von \eTeX\ % auch ohne die eben geschilderte Umwandlung, bei \TeX\ ist das nicht % möglich und es wird einfach so der Dateiname eingefügt -- mit dem % Effekt, dass er eventuell doppelt auftaucht. % \item Ohne diese Optionen wird bei Verwendung von \eTeX\ die % nebenwirkungsfreie Variante, ohne \eTeX\ die Kategorie-12-Variante % gewählt. % \end{itemize} % Details dazu sind im Implementationsteil nachzulesen. % % Dieses Makro wird automatisch am Ende des % Dokumentes ausgeführt, falls nicht die Package-Option 'noaddmain' % \DescribeOption{noaddmain} gesetzt wurde. % Mit 'addmain' \DescribeOption{addmain} kann das Vorgabe-Verhalten % erzwungen werden. % % \subsection{Dateilisten-Ausgabe}\label{describe:printfilelist} % \noindent\DescribeMacro{\printFileList}\oarg{gliederung} % % Fügt an der aktuellen Stelle eine Liste der im aktuellen Dokument % verwendeten Dateien (ohne die Haupt-Datei) ein. % \meta{gliederung} ist ein Gliederungsbefehl (wie '\section', % '\chapter' etc., Vorgabewert ist '\section*' (für einen % unnummerierten Abschnitt). % % Damit eine Liste ausgegeben wird, muss in der Präambel des Dokumentes % ein '\listfiles' auftauchen. (Andernfalls gibt '\printFileList' nur % eine Warnung auf der Konsole aus und tut sonst nichts.) % % Die Liste selbst ist erst ab dem zweiten \LaTeX-Lauf im Dokument zu % sehen (und enthält ab dem dritten Lauf dann auch die Dateilisten-Datei). % % \DescribeOption{showpages}\DescribeOption{noshowpages} % Die Liste wird als 4- oder 5-spaltige Tabelle gesetzt: Falls die % Option 'showpages' übergeben wurde, ist auch die Seitennummer, die % zum Ladezeitpunkt der Datei aktuell war, enthalten ($0$ für alle % Dateien, die in der Präambel geladen wurden), mit 'noshowpages' % fehlt diese Spalte. ('showpages' ist der Vorgabewert.) % % % Falls das Paket \pack{babel} vor oder nach diesem Paket geladen wird, % sind die Spaltenüberschriften, die Gliederung sowie die Präambel auch % übersetzbar -- zur Zeit werden von diesem Paket die Sprachoptionen % 'english', 'german', 'ngerman' und 'esperanto' unterstützt. Wer weitere % Übersetzungen beisteuern will, melde sich bei mir. % % Ansonsten \DescribeMacro{\fileListName}\DescribeMacro{\fileListPreamble} % \DescribeMacro{\fileNameName}\DescribeMacro{\dateName} % \DescribeMacro{\verName}\DescribeMacro{\descriptionName} kann % durch Neudefinition der Befehle % '\fileListName' (Überschrift), '\fileListPreamble' (einleitender Text, % normalerweise mit Fußnote), % sowie '\fileNameName', '\dateName', '\verName' und '\descriptionName' % (Tabellenkopf) der Inhalt der statischen Texte verändert werden. % (Auch das wirkt sich erst im folgenden \LaTeX-Lauf aus.) % % Im folgenden mal ein Beispiel aus diesem Dokument, erzeugt mit: %\begin{verbatim} % \printFileList[\subsubsection] %\end{verbatim} % % \printFileList[\subsubsection] % % \subsection{Abhängigkeiten} % % Für die Funktion des Paketes sind die Pakete \pack{rcsinfo} % (Jürgen Vollmer) im RCS-Modus bzw. \pack{svninfo} (Achim D. Bruckner) % im Subversion-Modus und \pack{ltxtable} -- damit auch \pack{tabularx}, % \pack{longtable} (alle drei von David Carlisle) und \pack{array} % (Frank Mittelbach) -- notwendig. \pack{babel} % (Johannes Braams) wird, falls ebenfalls geladen, auch genutzt. % % Falls das Paket \pack{pauldoc} (von mir) ebenfalls geladen wird, % werden einige spezielle Anpassungen getroffen. % % Für das Setzen der Doku ist außerdem \pack{pauldoc} (von mir) und % \pack{dox} (von Didier Verna) notwendig. % % Für die korrekte Erkennung, dass der Name der Hauptdatei schon in % der Liste der geladenen Dateien auftaucht, ist der primitive % \eTeX-Befehl '\scantokens' notwendig -- falls kein \eTeX\ verwendet % wird, kann eine nicht-Erkennung (und damit am Ende das % doppelte Auftauchen der Haupt-Datei) vorkommen. Details dazu bei % der Diskussion der Optionen 'cat12' und 'nocat12', sowie im % Implementations-Teil. % % \subsection{Wunschliste} % % Ein paar Ideen, die ich gerne mal umsetzen möchte, aber noch nicht dazu % gekommen bin: % % \begin{itemize} % \item eine Option, um die Datumsdarstellung in der Dateiliste auf % das ISO-Format (YYYY-MM-DD) umzustellen. % \item eine Option, um das 'v' in den Versionsnummern wegzulassen. % \item eine Möglichkeit, doppelt geladene Dateien in der Liste nicht % doppelt aufzuführen. (Das kann etwa passieren, wenn man mitten im % Dokument die Eingabe-Kodierung wechselt.) % \item eine Möglichkeit, die Liste zu filtern, und z.B. nur '.tex'-Dateien % aufzunehmen. Das könnte z.B. nützlich sein, wenn man nur die % "`Inhalts-Dateien"' eines zusammengesetzen Dokumentes aufführen will, % nicht aber alle verwendeten Package-Dateien. % \item Falls eine Versionsnummer fehlt, sollte das erkannt werden, und % die Spalte leergelassen werden, anstatt den Beschreibungs-Text in die % Versionsspalte zu setzen. % \end{itemize} % % \StopEventually{\PrintChanges\PrintIndex} % % \makeatother % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % \makeatletter % % \DoNotIndex{\',\@currname,\^,\begin,\end,\begingroup,\endgroup, % \csname,\endcsname,\day,\def,\DeclareOption,\do, % \edef,\else,\endinput,\expandafter,\fi,\footnote, % \IfFileExists,\ifx,\immediate,\LaTeX,\let,\makeatletter, % \makeatother,\month,\newcommand,\newif,\newwrite, % \protect,\relax,\renewcommand,\space,\string,\textbf, % \the,\two@digits,\u,\write,\xdef,\year} % % ^^A damit Seitennummern und Zeilennummern im % ^^A Index nicht durcheinanderkommen. % % \setcounter{CodelineNo}{99} % % \section{Implementation} % % \begin{macrocode} %<*package> % \end{macrocode} % % \subsection{Optionen} % \changes{v0.1}{2006/04/02}{Optionen \texttt{addmain} und \texttt{noaddmain} hinzugefügt.} % \begin{option}{addmain} % \begin{option}{noaddmain} % \begin{macro}{\if@dateiliste@addMain} % Wir merken uns die ausgewählte Option in einem '\if'. % \begin{macrocode} \newif\if@dateiliste@addMain \DeclareOption{addmain} {% \@dateiliste@addMaintrue } \DeclareOption{noaddmain} {% \@dateiliste@addMainfalse } % \end{macrocode} % \end{macro} % \end{option} % \end{option} % % \begin{option}{cat12} % \begin{option}{nocat12} % \begin{macro}{\if@dateiliste@catxii} % \begin{macro}{\if@dateiliste@nocatxii} % \changes{v0.2}{2006/04/19}{Optionen 'cat12' und 'nocat12' hinzugefügt.} % Das gleiche gilt für 'cat12'/'nocat12' -- allerdings haben wir hier % zwei '\if's, da es auch noch die Möglichkeit gibt, keine der beiden % Optionen auszuwählen. % \begin{macrocode} \newif\if@dateiliste@catxii \@dateiliste@catxiifalse \newif\if@dateiliste@nocatxii \@dateiliste@nocatxiifalse \DeclareOption{cat12} {% \@dateiliste@catxiitrue } \DeclareOption{nocat12} {% \@dateiliste@nocatxiitrue } % \end{macrocode} % \end{macro} % \end{macro} % \end{option} % \end{option} % \begin{option}{showpages} % \begin{option}{noshowpages} % \begin{macro}{\if@dateiliste@showpages} % Eine weiteres Optionspaar betrifft die Anzeige der Seitennummern % in der Dateiliste. % \begin{macrocode} \newif\if@dateiliste@showpages \@dateiliste@showpagesfalse \DeclareOption{showpages} {% \@dateiliste@showpagestrue } \DeclareOption{noshowpages} {% \@dateiliste@showpagesfalse } % \end{macrocode} % \end{macro} % \end{option} % \end{option} % % \changes{v0.5}{2009/10/31}{Optionen für Subversion-Unterstützung} % \begin{option}{svn} % \begin{option}{subversion} % \begin{option}{rcs} % \begin{option}{cvs} % \begin{macro}{\if@dateiliste@subversion} % Das vierte Optionspaar: 'svn' (mit Alias 'subversion') für % Subversion-'Id's, 'rcs' (mit Alias 'cvs') für CVS/RCS-'Id's. % Diese unterscheiden sich vor allem im Format der Datumsangaben. % (Hier merken wir uns nur die Optionen, die Arbeit geschieht in % Abschnitt \ref{versionsnummern}. % \begin{macrocode} \newif\if@dateiliste@subversion \@dateiliste@subversionfalse \DeclareOption{svn} {% \@dateiliste@subversiontrue } \DeclareOption{subversion} {% \@dateiliste@subversiontrue } \DeclareOption{cvs} {% \@dateiliste@subversionfalse } \DeclareOption{rcs} {% \@dateiliste@subversionfalse } % \end{macrocode} % \end{macro} % \end{option} % \end{option} % \end{option} % \end{option} % Die Standard-Optionen sind 'addmain', 'showpages' und 'rcs'. % \begin{macrocode} \ExecuteOptions{addmain} \ExecuteOptions{showpages} \ExecuteOptions{rcs} \ProcessOptions % \end{macrocode} % % \subsection{Seitenzahlen in die Dateiliste} % \label{showpages} % \begin{macro}{\@addtofilelist} % Falls nicht die Option 'noshowpages' angegeben wurde, % merken wir uns die Seitennummern aller eingebundenen % Dateien. Dazu definieren wir '\@addtofilelist' neu, um % neben dem Hinzufügen des Namens zur Dateiliste auch die % jeweilige Seitennummer in einem eigenen Makro zu merken. % \begin{macrocode} \if@dateiliste@showpages \CheckCommand*{\@addtofilelist}[1]{\xdef\@filelist{\@filelist,#1}} \renewcommand*{\@addtofilelist}[1]{% \expandafter\xdef% \csname dateiliste@page@#1\endcsname% {\thepage}% \xdef\@filelist{\@filelist,#1}% } \fi % \end{macrocode} % \changes{v0.5}{2009/11/03}{Seitenzahlen für Präambel-Dateien jetzt 0} % Damit die Seitennummern für in der Präambel geladene Pakete etc. % alle 0 sind, setzen wir die Seitenzahl jetzt auf 0, und bei Beginn % des Dokumentes wieder auf 1. % \begin{macrocode} \setcounter{page}{0} \AtBeginDocument{\stepcounter{page}} % \end{macrocode} % \end{macro} % % \subsection{Aktuelle Versionsnummern in der Dateiliste} % \label{versionsnummern} % Wir wollen in der durch '\ProvideFileInfo' % provozierten Ausgabe automatisch sinnvolle Infos haben, mit % Daten, die von unserem Versionskontrollsystem eingefüllt % werden. Zur Zeit unterstützen wir das Format von CVS und RCS % (schon seit Version 0.0) und das Format von Subversion (seit % Version 0.5). % % \subsubsection{Subversion-Modus} % Die Fallunterscheidung funktioniert mit diesem '\if@...', welches % durch Paket-Optionen initialisiert wurde. % \begin{macrocode} \if@dateiliste@subversion % \end{macrocode} % % Im Subversion-Modus laden wir \pack{svninfo}. % % Wir verwenden die Parameter 'nofancy', weil sonst die Fußzeile % umgestellt wird, und 'notoday', weil sonst das aktuelle Datum % umgestellt wird. 'final' verhindert, dass die Fußzeile geändert % wird (wir brauchen die Infos ja nur für unsere Dateiliste). % \changes{v0.5}{2009/10/31}{\pack{svninfo} statt \pack{rcsinfo}, falls % wir im Subversion-Modus sind.} % \begin{macrocode} \RequirePackage[nofancy, notoday, final]{svninfo}[2006/05/11] % \end{macrocode} % % \begin{macro}{\ProvideFileInfos}\noindent\marg{id-string}\marg{kurzbeschreibung} % % \changes{v0.5}{2009/11/01}{Neuimplementation für Subversion.} % % \begin{macrocode} \newcommand*{\ProvideFileInfos}[2] {% % \end{macrocode} % Zunächst lassen wir '\svnInfo' den \meta{id-string} analysieren. % Dies definiert (unter anderem) die Makros '\svnInfoFile' (der % Dateiname), '\svnInfoDay', '\svnInfoMonth' und '\svnInfoYear' (Datum) % und '\svnInfoRevision' (die Revisionsnummer, in der die Datei das % letzte mal geändert wurde). % % Das Leerzeichen nach dem '#1' ist notwendig, damit '\svnInfo' % erkennt, wo der \meta{id-string} aufhört -- in der Definition steht % da nämlich ein Leerzeichen am Ende der Parameterliste. % \begin{macrocode} \svnInfo #1 % % \end{macrocode} % % Dann rufen wir '\ProvidesFile' aus dem \LaTeX-Kernel auf. % \begin{macrocode} \ProvidesFile% % \end{macrocode} % Als erster Parameter wird der Dateiname übergeben, der von '\svnInfo' % ermittelt wurde. % \begin{macrocode} {\svnInfoFile}% % \end{macrocode} % Dann das, wofür wir das ganze eigentlich machen: Das Datum (im % Format YYYY/MM/DD, weil das von den \LaTeX-Paketen auch % so gemacht wird), ein Leerzeichen, dann die Versionsnummer % (mit einem 'v' davor). Schließlich hängen wir noch % \meta{kurzbeschreibung} an. % \begin{macrocode} [\svnInfoYear/\svnInfoMonth/\svnInfoDay\space v\svnInfoRevision\space #2]% % \end{macrocode} % '\ProvidesFile' definiert damit jetzt ein Makro ('\ver@'\meta{dateiname}) % mit diesem Text als Inhalt, welches später von '\@dofilelist' (und % unserem '\@writefilelist') verwendet wird. % % Außer dem Versionsstring wollen wir uns (falls dies per Package-Option % eingeschaltet wurde) noch die Seitennummer % merken, bei der die Datei anfing -- das macht '\addtofilelist', % welches in Abschnitt \ref{showpages} definiert wurde, und von % '\ProvidesFile' aufgerufen wird. % \begin{macrocode} } % \end{macrocode} % \end{macro} % % \subsubsection{RCS-Modus} % % \begin{macrocode} \else% \if@dateiliste@subversion % \end{macrocode} % % Im RCS-Modus laden wir das Paket \pack{rcsinfo}. % % Wir verwenden die Parameter 'nofancy', weil sonst die Fußzeile % umgestellt wird, und 'notoday', weil sonst das aktuelle Datum % umgestellt wird. % \changes{v0.1}{2006/03/30}{\pack{rcsinfo} nun mit \texttt{notoday}-Parameter.} % \begin{macrocode} \RequirePackage[nofancy, notoday]{rcsinfo} % \end{macrocode} % % \begin{macro}{\ProvideFileInfos}\noindent\marg{id-string}\marg{kurzbeschreibung} % % % \begin{macrocode} \newcommand*{\ProvideFileInfos}[2] {% % \end{macrocode} % Zunächst lassen wir '\rcsInfo' den \meta{id-string} analysieren. Dies definiert % (unter anderem) die Makros '\rcsInfoFile' (der Dateiname), '\rcsInfoDate' % (Datum, im 'YYYY/MM/DD'-Format) und '\rcsInfoRevision' (die Versionsnummer). % % Das Leerzeichen nach dem '#1' ist notwendig, damit '\rcsInfo' erkennt, wo % der \meta{id-string} aufhört - in der Definition steht da nämlich ein Leerzeichen % am Ende der Parameterliste. % \begin{macrocode} \rcsInfo #1 % % \end{macrocode} % Dann rufen wir '\ProvidesFile' aus dem \LaTeX-Kernel auf. % \begin{macrocode} \ProvidesFile% % \end{macrocode} % Als erster Parameter wird der Dateiname übergeben, der von '\rcsInfo' ermittelt wurde. % Mittels '\expandafter\@firstofone' entfernen wir dabei noch das von '\rcsInfo' (zumindest % in meiner Version) eingebaute Leerzeichen am Anfang % (welches ja einen anderen Namen ergibt und damit verhindern würde, dass die Information der % richtigen Datei zugeschrieben wird). % \begin{macrocode} {\expandafter\@firstofone\rcsInfoFile}% % \end{macrocode} % Dann das, wofür wir das ganze eigentlich machen: Das Datum, ein % Leerzeichen, dann die Versionsnummer (mit einem 'v' davor). Schließlich % hängen wir noch \meta{kurzbeschreibung} an. % \begin{macrocode} [\rcsInfoDate\space v\rcsInfoRevision\space #2]% % \end{macrocode} % '\ProvidesFile' definiert jetzt ein Makro ('\ver@'\meta{dateiname}) mit % diesem Text als Inhalt, welches später von '\@dofilelist' (und % unserem '\@writefilelist') verwendet wird. % Außer dem Versionsstring wollen wir uns (falls dies per Package-Option % eingeschaltet wurde) noch die Seitennummer % merken, bei der die Datei anfing. % \begin{macrocode} } \fi% \if@dateiliste@subversion % \end{macrocode} % \end{macro} % % \subsection{Dateiliste} % % \changes{v0.1}{2006/03/31}{\pack{ltxtable} verwendet.} % Da die Liste ziemlich lang (länger als eine Seite) werden kann, verwende % ich \pack{longtable} statt der eingebauten (oder der von \pack{array} verbesserten) % 'tabular'-Umgebung. Und damit % ich in der letzten Spalte nicht die Breite fest einstellen muss, sondern % einfach die restliche Breite (abhängig von Seitenbreite und der Breite der % anderen Spalten, welche ja abhängig vom Inhalt ist) nehmen kann, lade % ich \pack{ltxtable}, welches \pack{longtable} mit \pack{tabularx} kreuzt % (und beide Pakete auch lädt). % % \begin{macrocode} \RequirePackage{ltxtable} % \end{macrocode} % % % \begin{macro}{\dateiliste@preInclude} % \changes{v0.1}{2006/03/31}{Neu} % \begin{macro}{\dateiliste@postInclude} % \changes{v0.1}{2006/03/31}{Neu} % Diese beiden Macros werden vor bzw. nach dem % Laden (und setzen) der Dateiliste aufgerufen. % Sie sorgen dafür, dass \verb+'+ innerhalb der Liste % nicht mehr in den Verbatim-Mode schaltet, wie das % von \pack{pauldoc} eingestellt wird. % Deswegen werden sie auch nur dann so definiert, wenn % \pack{pauldoc} geladen wurde. (Und weil '\@ifpackageloaded' % nur in der Präambel erlaubt ist, müssen wir die beiden % Befehle schon zu Beginn des Dokumentes definieren, anstatt % einfach die Abfrage dann zu machen, wenn es gebraucht % wird.) % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{pauldoc}{% \newcommand*{\dateiliste@preInclude}{\DeleteShortVerb{\'}}% \newcommand*{\dateiliste@postInclude}{\MakeShortVerb{\'}}% }{% \newcommand*{\dateiliste@preInclude}{\relax}% \newcommand*{\dateiliste@postInclude}{\relax}% }% }% % \end{macrocode} % Die beiden Makros kann man sich auch selbst umdefinieren, % falls andere Pakete Inkompatibilitäten ergeben. % \end{macro} % \end{macro} % % \subsubsection{Ausgabe der Liste} % % \begin{macro}{\printFileList}\noindent\oarg{gliederung} % \changes{v0.1}{2006/04/02}{Fast komplett neue Implementation, % entsprechend auch anderes Ergebnis.} % % Der Vorgabewert für \meta{gliederung} ist '\section*', % also ein unnummerierter Abschnitt. % \begin{macrocode} \newcommand*{\printFileList}[1][\section*] {% \printFileList % \end{macrocode} % Zunächst überprüfen wir, ob '\listfiles' in der Präambel gegeben % wurde. Dies zeigt sich darin, dass das Kommando '\dofilelist' % definiert ist. Andernfalls gibt es eine Warnung, und wir machen % nichts. % \begin{macrocode} \@ifundefined{@dofilelist} {% \PackageWarning{dateiliste} { \protect\printFileList\space works only if \protect\listfiles\space is given in the preamble. } }% {% else (\@ifundefined{@dofilelist}) % \end{macrocode} % Andernfalls beginnen wir einen neuen Abschnitt (oder ein Kapitel oder was auch immer mit % \meta{gliederung} festgelegt wurde), mit Namen '\fileListName' und einem Label, % falls man mal von wo anders darauf verweisen möchte. % Danach kommt etwas beschreibender Text in '\fileListPreamble'. % \begin{macrocode} #1{\fileListName}\label{sec:filelist}% \fileListPreamble % \end{macrocode} % In der Datei \meta{jobname}'.filelist' befindet sich nach dem ersten % \LaTeX-Lauf der Inhalt der Tabelle (siehe unten). Wir überprüfen zunächst, % ob die Datei schon existiert. % \begin{macrocode} \IfFileExists{\jobname.filelist}{% % \end{macrocode} % \begin{macro}{\dateiliste@addtofilelist} % \changes{v0.1}{2006/03/31}{Neu} % \begin{macro}{\@addtofilelist} % \changes{v0.1}{2006/03/31}{neu: Umdefinition.} % Falls ja, dann definieren wir zunächst '\@addtofilelist' um, % da '\LTXtable' die Datei \meta{jobname}'.filelist' mehrfach einliest, wir % aber nur einen Eintrag in der Dateiliste haben wollen. % Wir verwenden nicht einfach '\@gobble', um in dem Fall, dass % durch das Setzen der Datei weitere Dateien (Schriften etc.) % geladen werden, diese doch aufzunehmen. (Wir vergleichen also % den Dateinamen mit dem unserer Dateinamens-Datei, und rufen % im Fall der Nichtübereinstimmung das Original-'\@addtofilelist' auf.) % \begin{macrocode} \let \dateiliste@addtofilelist = \@addtofilelist \def\@addtofilelist####1{% \edef\dateiliste@tempa{####1}% \edef\dateiliste@tempb{\jobname.filelist}\relax% \ifx\dateiliste@tempa\dateiliste@tempb \relax \else \dateiliste@addtofilelist{####1} \fi }% % \end{macrocode} % \end{macro} % \end{macro} % '\dateiliste@preInclude' schaltet \verb+'+ als verbatim-Char ab (und % das Makro '\dateiliste@postInclude' schaltet es nachher wieder an), % falls \pack{pauldoc} geladen wurde (ansonsten tun sie nichts, falls % nicht von jemand anders neudefiniert). Die % Datei selbst wird mittels '\LTXtable' geladen. % \begin{macrocode} \dateiliste@preInclude \LTXtable{\linewidth}{\jobname.filelist}% \dateiliste@postInclude % \end{macrocode} % Danach stellen wir '\@addtofilelist' wieder her und % fügen unsere Dateilisten-Datei auch hinzu. % \begin{macrocode} \let \@addtofilelist = \dateiliste@addtofilelist \@addtofilelist{\jobname.filelist}% } % \end{macrocode} % Falls \meta{jobname}'.filelist' nicht vorhanden war, geben % wir einen Hinweistext aus, dass man \LaTeX\ noch einmal % laufen lassen soll. % \begin{macrocode} {% \AtEndDocument{\PackageWarning{dateiliste}{ Run LaTeX again to include the File list. }}% }% % \end{macrocode} % % % \subsubsection{Erstellen der Liste} % % Jetzt noch ein paar Befehle, um die Listen-Datei zu generieren \ldots % (Wir sind immer noch innerhalb von '\printFileList', das alles passiert % also nur, wenn dieser Befehl aufgerufen wird.) % % Am Ende des Dokumentes -- d.h., wenn die Dateiliste vollständig gesammelt % wurde -- schreiben wir sie -- mit den passenden Formatierungsanweisungen -- % in eine Datei. % (Das ganze in einer Gruppe, damit nichts kaputtgeht, und temporäre Makros % nachher wieder freigegeben werden.) % \begin{macrocode} \AtEndDocument{% \begingroup \@writefilelist \endgroup }% % \end{macrocode} % \begin{macro}{\@writefilelist} % Eine Variante von '\@dofilelist', die den Inhalt -- als Tabellenzeilen -- in % die Datei \meta{jobname}'.filelist' schreibt. % \begin{macrocode} \newcommand*{\@writefilelist}{% \@writefilelist \newwrite\dateiliste@file \immediate\openout\dateiliste@file = \jobname.filelist % \end{macrocode} % Zunächst schreiben wir eine '\ProvidesFile'-Anweisung mit dem aktuellen Datum % in die '.filelist'-Datei. (Das hat den Effekt, dass diese Datei selbst auch % in der Liste erscheint.) % \begin{macrocode} \edef\dateiliste@today{% \the\year/\two@digits{\the\month}/\two@digits{\the\day}}% \immediate\write\dateiliste@file{% \string\ProvidesFile{\jobname.filelist}% [\dateiliste@today\space --- automatically % generated filelist]% }% % \end{macrocode} % Die eigentliche Liste wird in einer 'longtable' gesetzt. % Diese soll drei linksbündig gesetzte Spalten ('l') und dann % eine mit einem Absatz ('X' -- mittels \pack{ltxtable} aus \pack{tabularx} % importiert), welche den restlichen Platz ausfüllt, enthalten. % Damit die letzte Spalte linksbündig (statt Blocksatz) wird, verwenden % wir '>{\raggedright\arraybackslash}' als Modifikator.\footnote{wie im \LaTeX-Begleiter, % zweite Auflage, Beispiel 5-3-2 vorgeschlagen.} % \changes{v0.3}{2006/05/10}{jetzt auch die letzte Spalte linksbündig -- das sieht % besser aus.} % \begin{macrocode} \if@dateiliste@showpages \def\@tempa{lrll} \else \def\@tempa{lll} \fi \immediate\write\dateiliste@file{% \string\LTleft=0pt% \string\LTright=0pt% \string\begin{longtable}{\@tempa>{% \string\raggedright\string\arraybackslash}X}% % \end{macrocode} % Die Überschrift -- aus übersetzbaren Textteilen, siehe unten, bestehend -- % wiederholt sich auf jeder Seite (deswegen '\endhead' anstatt '\\'). % \begin{macrocode} \string\textbf{\fileNameName} \expandafter&% \if@dateiliste@showpages \string\textbf{\pageName} & \fi \string\textbf{\dateName} & \string\textbf{\verName} & \string\textbf{\descriptionName} \string\endhead% }% % \end{macrocode} % Jetzt kommt die Schleife mit den einzelnen Dateien. % Das ist zum Großteil abgekupfert von '\@dofilelist' aus % dem \LaTeX-Kernel ('ltfiles.dtx'), welches die Liste zum % Terminal ausgibt. % \begin{macrocode} \@for\@currname:=\@filelist\do{% \@for % \end{macrocode} % Zunächst bestimmen wir den genauen Dateinamen -- d.h. wir hängen, % falls nötig, ein '.tex' an. Außerdem finden wir den zugehörigen % Versions-String heraus. % \begin{macrocode} \filename@parse\@currname% \edef\dateiliste@filename{% \filename@base.% \ifx\filename@ext\relax tex\else\filename@ext\fi}% \expandafter\let\expandafter\dateiliste@fileversion% \csname ver@\dateiliste@filename\endcsname% % \end{macrocode} % Das Makro '\dateiliste@page@'\meta{name} enthält die Seitennummer % der Datei \meta{name}. Falls es nicht definiert ist, wurde sie % vor dem \pack{dateiliste}-Package geladen, also vor der ersten Seite. % \changes{v0.5}{2009/11/03}{undefinierte Seitenzahlen auf 0 statt 1} % Wir merken uns das Ergebnis in '\dateiliste@filepage'. % \begin{macrocode} \if@dateiliste@showpages \@ifundefined{dateiliste@page@\@currname} {% \def\dateiliste@filepage{0}% }{% \expandafter\let\expandafter\dateiliste@filepage% \csname dateiliste@page@\@currname\endcsname% }% \fi % \end{macrocode} % Jetzt schreiben wir, durch '&' getrennt, die einzelnen Felder raus. % De facto merken wir uns zuerst alles mittels '\edef' in der Variable % '\dateiliste@zeile'. % % Zunächst der Dateiname (dabei durch den Filter '\dateiliste@escapeii' % geschickt, um z.B. '_' unschädlich zu machen), \ldots % \changes{v0.5}{2009/11/03}{Dateinamen werden jetzt für die Liste escaped.} % \begin{macrocode} \edef\dateiliste@zeile{% \expandafter\dateiliste@escapeii\expandafter{% \dateiliste@filename } \space& % % \end{macrocode} % \ldots\ dann die Seitennummer (falls wir diese überhaupt anzeigen wollen) % \begin{macrocode} \if@dateiliste@showpages \dateiliste@filepage \space& % \fi % \end{macrocode} % \ldots\ dann entweder ein "`---"' (falls kein Versions-String gegeben % wurde), \dots % \begin{macrocode} \ifx\dateiliste@fileversion\relax --- \else % \end{macrocode} % \ldots\ oder der Versionsstring selbst, an den ersten beiden Leerzeichen % durch '&' getrennt. Dafür verfüttern wir das expandierte % '\dateiliste@fileversion' (also den Versionsstring) % an '\dateiliste@parse@ver'. (Für den Fall, dass da nicht genug % Leerzeichen drin sind, sind am Ende noch ein paar '{}' mit Leerzeichen % dazwischen -- die werden ja später nicht ausgegeben.) % \begin{macrocode} \expandafter\dateiliste@parse@ver \dateiliste@fileversion{} {} {} \dateiliste@parse@ver \fi % \end{macrocode} % Und jetzt noch ein '\\', um die Tabellenzeile zu beenden. % \begin{macrocode} \string\\}% \edef % \end{macrocode} % Jetzt haben wir alles in '\dateiliste@zeile' gesammelt, und können % es gebündelt ausgeben: % \begin{macrocode} \immediate\write\dateiliste@file{% \dateiliste@zeile }% }% \@for % \end{macrocode} % Nach der Schleife beenden wir die Tabelle und schließen % dann die Datei wieder. % \begin{macrocode} \immediate\write\dateiliste@file{\string\end{longtable}} \immediate\closeout\dateiliste@file }% % \end{macrocode} % \end{macro} % % \begin{macro}{\dateiliste@parse@ver}\meta{datum}\textvisiblespace\meta{version}\textvisiblespace\meta{rest}'\dateiliste@parse@ver' % % \changes{v0.1}{2006/03/31}{Neu} % Dieses Makro nimmt zwei durch Leerzeichen getrennte Parameter, und % gibt sie, mit zusätzlichen '&', wieder zurück. Das letzte Stück % wird noch gefiltert, damit '\bla' kein Problem bildet. % % TODO: Gelegentlich fehlt die Versionsnummer. Damit dann nicht der Anfang % des folgenden Textes (wie 'hyperref' bei hyperref.cfg oder 'package' % bei pst-node.sty) erscheint, sollte noch eine Abfrage hinein, ob '##2' % mit 'v' oder einer Ziffer beginnt. Andernfalls sollte alles in der % dritten Spalte angezeigt werden. (Leider noch nicht % implementiert.) % \changes{v0.5}{2009/11/03}{Escapen des Beschreibungs-Textes.} % % \begin{macrocode} \def\dateiliste@parse@ver##1 ##2 ##3\dateiliste@parse@ver{% ##1 & ##2 & % \dateiliste@general@escape{##3}{\@backslashchar}% % {\string\textbackslash{}}% \dateiliste@escapeii{##3}% \relax }% % \end{macrocode} % \end{macro} % Damit ist der else-Teil und auch das ganze Makro '\printFileList' zu Ende. % \begin{macrocode} }% }% % \end{macrocode} % \end{macro} % % \subsubsection{Escapen gefährlicher Makros und Zeichen} % \label{escape} % % Ein Problem, welches mir durch Otto Schindler und Jens Goldhammer % (unabhängig voneinander) mitgeteilt wurde: Enthält der Dateiname % oder die Kurzbeschreibung nicht direkt von LaTeX verarbeitbare Zeichen % (im Dateinamen sind z.B. '_', in der Kurzbeschreibung z.B. % Makronamen üblich), gibt es Probleme. (Offensichtlich muss man % bei Makronamen sich etwas anstrengen, um sie da rein zu bekommen, aber % es geht.) % % Wir müssen also diese Zeichen vor dem Rausschreiben ersetzen. % % Ein (nicht fertiggestellter) Ansatz ist in Abschnitt \ref{alt-ersetzung} % zu finden. Hier ein anderer Ansatz, der prinzipiell zu funktionieren % scheint. % % % \begin{macro}{\dateiliste@escapeii}\marg{text} % % Geht \meta{text} tokenweise durch und maskiert alles, was gefährlich % werden könnte. % % Zunächst übergeben wir die ganze Zeichenkette an das nächste Makro, % mit einigen im echten Text wohl nicht vorkommenden Begrenzern. % \begin{macrocode} \newcommand*{\dateiliste@escapeii}[1]{% \dateiliste@escape@@ii#1\@nil. \@@nil\@@ }% % \end{macrocode} % \end{macro} % % Da ein mit '#1#2' definiertes Makro (um einzelne Token abzutrennen) % Leerzeichen zwischen Makro-Parametern einfach verschluckt, % müssen wir zunächst eine Wort-Trennung vornehmen -- dafür dieses Makro. % \begin{macro}{\dateiliste@escape@@ii} % \meta{wort}\textvisiblespace\meta{rest}'\@@' % % Wir geben das erste \meta{wort} an das nächste Makro % ('\dateiliste@escape@ii') weiter und arbeiten dann rekursiv % auf \meta{rest}. % % '#2' ist das erste Token von \meta{rest} -- ist % das '\@@nil', so haben wir das letzte Wort erreicht, denn das % Leerzeichen ist jenes, das von '\dateiliste@escapeii' hinter '\@nil.' % eingefügt wurde. Das ist dann also unsere Abbruchbedingung, wir müssen % nur noch \meta{wort} abarbeiten. % % Ansonsten geben wir nach dem ersten Wort ein Leerzeichen aus % (ein solches hatten wir ja zwischen \meta{wort} und \meta{rest}), und % rufen uns selbst mit \meta{rest} auf. % % \begin{macrocode} \def\dateiliste@escape@@ii#1 #2#3\@@{% \ifx\@@nil#2 % nur ein Wort, und das '\@nil' ist schon in '#1' drin. \afterfi{% \dateiliste@escape@ii#1\@@% }% \else %Rekursion \afterfi{% \dateiliste@escape@ii#1\@nil\@@% \space% \dateiliste@escape@@ii#2#3\@@% }% \fi }% % \end{macrocode} % \end{macro} % % \begin{macro}{\dateiliste@escapeii}\meta{token}\meta{rest}'\@@' % % Maskiert \meta{token} (per Übergabe an '\dateiliste@escapetoken'), % und arbeitet danach rekursiv mit \meta{rest}. % % Irgendwo in \meta{rest} taucht ein '\@nil' auf -- wenn wir bei dem % angekommen sind, sind wir fertig. % % Das '\@empty' ist notwendig, falls ein leerer Parameter (also '{}') % als '#1' übergeben wurde, da ansonsten '\@nil' mit '\else' verglichen % wird (und der '\else'-Teil also nicht ausgeführt wird). So wird in % diesem Fall '\@nil' mit '\@empty' verglichen (falsch), und der % else-Teil tritt ein. % % \begin{macrocode} \def\dateiliste@escape@ii#1#2\@@{% \ifx#1\@nil \@empty \else \afterfi{% \dateiliste@escapetoken{#1}% \dateiliste@escape@ii#2\@@ }% \fi }% % \end{macrocode} % \end{macro} % % \begin{macro}{\dateiliste@escapetoken}\marg{token} % % Dieses Makro maskiert ein einzelnes Token für % die Ausgabe in eine Datei und nachheriges % Wiedereinlesen in die Tabelle. % % \begin{macrocode} \newcommand*{\dateiliste@escapetoken}[1] {% % \end{macrocode} % Zunächst der Test, ob \meta{token} zufälligerweise die leere % Zeichenkette ist. Falls ja, vergleicht das '\ifx' nicht % etwa '#1' mit '\@empty', sondern '\@empty' mit '\@empty', % und wir machen gar nichts (weil gleich danach das '\else' kommt). % \begin{macrocode} \ifx#1\@empty\@empty \else % \end{macrocode} % Ansonsten versuchen wir herauszufinden, ob \meta{token} eine % Kontrollsequenz o.ä. ist -- dann verwendet '\ifcat' die Kategorie % 16 (das ist keine der normalen Kategorien), wie auch bei '\relax'. % % In diesem Fall geben wir '\string' und eine String-Darstellung der % Kontrollsequenz aus, wodurch diese nach dem Einlesen angezeigt % (und nicht interpretiert) wird. % \begin{macrocode} \ifcat\noexpand\relax \noexpand#1% \string\string\string#1% \else % \end{macrocode} % Ansonsten haben wir es mit einem einzelnen Zeichen zu tun. % % Wir überprüfen, welchen '\catcode' das Zeichen hätte, wenn % es jetzt eingelesen würde. Hoffentlich ist das der gleiche, % der auch beim Einlesen der Dateiliste eingestellt ist, und zumindest % für 0-9 und 14 auch die normalen Zeichen. Wenn nicht, dann hat jemand % schon gewaltig die Catcodes verbogen, und ist selbst schuld. % % (Es ist leider nicht wirklich möglich, die Fallunterscheidung % direkt danach zu machen, welchen Catcode das Zeichen nun hat, außer % durch Vergleiche mit anderen Zeichen -- und das setzt wieder vorraus, % dass diese Zeichen noch ihre Original-Codes haben.) % % \begin{macrocode} \ifcase \catcode\expandafter`#1 % \string\textbackslash\space% (kann nur mit Tricks vorkommen) - \ \or\string\{% dito - { \or\string\}% dito - } \or\string\$% math shift (3) - $ \or\string\&% alignment tab (4) - & \or(Kategorie 5)% end of line \or\string\#% parameter (6) - sollte nicht vorkommen \or\string\^{ }% superscript (7) \or\string\_% subscript (8) \or(Kategorie 9 - ignored)% (9) - sollte nicht vorkommen \or#1% space (10) \or#1% letter (11) \or#1% other (12) \or\string\string\string#1% active -- sollte auch normalerweise % nicht vorkommen. \or\%% comment (14) (dafür muss man auch etwas tricksen) \or(Kategorie 15 - invalid)% (15 - sollte nicht vorkommen) \else(andere Kategorie)% (und da es eigentlich nur % Kategorien 0-15 gibt, auch das nicht.) \fi% (\ifcase) \fi% (\ifcat) \fi% (\ifx) }% % \end{macrocode} % \end{macro} % % % Hier noch ein Hilfs-Makro, geklaut\footnote{Ich habe absichtlich nur % dieses Makro hier kopiert, anstatt das \pack{gmutils}-Paket einzubinden, % denn \pack{gmutils} führt auch noch einige Redefinitionen in ganz % anderen Bereichen durch, die ich nicht brauche bzw. haben will.} % aus \pack{gmutils}\footnote{von Grzegorz Murzynowski, auf CTAN unter % '/macros/contrib/gmutils'.}: % \begin{macro}\afterfi\marg{cmd} % % Führt \meta{cmd} nach dem nächsten '\fi' aus -- alles dazwischen % wird übersprungen. % Damit kann man zu tiefe '\if'-Verschachtelungen im Falle einer % Rekursion vermeiden. % % Achtung: es geht hier wirklich um das lexikalisch nächste '\fi', % auch wenn das eigentlich zu einem dazwischen kommenden '\if' gehört. % In unserem Fall kommen solche pathologischen Fälle nicht vor -- falls % doch, verwende man analog definierte '\afteriffifi' etc. -- ich verweise % auf die Dokumentation von \pack{gmutils}. % % \begin{macrocode} \long\def\afterfi#1#2\fi{% \fi#1% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@nil} % \begin{macro}{\@nil} % \begin{macro}{\@@} % Damit die '\ifx'-Vergleiche bei den Escape-Funktionen funktionieren, müssen % diese drei Makros unterschiedlich definiert sein. Der exakte Wert ist nicht % wichtig, da sie ja nie wirklich expandiert werden (sollten). % \begin{macrocode} \newcommand*\@@nil{\@@nil}% \newcommand*\@nil{\@nil}% \newcommand*\@@{\@@}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Alternatives Escapen} % \label{alt-ersetzung} % \begin{macrocode} %<*escape-original> % \end{macrocode} % % \begin{macro}{\dateiliste@general@escape}\marg{text}\marg{suche}\marg{ersetze} % Dieses Makro könnte (wenn es denn funktionieren würde) von % '\@writefilelist' innerhalb eines '\edef' oder '\write' aufgerufen % werden, um gefährliche Zeichen zu escapen, so dass sie nach dem Einlesen % im Dokument anzeigbar sind. Da es innerhalb des '\edef' sitzt, muss % es expandierbar sein, darf also kein '\def' etc. enthalten. % (Aha, da ist das Problem.) % % Zwei Ansätze: % \begin{enumerate} % \item Wir versuchen, unser '\dateiliste@general@escape' expandierbar % zu machen. % \item Wir bauen die API um, so dass es nicht zu seinem Ergebnis expandiert, % sondern dieses in einem (expandierbaren) Makro ablegt. Entsprechend muss % es dann \emph{vor} dem '\write' aufgerufen werden, und das Ergebnis-Makro % wird dann an das '\write' verfüttert. % \end{enumerate} % Der erste Ansatz wurde etwas abgewandelt als '\dateiliste@escapeii' % in Abschnitt \ref{escape} umgesetzt, und ist auch der, welcher jetzt % verwendet wird. % % Hier der erste Versuch, implementiert als einfache Ersetzungsfunktion. % Durch den '%<*escape-original>'-Abschnitt wird er nicht in die Package-Datei % aufgenommen. (Es wäre zusätzlich dazu auch noch eine entsprechende Änderung % in '\dateiliste@parse@ver' sowie in '\@writefilelist' notwendig.) % % % \begin{macrocode} \newcommand*{\dateiliste@general@escape}[3]{ \relax \begingroup \def\dateiliste@suche{#2}% -- dumme Fehlermeldung: % ! Undefined control sequence. -- warum? \def\dateiliste@ersetzung{#3}% \dateiliste@general@escape@#1\@nil\@@% \endgroup }% \def\dateiliste@gobbletoAt#1\@@{}% \def\dateiliste@general@escape@#1#2\@@{% \ifx#1\@nil \expandafter\dateiliste@gobbletoAt \else \dateiliste@general@escape@token{#1}% \expandafter\dateiliste@general@escape@ \fi #2\@@% }% \newcommand*{\dateiliste@general@escape@token}[1]{% % \if#3\space % \space% % \else \if \datailiste@suche#1% \dateiliste@ersetzung% \else #1% \fi % \fi }% % % \end{macrocode} % \end{macro} % % % \subsubsection{Anpassbare Texte und Übersetzungen} % \begin{macro}{\fileListPreamble} % \changes{v0.1}{2006/03/31}{Neu} % \begin{macro}{\fileListName} % \begin{macro}{\fileNameName} % \changes{v0.1}{2006/03/31}{Neu} % \begin{macro}{\dateName} % \changes{v0.1}{2006/03/31}{Neu} % \begin{macro}{\verName} % \changes{v0.1}{2006/03/31}{Neu} % \begin{macro}{\descriptionName} % \changes{v0.1}{2006/03/31}{Neu} % Einige Namen für übersetzbare Texte -- standardmäßig auf Englisch. % \begin{macrocode} \newcommand*\fileListPreamble{ Here is the list of all files used during the run of \LaTeX{} which produced this document. \footnote{More precisely, it is the list of files used one \LaTeX-run before the one which produced this document, but after some runs the list should stabilize.} } \newcommand*\fileListName{List of Files} \newcommand*\fileNameName{file name} \newcommand*\pageName{page} \newcommand*\dateName{release date} \newcommand*\verName{version} \newcommand*\descriptionName{description} % \end{macrocode} % \begin{macro}{\dateiliste@babel} % \changes{v0.6}{2012/10/13}{Zeilenenden in den \cs{addto}\cs{extras...} auskommentiert, die zu % überflüssigen Leerzeichen in Headings führten. Siehe \texttt{http://tex.} \texttt{stackexchange.com/q/75533}.} % Hier noch gleich ein paar Übersetzungen. % Wir definieren hier ein einmal-Makro, welches % für mehrere Sprachen\footnote{Genauer: genau für die Sprachen, welche ich soweit % beherrsche, dass ich diese Texte übersetzen konnte.} zum jeweiligen Initialisierungsmakro % Neudefinitionen dieser fünf Befehle hinzufügt. % \begin{macrocode} \newcommand*{\dateiliste@babel}{ % \end{macrocode} % Zunächst Englisch - das sollte das gleiche wie die Standard-Einstellungen sein. % \begin{macrocode} \addto{\extrasenglish}{% \renewcommand*\fileListPreamble{% Here is the list of all files used during the run of \LaTeX{} which produced this document.\footnote{More precisely, it is the list of files used one \LaTeX-run before the one which produced this document, but after some runs the list should stabilize.}% }% \renewcommand*\fileListName{List of Files}% \renewcommand*\fileNameName{file name}% \renewcommand*\pageName{page}% \renewcommand*\dateName{release date}% \renewcommand*\verName{ver.}% \renewcommand*\descriptionName{description}% }% % \end{macrocode} % Deutsch mit neuer Rechtschreibung. % \changes{v0.4}{2009/10/26}{Kodierung der deutschen Umlaute % in der \cs{fileListPreamble} per \cs{"}, damit das % Paket auch mit utf8-kodierten Dateien funktioniert. % Dank an Michael Niedermair für den Bugreport.} % \begin{macrocode} \addto{\extrasgerman}{% \renewcommand*\fileListPreamble{% Hier die Liste aller Dateien, die w\"ahrend des \LaTeX-Laufes, welcher dieses Dokument erzeugte, verwendet wurden. \footnote{genauer: Es ist die Liste aller Dokumente, die einen \LaTeX-Lauf fr\"uher verwendet wurden. Aber nach einigen L\"aufen sollte sich die Liste stabilisieren.}% }% \renewcommand*\fileListName{Liste der Dateinamen}% \renewcommand*\fileNameName{Dateiname}% \renewcommand*\pageName{\llap{Se}ite}% \renewcommand*\dateName{Datum}% \renewcommand*\verName{Ver.}% \renewcommand*\descriptionName{Beschreibung}% }% % \end{macrocode} % Deutsch mit alter Rechtschreibung: ist das gleiche (hier tauchen % keine Fälle mit Änderungen auf.) % \begin{macrocode} \addto{\extrasngerman}{% \renewcommand*\fileListPreamble{% Hier die Liste aller Dateien, die w\"ahrend des \LaTeX-Laufes, welcher dieses Dokument erzeugte, verwendet wurden. \footnote{genauer: Es ist die Liste aller Dokumente, die einen \LaTeX-Lauf fr\"uher verwendet wurden. Aber nach einigen L\"aufen sollte sich die Liste stabilisieren.}% }% \renewcommand*\fileListName{Liste der Dateinamen}% \renewcommand*\fileNameName{Dateiname}% \renewcommand*\pageName{Seite}% \renewcommand*\dateName{Datum}% \renewcommand*\verName{Ver.}% \renewcommand*\descriptionName{Beschreibung}% }% % \end{macrocode} % Für die Verwender der Internationalen Sprache (siehe 'www.esperanto.de'): % \begin{macrocode} \addto{\extrasesperanto}{% \renewcommand*\fileListPreamble{% Jen listo de \^ciuj dosieroj, kiuj estis uzitaj dum la \LaTeX-rulo, kiu produktis tiun \^ci dokumenton. \footnote{Pli precize: estas la listo de dosieroj uzitaj unu rulon anta\u{u} tiu, kiu produktis tiun \^ci dokumenton. Sed kutime post kelkaj ruloj la listo devus stabili\^gi.}% }% \renewcommand*\fileListName{Listo de dosieroj}% \renewcommand*\fileNameName{dosiernomo}% \renewcommand*\pageName{pa\^go}% \renewcommand*\dateName{dato}% \renewcommand*\verName{versio}% \renewcommand*\descriptionName{priskribo}% }% % \end{macrocode} % Am Ende der Ausführung von '\dateiliste@babel' vernichtet der Befehl sich % selbst. Das spart etwas Speicher, und sorgt dafür, dass er nicht versehentlich % mehrfach ausgeführt wird (auch wenn das wohl nicht schädlich wäre). % \begin{macrocode} \let \dateiliste@babel = \relax% }% % \end{macrocode} % \end{macro} % Wir untersuchen jetzt, ob \pack{babel} schon geladen wurde. % Diese Fallunterscheidung ist notwendig, weil der Code von % '\dateiliste@babel' zwar das Paket benötigt (also nach ihm % ausgeführt werden sollte), aber nicht einfach direkt mit '\AtBeginDocument' % ans Ende geschoben werden sollte, da er (falls \pack{babel} schon vor % diesem Paket geladen wurde) dort nach dem \pack{babel}-Code (der die % Sprache auswählt) kommen würde, und damit mehr nichts bewirkt. % % Falls \pack{babel} jetzt schon geladen wurde, \ldots % \begin{macrocode} \@ifpackageloaded{babel} {% % \end{macrocode} % \ldots informieren wir es sofort über die neuen Namen, die beim % Sprachwechsel bitte angepasst werden sollten. % \begin{macrocode} \dateiliste@babel% }% % \end{macrocode} % Ansonsten verschieben wir das zum Beginn des Dokumentes (und machen % das auch dann nur, wenn \pack{babel} inzwischen geladen wurde -- % ansonsten ist das ganze ja überflüssig, und '\addto' gibt es auch % nicht, also können wir dann '\dateiliste@babel' vernichten). % \begin{macrocode} {% \AtBeginDocument{% \@ifpackageloaded{babel}{% \dateiliste@babel% }{% \let \dateiliste@babel = \relax }% }% }% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Hauptdatei in die Dateiliste} % \begin{macro}{\mainFileToList} % \changes{v0.6}{2012/10/13}{Wir geben eine Warnung aus anstatt einer Endlosschleife, % wenn \cs{@filelist} undefiniert ist. Danke an Markus Kohm, Matthias Kospiech % und Andrew Swann für Bugreport and Analyse, siehe auch % \texttt{http://tex.stackexchange.} \texttt{com/q/75533/3335}.} % \changes{v0.1}{2006/04/02}{Neu} % \changes{v0.2}{2006/04/19}{Mögliche Erkennung des Dateinamens jetzt % auch ohne \eTeX} % Hier unser Nutzer-Makro für die Inklusion der Hauptdatei % in die Dateiliste. % \begin{macrocode} \newcommand*{\mainFileToList}{% \mainFileToList % \end{macrocode} % Falls die Dateiliste (d.h. das Makro '\@filelist') nicht definiert ist, % geben wir eine Warnung aus, und tun nichts weiter. (Ohne das würde es % in dem Fall eine Endlosschleife/-rekursion geben, wenn wir versuchen, aus % dieser Liste etwas zu entfernen.) % \begin{macrocode} \@ifundefined{@filelist}{% \PackageWarning{dateiliste}% {% ^^J \protect\mainFileToList\space (i.e. using the {dateiliste} package withouth^^J the [noaddmain] option) works only if \protect\listfiles\space is given^^J in the preamble.^^J }% }{% % \end{macrocode} % Zunächst sehen wir nach, ob es eine Datei mit Namen \meta{jobname}'.tex' % gibt. % \begin{macrocode} \IfFileExists{\jobname.tex} {% \begingroup % \end{macrocode} % Falls ja, dann ist das höchstwahrscheinlich die Haupt-Datei des % Dokumentes\footnote{Andernfalls hat entweder jemand '\jobname' manipuliert, % oder die Hauptdatei ist eine Datei, die nicht auf '.tex' endet, % etwa \meta{jobname}'.dtx' -- in dem Fall sollte man eigentlich keine Datei % \meta{jobname}'.tex' daneben haben. Ansonsten ist es wohl zumutbar, die % Option 'noaddmainfile' anzugeben. % }, und taucht wahrscheinlich -- nämlich, wenn sie auf der % Kommandozeile oder mit '\input '\meta{jobname}'.tex' anstatt % '\input{'\meta{jobname}'.tex}' geladen wurde -- nicht in der Dateiliste % auf. % % Das Problem an der Erkennung des letzten Falles (\LaTeX-'\input{}') ist, % dass '\jobname' die Zeichen (auch die Buchstaben) in % Kategorie 12 (\emph{other}) liefert anstatt in der natürlichen Kategorie % (d.h. Buchstaben in 11 = \emph{letter}) (wie die Dateien, deren Name % irgendwo im Quelltext auftaucht und dann in '\@filelist' landet). % % Ich habe drei Möglichkeiten gefunden, damit umzugehen: % \begin{enumerate}[(1)] % \item Wir wandeln '\@filelist' komplett in Kategorie-12-Zeichen um. % \footnote{Den Tipp, wie das geht, habe ich zufällig beim Durchstöbern % der UK-\TeX-FAQ gefunden: % \texttt{http://www.tex.ac.uk/cgi-bin/texfaq2html?label=compjobnam}} % \item Wir wandeln '\jobname' (bzw. die Buchstaben darin) in ihre % "`richtige"' Kategorie (11 für Buchstaben) um. % \item Wir ignorieren das Problem und leben damit, dass eventuell der % Dateiname doppelt auftaucht. % \end{enumerate} % % Variante (2) funktioniert leider nur bei Verwendung von \eTeX, (1) % hat den Nachteil, dass anschließend '\@filelist' komplett aus % Kategorie-12-Zeichen besteht, was eventuell zu Problemen mit anderen % Paketen führt, welche ebenfalls diese Liste verarbeiten und auf deren % Catcodes angewiesen sind. % % Daher haben ich zwei Paket-Optionen hinzugefügt, welche eine entsprechende % Auswahl ermöglichen: % \begin{description} % \item[Standardvorgehen:] Falls \eTeX\ verwendet wurde, nimm (2), % für \TeX\ nimm (1). (Die Unterscheidung läuft dabei natürlich nicht % über die Existenz von \eTeX, sondern über die Existenz von % '\scantokens', der beötigten Kontrollsequenz.) % \item[Mit Option \texttt{nocat12}:] \DescribeOption{nocat12} % Falls \eTeX\ verwendet wurde, nimm (2), sonst (3). % \item[Mit Option \texttt{cat12}:] \DescribeOption{cat12} % Nimm immer (1). % \end{description} % Vor Version 0.2 gab es nur das Verhalten, welches jetzt 'nocat12' entspricht.) % % \begin{macro}{\dateiliste@catxii@transform} % Hier die Implementation für (1). Wir wandeln auch das '.tex' in Kategorie 12 um, % mittels '\meaning' (mit '\strip@prefix' entfernen wir etwas Text, der vor der % Makrodefinition steht) % \begin{macrocode} \newcommand*{\dateiliste@catxii@transform}% { \edef\dateiliste@mainfile{\jobname.tex}% \edef\dateiliste@mainfile{% \expandafter\strip@prefix\meaning\dateiliste@mainfile }% % \end{macrocode} % Jetzt das gleiche für '\@filelist'. % \begin{macrocode} \edef\@filelist{\expandafter\strip@prefix\meaning\@filelist}% }% % \end{macrocode} % \end{macro} % \begin{macro}{\dateiliste@scantoken@tr} % Hier die Implementation für (2) mit '\scantokens': % In \eTeX\ gibt es dagegen den '\scantokens'-Befehl, welcher % es ermöglicht, im Speicher von \TeX\ vorliegende Token neu aus % einer Pseudo-Datei einzulesen. Wenn % er definiert ist (nur dann wird dieses Makro aufgerufen), rufen wir ihn % hier auf -- mit einigen '\expandafter', um nur den '\jobname' vor % der '\scantokens'-Ausführung zu expandieren, und nicht die Token % '\edef\dateiliste@mainfile{' und '.tex}' drumherum. % '\scantokens' bekommt also die Zeichen \par % '\makeatletter\edef\dateiliste@mainfile{'\meta{jobname}'.tex}\makeatother'\par % \noindent zu lesen. % % Das '\edef' wird dann also mit Kategorie-11-Buchstaben (also "`richtigen"') % im Dateinamen ausgeführt. (Das '\makeatletter' und '\makeatother' ist % notwendig, um das '@' auch als Buchstabe zuzulassen und somit '\dateiliste@mainfile' % als einzelnen Makronamen anzusehen. Zu dem Zeitpunkt, zu dem '\scantokens' % ausgeführt wird, sind ja die Dokumenten-Catcodes in Kraft, nicht die einer % Package-Datei.) % \begin{macrocode} \newcommand*{\dateiliste@scantoken@tr}% {% \scantokens \expandafter{% \expandafter\makeatletter \expandafter\edef \expandafter\dateiliste@mainfile \expandafter{% \jobname .tex}% \makeatother }% }% % \end{macrocode} % \end{macro} % Hier jetzt die große Fallunterscheidung: % \begin{macrocode} \if@dateiliste@catxii \dateiliste@catxii@transform \else \@ifundefined{scantokens}% {% \if@dateiliste@nocatxii % \end{macrocode} % Das ist die Implementation für (3): wir merken uns den Dateinamen einfach % so. Das geht wahrscheinlich schief, wenn nicht noch irgend ein anderes % Makropaket eingreift, und wir können \meta{jobname}'.tex' nicht aus der % Liste entfernen. % \begin{macrocode} \edef\dateiliste@mainfile{\jobname.tex}% \else \dateiliste@catxii@transform \fi }% {% \dateiliste@scantoken@tr }% \fi % \end{macrocode} % Jetzt haben wir in '\dateiliste@mainfile' den Namen der Hauptdatei, % auch (je nach Optionen und \eTeX-Verfügbarkeit) '@filelist' vorbereitet. % % Wir können nun mit '\@removeelement' (aus dem \LaTeX-Kernel) % das Vorkommen von \meta{jobname}'.tex' entfernen (falls der Name dort vorhanden % ist -- wahrscheinlich nicht). % \begin{macrocode} \@expandtwoargs\@removeelement{\dateiliste@mainfile}% \@filelist\@filelist % \end{macrocode} % Anschließend fügen wir den Dateinamen an den \emph{Anfang} der Liste an. % \begin{macrocode} \xdef\@filelist{% \dateiliste@mainfile,\@filelist }% \endgroup % \end{macrocode} % Falls \meta{jobname}'.tex' nicht existiert, ist dies sicher nicht % die Hauptdatei. Dann haben wir es entweder mit einer '.dtx'-Datei % zu tun (die sowieso durch das doppelte Einlesen noch einmal auftaucht), % oder irgendeinen anderen Fall, den ich nicht vorhersehen kann. Also % machen wir dann nichts. % \begin{macrocode} }{% \relax }% }% }% % \end{macrocode} % \end{macro} % % Am Ende des Dokumentes (aber noch vor dem Aufruf von '\@writefilelist', der von % '\printFileList' hinzugefügt wird) rufen wir, sofern die passende % Option gesetzt war, das eben definierte Makro auf. % \begin{macrocode} \if@dateiliste@addMain \AtEndDocument{\mainFileToList} \fi % \end{macrocode} % % \subsection{Schluss} % \begin{macrocode} \endinput % % % \end{macrocode} % % \Finale %\endinput % %<*müll> %%% Folgendes ist nur für meinen Editor. %%% %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: %