diff options
Diffstat (limited to 'macros/latex/contrib/koma-script/scrwfile.dtx')
-rw-r--r-- | macros/latex/contrib/koma-script/scrwfile.dtx | 502 |
1 files changed, 502 insertions, 0 deletions
diff --git a/macros/latex/contrib/koma-script/scrwfile.dtx b/macros/latex/contrib/koma-script/scrwfile.dtx new file mode 100644 index 0000000000..3973363618 --- /dev/null +++ b/macros/latex/contrib/koma-script/scrwfile.dtx @@ -0,0 +1,502 @@ +% \iffalse meta-comment +% ====================================================================== +% scrwfile.dtx +% Copyright (c) Markus Kohm, 2010-2022 +% +% This file is part of the LaTeX2e KOMA-Script bundle. +% +% This work may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c of the license. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 and of this work. +% +% This work has the LPPL maintenance status "author-maintained". +% +% The Current Maintainer and author of this work is Markus Kohm. +% +% This work consists of all files listed in MANIFEST.md. +% ====================================================================== +%%% From File: $Id: scrwfile.dtx 3889 2022-06-09 12:11:14Z kohm $ +%<*dtx> +\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi +\ProvidesFile{scrwfile.dtx} +%</dtx> +%<(package&identify)|driver>\NeedsTeXFormat{LaTeX2e}[1995/06/01] +%<package&identify>\ProvidesPackage{scrwfile} +%<driver>\ProvidesFile{scrwfile.drv} +%<*dtx|(package&identify)|driver> + [2021/05/30 v0.1.10 KOMA-Script package (write and clone files)] +%</dtx|(package&identify)|driver> +%<*dtx> +\ifx\documentclass\undefined + \input scrdocstrip.tex + \@@input scrkernel-version.dtx + \@@input scrstrip.inc + \KOMAdefVariable{COPYRIGHTFROM}{2010} + + \generate{\usepreamble\defaultpreamble + \file{scrwfile.sty}{% + \from{scrwfile.dtx}{package,scrwfile,identify,option,body}% + \from{scrlogo.dtx}{logo}% + }% + } + + \@@input scrstrop.inc +\else + \let\endbatchfile\relax +\fi +\endbatchfile +%</dtx> +%<*driver> +\documentclass[USenglish]{koma-script-source-doc} +\usepackage{babel} +\usepackage{hvlogos} +\setcounter{StandardModuleDepth}{2} +\begin{document} +\DocInput{scrwfile.dtx} +\end{document} +%</driver> +% \fi +% +% \changes{v0.1}{2010/10/01}{start of new package} +% \changes{v0.1.7}{2014/10/13}{manual moved to \KOMAScript{} manual} +% \changes{v0.1.9}{2021/05/30}{version number scheme changed} +% \changes{v0.1.10}{2022/02/05}{switch over from \cls*{scrdoc} to +% \cls*{koma-script-source-doc}} +% +% \GetFileInfo{scrwfile.dtx} +% \title{Saving Write Handles with the Experimental +% \href{https://komascript.de}{\KOMAScript} Package \pkg*{scrwfile}} +% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}} +% \date{Version \fileversion{} of \filedate} +% \maketitle +% \begin{abstract} +% The \TeX{} engines \TeX, \pdfTeX, and \XeTeX{} (but not \LuaTeX) do +% provide only 16 handles for simultaneously write open files. Some of them +% are already used by \LaTeX{}. Moreover, for every file using +% \cs{@starttoc} \LaTeX{} keeps a write file open from usage of +% \cs{@starttoc}, e.g., inside \cs{tableofcontents}, \cs{listoffigures} +% etc., until the end of the document. Additional write files are used for +% the index, glossary etc. So sometimes it happens, that there are not +% enough handles to open another one. \pkg*{scrwfile} was made to change the +% \LaTeX{} internal handling of all the helper files bases on \cs{@starttoc} +% to not keep them open simultaneously, but use only one file handle for all +% of them. So you should never run out of write file handles. +% \end{abstract} +% +% \section{User Manual} +% +% You can find the user manual of \pkg*{scrwfile} in the \KOMAScript{} manual, +% either the German \file{scrguide} or the English \file{scrguien}. But please +% note: +% \begin{quote}\bfseries +% This is an experimental package. Usage of this package is on your own +% risk. There is no support, if you are using this package, not only for +% this package but also for the class you are using or other packages, that +% use \cs{@starttoc} or \cs{@writefile} like \pkg{caption}, \pkg{float}, +% \pkg*{tocbasic}, \pkg{listings} and many more. +% \end{quote} +% +% \MaybeStop{\PrintIndex} +% +% +% \section{Implementation of \pkg*{scrwfile}} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macrocode} +%<*identify> +\PackageWarningNoLine{scrwfile}{% + THIS IS AN EXPERIMENTAL PACKAGE!\MessageBreak + USAGE OF THIS PACKAGE IS ON YOUR OWN RISK!\MessageBreak + EVERYTHING MAY HAPPEN!\MessageBreak + EVERYTHING MAY CHANGE IN FUTURE!\MessageBreak + THERE IS NO SUPPORT, IF YOU USE THIS PACKAGE!\MessageBreak + Maybe, it would be better not to load this package% +} +%</identify> +% \end{macrocode} +%\iffalse +%\fi +% +% \subsection{Options} +% \iffalse +%<*option> +% \fi +% Currently we don't need options. +% \iffalse +%</option> +% \fi +% +% \subsection{Body} +% \begin{macrocode} +%<*body> +% \end{macrocode} +% +% \subsubsection{Needed Packages} +% +% Package \pkg*{scrbase} is needed, because of using several \KOMAScript{} +% basic commands. +% \begin{macrocode} +\RequirePackage{scrbase}[2010/09/17] +% \end{macrocode} +% +% Package \pkg*{scrlfile} is needed because of the \file{aux}-file +% handling and \cs{protected@immediate@write}. +% \begin{macrocode} +\RequirePackage{scrlfile}[2010/09/30] +% \end{macrocode} +% +% \changes{v0.1.10}{2022/02/04}{\pkg{iftex} is required} +% Package \pkg{iftex} is used to detect Lua\LaTeX. +% \begin{macrocode} +\RequirePackage{iftex} +% \end{macrocode} +% +% \subsubsection{Is is needed?} +% +% \changes{v0.1.9}{2021/05/30}{with Lua\LaTeX{} using is not recommended} +% \changes{v0.1.10}{2022/02/04}{using \cs{ifluatex}} +% \changes{v0.1.10}{2022/02/04}{\cs{PackageInfoNoLine} replaced by +% \cs{PackageWarningNoLine}} +% If the user uses Lua\LaTeX{} usage of \pkg*{scrwfile} should not be +% needed. +% \begin{macrocode} +\ifluatex + \PackageWarningNoLine{scrwfile}{LuaLaTeX detected.\MessageBreak + With LuaLaTeX you should never get an error message:\MessageBreak + \space\space`No room for a new \string\write'.\MessageBreak + So scrwfile could make much more harm than benefit\MessageBreak + and using it is not recommended}% +\fi +% \end{macrocode} +% +% \subsubsection{\LaTeX{} Kernel Patchs} +% +% For some features we need to patch \LaTeX{} kernel macros. Those features +% and macros are: +% \begin{description} +% \item[Single handle feature] means, that \LaTeX{} will no longer need a file +% handle for every help file, but only one for all files. We will patch +% \cs{@starttoc} and \cs{@writefile} to do so. +% \item[Clone file feature] means, that every write to one file may be done to +% another file, too. We will patch \cs{@writefile} to do so. +% \end{description} +% Every patch should be minimum invasive, so that files, that are not under +% \pkg*{scrwfile}'s control are changed as little as possible. +% +% \begin{macro}{\scrwfile@if@only} +% First of all we check, if the file should be handled by \pkg*{scrwfile}. +% \begin{macrocode} +\newcommand*{\scrwfile@if@only}[1]{% + \begingroup + \scr@ifundefinedorrelax{scrwfile@only}{\@tempswatrue}{% + \@tempswafalse + \edef\reserved@b{#1}% + \@for\reserved@a:=\scrwfile@only\do + {\ifx\reserved@a\reserved@b\@tempswatrue\fi}% + }% + \if@tempswa + \scr@ifundefinedorrelax{scrwfile@never}{}{% + \edef\reserved@b{#1}% + \@for\reserved@a:=\scrwfile@never\do + {\ifx\reserved@a\reserved@b\@tempswafalse\fi}% + }% + \fi + \expandafter\endgroup + \if@tempswa + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\scrwfile@starttoc,\scrwfile@@starttoc} +% This is the internal redefinition of \cs{@starttoc}. First of all test, if it +% should be used, then use it or not. +% \begin{macrocode} +\newcommand*{\scrwfile@starttoc}[1]{% + \scrwfile@if@only{#1}{\scrwfile@@starttoc}{\scrwfile@saved@starttoc}{#1}% +} +\newcommand*{\scrwfile@@starttoc}[1]{% +%<trace> \PackageInfo{scrwfile}{% +%<trace> Using my own \string\@starttoc\space for `#1'}% + \begingroup + \if@filesw + \xdef\scrwfile@writefilelist{\scrwfile@writefilelist,#1}% + \fi + \@fileswfalse + \scrwfile@saved@starttoc{#1}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\scrwfile@writefile,\scrwfile@@writefile,\scrwfile@wrtout, +% \scrwfile@writefilelist} +% This is the internal redefinition of \cs{@writefile}. First of all test, if +% it should be used, then use it or not. +% \begin{macrocode} +\newcommand*{\scrwfile@writefile}[1]{% + \scrwfile@if@only{#1}{\scrwfile@@writefile}{\scrwfile@saved@writefile}{#1}% +} +\newcommand{\scrwfile@@writefile}[2]{% +%<trace> \PackageInfo{scrwfile}{% +%<trace> Using my own \string\@writefile\space for `#1'}% + \ifnum\scrwfile@wrtout>0 + \begingroup + \@temptokena{#2}% + \immediate\write\scrwfile@wrtout{% + \string\@writefile{#1}{\the\@temptokena}% + }% +% \end{macrocode} +% This was the entry for the real file. But we also may have clone files: +% \begin{macrocode} + \scrwfile@process@clones{#1}% + \endgroup + \fi +} +\chardef\scrwfile@wrtout\z@ +\newcommand*{\scrwfile@writefilelist}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@writefile,\scrwfile@saved@writefile} +% We have to add the single handle feature and the clone file feature to +% \cs{@writefile} and therefore save the original +% definition. \cs{scrwfile@saved@writefile} is used, whenever a file is not +% under \pkg*{scrwfile}'s control. +% \begin{macrocode} +\newcommand*{\scrwfile@saved@writefile}{} +\BeforeClosingMainAux{% + \ifx\scrwfile@writefilelist\@empty\else + \let\scrwfile@saved@writefile\@writefile + \let\scrwfile@wrtout\@partaux + \immediate\openout\scrwfile@wrtout \jobname.wrt + \let\@writefile\scrwfile@writefile + \fi +} +\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}{% +%<trace> \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 +} +% \end{macrocode} +% \changes{v0.1.8}{2021/05/30}{added order rule for +% \pkg*{scrlayer-notecolumn}} +% Note: Here we use a \LaTeX{} version test, because a do-nothing-definition +% like the one of \pkg{latexrelease} wouldn't be correct, if the command is +% not supported by the current \LaTeX{} kernel version setting. +% \begin{macrocode} +\IfLTXAtLeastTF{2020/10/01}{% + \DeclareHookRule{enddocument/afteraux}% + {scrwfile}{before}{scrlayer-notecolumn}% +}{% + \@ifpackageloaded{scrlayer-notecolumn}{% + \PackageWarningNoLine{scrwfile}{% + Dangerous package order detected!\MessageBreak + As a general rule, you should load scrwfile as soon\MessageBreak + as possible, maybe even before `\string\documentclass'\MessageBreak + (using `\string\RequirePackage' instead of + `\string\usepackage').\MessageBreak + Following packages should be loaded after scrwfile:\MessageBreak + \space - scrlayer-notecolumn}% + }{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@starttoc,\scrwfile@saved@starttoc} +% We have to add the single handle feature to \cs{@starttoc} and therefore +% save the original definition. +% \changes{v0.1.5}{2013/07/24}{take care for unfriendly \textsl{hyperref}} +% \cs{scrwfile@saved@starttoc} is be used, whenever the file is not under +% \pkg*{scrwfile}'s control. Because of package \textsl{hyperref}, that does +% a hard redefinition without any care for changed definitions, we have to +% take care for that unfriendly package and cannot do a simple +% \begin{verbatim} +% \let\scrwfile@saved@starttoc\@starttoc +% \let\@starttoc\scrwfile@starttoc +% \end{verbatim} +% \begin{macrocode} +\newcommand*{\scrwfile@saved@starttoc}{} +\AtBeginDocument{% + \begingroup + \@ifpackageloaded{hyperref}{% + \scr@ifundefinedorrelax{Hy@AtBeginDocument}{% + \PackageWarning{scrwfile}{% + Incompatible `hyperref` package detected!\MessageBreak + You are using a `hyperref` version, that\MessageBreak + doesn't provide `\string\Hy@AtBeginDocument`.\MessageBreak + This may or may not work.\MessageBreak + Using immediate redefinition% + }% + \aftergroup\@firstofone + }{% + \def\reserved@a{\AtBeginDocument}% + \ifx\Hy@AtBeginDocumentHook\@undefined + \PackageInfo{scrwfile}{% + Using immediate redefinition% + }% + \aftergroup\@firstofone + \else + \PackageInfo{scrwfile}{% + Using `\string\Hy@AtBeginDocument`% + }% + \aftergroup\Hy@AtBeginDocument + \fi + }% + }{% + \aftergroup\@firstofone + }% + \endgroup + {% + \PackageInfo{scrwfile}{% + Extending `\string\@starttoc` + }% + \let\scrwfile@saved@starttoc\@starttoc + \let\@starttoc\scrwfile@starttoc + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Clone TOC Feature} +% +% \pkg*{scrwfile} may clone a TOC, that means, every entry to one file will +% be copied to other files, too. You must not clone recursively! +% +% \begin{description} +% \item[ToDo:]The whole feature should be moved to \pkg*{tocbasic}. But this +% would need a complete re-implementation and would result in one more write +% handle for every cloned file. So maybe it wouldn't be a really good idea +% to do so. +% \end{description} +% +% \begin{macro}{\scrwfile@process@clones} +% \begin{macrocode} +\newcommand*{\scrwfile@process@clones}[1]{% + \scr@ifundefinedorrelax{scrwfile@clone@#1}{}{% + \begingroup + \let\@@protect\protect\let\protect\@empty\afterassignment\restore@protect + \edef\reserved@b{\csname scrwfile@clone@#1\endcsname}% + \edef\reserved@c{,#1}% + \@for \reserved@a:=\reserved@b\do {% + \@tempswatrue + \@for \reserved@d:=\reserved@c\do {% + \ifx\reserved@d\reserved@a\@tempswafalse\fi + }% + \if@tempswa +%<trace> \typeout{clone entry from `#1' to `\reserved@a'}% + \immediate\write\scrwfile@wrtout{% + \string\@writefile{\reserved@a}{\the\@temptokena}% + }% + \edef\reserved@c{\reserved@c,\reserved@a}% + \fi + }% + \endgroup + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{command}{\TOCclone} +% \changes{v0.1.8}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}} +% \changes{v0.1.8}{2019/11/19}{\cs{ifattoclist} replaced by \cs{Ifattoclist}} +% \changes{v0.1.8}{2019/11/19}{\cs{iftocfeature} replaced by +% \cs{Iftocfeature}} +% \changes{v0.1.8}{2020/02/25}{spurious space in warning message removed} +% \changes{v0.1.9}{2021/05/30}{requires package \pkg*{tocbasic}} +% \changes{v0.1.9}{2021/05/30}{can be used only in preamble} +% Clone the entries from the second (first mandatory) argument TOC to the +% third (second mandatory) argument TOC. If the first (optional) argument was +% given, define |\listof#3name| to this and also define |\listof#3| and clone +% the toc features \texttt{leveldown}, \texttt{numbered}, \texttt{onecolumn} +% and \texttt{totoc} of |#2| to |#3|. The toc feature \texttt{nobabel} will +% always be set, because the babel entries at TOC |#3| will be cloned from TOC +% |#2|. +% \begin{description} +% \item{Note:} We use owner \texttt{TOCclone} for all cloned extensions. +% \end{description} +% \begin{macrocode} +\newcommand*{\TOCclone}[3][]{% + \RequirePackage{tocbasic}% + \scr@ifundefinedorrelax{scrwfile@clone@#2}{% + \expandafter\protected@edef\csname scrwfile@clone@#2\endcsname{% + #3,\protect\csname scrwfile@clone@#3\endcsname + }% + }{% + \edef\reserved@b{\csname scrwfile@clone@#2\endcsname}% + \expandafter\protected@edef\csname scrwfile@clone@#2\endcsname{% + \csname scrwfile@clone@#2\endcsname,% + #3,% + \protect\csname scrwfile@clone@#3\endcsname + }% + }% + \scr@ifundefinedorrelax{scrwfile@clone@#3}{% + \expandafter\let\csname scrwfile@clone@#3\endcsname\@empty + }{}% + \Ifattoclist{#3}{% + \PackageWarning{scrwfile}{`#3' already under control of + tocbasic.\MessageBreak + Nevertheless features will be set% + }% + }{% + \addtotoclist[TOCclone]{#3}% + }% + \setuptoc{#3}{nobabel}% + \Ifstr{#1}{}{% + }{% + \@namedef{listof#3name}{#1}% + \@namedef{listof#3}{\listoftoc{#3}}% + \Iftocfeature{#2}{leveldown}{\setuptoc{#3}{leveldown}}{}% + \Iftocfeature{#2}{numbered}{\setuptoc{#3}{numbered}}{}% + \Iftocfeature{#2}{onecolumn}{\setuptoc{#3}{leveldownonecolumn}}{}% + \Iftocfeature{#2}{totoc}{\setuptoc{#3}{totoc}}{}% + }% +} +\@onlypreamble\TOCClone +%</body> +% \end{macrocode} +% \end{command} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +% \PrintChanges +% +% \endinput +% Local Variables: +% mode: doctex +% ispell-local-dictionary: "en_US" +% eval: (flyspell-mode 1) +% TeX-master: t +% TeX-engine: luatex-dev +% eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx")) +% End: |