% \CheckSum{271} % \iffalse meta-comment % ====================================================================== % scrwfile.dtx % Copyright (c) Markus Kohm, 2010-2012 % % 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. % % The KOMA-Script bundle consists of all files listed in manifest.txt. % The work `scrwfile' consists of the files `scrwfile.dtx' and % `scrlogo.dtx'. % % If you're missing the installation batch file `scrwfile.ins', try % tex scrwfile.dtx % to unpack all files. % The package documentation may be produced repeating % latex scrwfile.dtx % at least three times. % ---------------------------------------------------------------------- % scrwfile.dtx % Copyright (c) Markus Kohm, 2010-2012 % % Diese Datei ist Teil des LaTeX2e KOMA-Script-Pakets. % % Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz, % Version 1.3c. % Die neuste Version dieser Lizenz ist % http://www.latex-project.org/lppl.txt % und Version 1.3c ist Teil aller Verteilungen von LaTeX % Version 2005/12/01 und dieses Werks. % % Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained" % (allein durch den Autor verwaltet). % % Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm. % % Das KOMA-Script-Paket besteht aus allen Dateien, die in manifest.txt % genannt sind. % Das Werk `scrwfile' besteht aus den Dateien `scrwfile.dtx' und % `scrlogo.dtx'. % % Falls Sie die Installations-Batch-Datei `scrwfile.ins' vermissen, % probieren Sie einfach einmal % tex scrwfile.dtx % um alle Dateien auszupacken. Zur englischen Anleitung siehe den % englischen Kommentar oben. % ====================================================================== % \fi % % \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 \~} % % \iffalse %%% From File: scrwfile.dtx %<*dtx> \def\LaTeXformat{LaTeX2e} \ifx\fmtname\LaTeXformat \makeatletter \let\saved@@end\@@end \def\@@end{\csname fi\endcsname\saved@@end} \makeatother \ProvidesFile{scrwfile.dtx} % %<(package&identify)|driver>\NeedsTeXFormat{LaTeX2e}[1995/06/01] %\ProvidesPackage{scrwfile} %\ProvidesFile{scrwfile.drv} %\ProvidesFile{scrwfile.tex} %<*dtx|(package&identify)|driver|doc> [2011/09/11 v0.1c-alpha LaTeX2e KOMA-Script package (write and clone files)] % %<*driver> \documentclass{scrdoc} \usepackage[ngerman,english]{babel} \usepackage{listings} \lstnewenvironment{lstcode}[1][]{% \lstset{language=[LaTeX]TeX,basicstyle=\ttfamily\small,#1}% }{} \CodelineIndex \RecordChanges \GetFileInfo{scrwfile.dtx} \title{The \KOMAScript{} package \texttt{scrwfile}% \footnote{This is version \fileversion\ of file \texttt{\filename}.}} \date{\filedate} \author{Markus Kohm} \newenvironment{Explain}{\par}{\par} \let\Macro\cs \let\Package\textsf \let\File\texttt \let\Option\texttt \let\Counter\texttt \let\ShowOutput\quote \let\endShowOutput\endquote \let\Parameter\marg \let\OParameter\oarg \newcommand\PParameter[1]{\mbox{\texttt{\{#1\}}}} \let\PName\meta \let\PValue\texttt \providecommand*{\autoref}[1]{\expandafter\AUTOREF#1:} \newcommand*{\AUTOREF}{} \makeatletter \def\AUTOREF#1:#2:{% \edef\@tempa{#1}% \edef\@tempb{tab}\ifx\@tempa\@tempb table~\fi \edef\@tempb{sec}\ifx\@tempa\@tempb section~\fi \ref{#1:#2}% } \makeatother \begin{document} \maketitle \DocInput{\filename} \end{document} % %<*dtx> \fi % Now the installation driver: % %<*insfile> \expandafter\let\expandafter\ifbeta\csname iffalse\endcsname \def\batchfile{scrwfile.dtx} \input docstrip.tex \ifToplevel{% \Msg{**********************************************************************} \Msg{*} \Msg{* KOMA-Script presents scrwfile} \Msg{* a package to define, configure and several different styles for} \Msg{* table of contents, list of floats and the like.} \Msg{*} \Msg{* This is `\batchfile', a batch file to unpack the package scrwfile,} \Msg{* the documentation of the package, and an archive of all these files.} \Msg{*} \Msg{**********************************************************************} \keepsilent \askforoverwritefalse } \preamble Copyright (c) 2010-2012 by Markus Kohm This file was generated from file(s) of the 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 or later 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 file may only be distributed together with the file `scrwfile.dtx' and `scrlogo.dtx'. You may however distribute the files `scrwfile.dtx' and `scrlogo.dtx' without this file. If this file is a beta version, you are not allowed to distribute it. English and German manuals are part of KOMA-Script bundle. ---------------------------------------------------------- The english manual is at `scrwfile.dtx', too. The KOMA-Script bundle (but not this file) was based upon the LaTeX2.09 Script family created by Frank Neukam 1993 and the LaTeX2e standard classes created by The LaTeX3 Project 1994-1996. THIS IS AN ALPHA VERSION! USAGE OF THIS VERSION IS ON YOUR OWN RISK! EVERYTHING MAY HAPPEN! EVERYTHING MAY CHANGE IN FUTURE! THERE IS NO SUPPORT, IF YOU USE THIS PACKAGE! \endpreamble \generate{\usepreamble\defaultpreamble \file{scrwfile.sty}{% \ifx\ifbeta\iftrue\from{scrbeta.dtx}{package,scrwfile}\fi \from{scrwfile.dtx}{package,trace,scrwfile,identify,option,body}% \from{scrlogo.dtx}{logo}% }% } \ifToplevel{% \generate{\usepreamble\defaultpreamble \file{scrwfile.ins}{% \from{scrwfile.dtx}{insfile}% }% \file{scrwfile.tex}{% \from{scrwfile.dtx}{doc}% }% \file{scrwfile.drv}{% \from{scrwfile.dtx}{driver}% }% }% } \ifToplevel{% \Msg{**********************************************************************} \Msg{*} \ifbeta \Msg{* THIS IS AN ALPHA OR BETA VERSION. YOU SHOULD NOT INSTALL OR USE IT!} \Msg{* THERE MAY BE A LOT OF BUGS AT THIS VERSION!} \Msg{* PLEASE INSTALL THE RELEASE YOU MAY FIND AT CTAN OR BERLIOS!} \else \Msg{* To finish the installation you have to copy the file `scrwfile.sty'} \Msg{* to folder `tex/latex/scrwfile/' of one of your TEXMF trees.} \Msg{* You should also produce the documentation using} \Msg{*\space\space latex scrwfile.dtx} \Msg{* and copy it to folder `doc/latex/scrwfile/' of one of your} \Msg{* TEXMF trees.} \Msg{*} \Msg{* See the manual of your TeX distribution for more informations about} \Msg{* package installation.} \fi \Msg{*} \Msg{**********************************************************************} } % %<*dtx|doc> %<*dtx> \csname endinput\endcsname % % \fi % % \selectlanguage{english} % % \changes{v0.1}{2010/10/01}{start of new package} % %\iffalse^^A meta comment \chapter[{Spare and Replace Files Using \Package{scrwfile}}] {Spare and Replace Files Using \Package{scrwfile}% \footnote{This chapter has been generated from \File{scrwfile.dtx}.}% } \labelbase{scrwfile} %\fi^^A meta comment % \begin{abstract} \TeX{} supports 18 write handles only. Handle 0 is used by \TeX{} itself (log file). \LaTeX{} needs at least handle 1 for \Macro{@mainaux}, handle 2 for \Macro{@partaux}, one handle for \Macro{tableofcontents}, one handle for \Macro{listoffigures}, one handle for \Macro{listoftables}, one handle for \Macro{makeindex}. So there are 11 left. Seams a lot and enough. But every new float, every new index and several other packages, e.g., \Package{hyperref} need write handles, too. Loading \Package{scrwfile} minimizes the need of write handles for list of floats or tables of contents. Additionally it allows to clone entries from one file to another file. % \end{abstract} % % \tableofcontents \section{The Idea} \label{sec:scrwfile.idea} Table of contents, list of figures, list of tables and other content directories make use of a small amount of \LaTeX{} kernel macros to open helper files, write to those helper files and read them. The first macro is \Macro{@starttoc}. It is used inside of \Macro{tableofcontents}, \Macro{listoffigure}, \Macro{listoftable} and many \Macro{listof} macros of several packages. The primary macro \Macro{@starttoc} reads the helper file with the contents of the directory. But this kernel macro also calls for a new write handle and even opens the helper file for writing. So every call of this macro consumes one of the rare write handles. But while the document is processed nobody writes to that handle until \Macro{end}\PParameter{document}. Every write operation should be done using \Macro{addtocontents} or \Macro{addcontentsline}, that internally uses \Macro{addtocontents}, too. The macro \Macro{addtocontents} does not really write to the helper file, but writes a \Macro{@writefile} macro to the main or part \File{aux} file. At \Macro{end}\PParameter{document} the main \File{aux} file is closed and after closing \LaTeX{} inputs the main \File{aux} file. While this reading the \Macro{@writefile} macros are processed and only then the helper files are written. You see, there is no need to hold the helper files open while the document is processed. The helper files need to be opened only before reading the \File{aux} file at \Macro{end}\PParameter{document}. Even you do not need one write handle per helper file, if you only could write one after the other. In this case only one write handle would be needed. And that's the idea. \section{Using the Package} \label{sec:scrwfile.usage} First of all you have to load the package. This may be simply done using \begin{lstcode} \usepackage{scrwfile} \end{lstcode} or if you are a package author by using \begin{lstcode} \RequirePackage{scrwfile} \end{lstcode} This also activates the \emph{single file feature}. \subparagraph*{Note:} The package \Package{scrwfile} may be used with other files, that redefine \Macro{@starttoc}. But if these files do a complete new definition of \Macro{@starttoc} you should load them before \Package{scrwfile} to avoid errors. \subsection{The Single File Feature} To activate the single file feature, that means, that \Macro{\@starttoc} does not longer consumes write handles and every open and write to helper file action will be done at \Macro{end}\PParameter{document}, you only need to load package \Package{scrwfile}. See \autoref{sec:scrwfile.idea} for more information about the idea of this feature. \subparagraph*{Note:} Package \Package{scrwfile} uses package \Package{scrlfile} to redefine \Macro{@writefile} while \Macro{end}\PParameter{document}. Instead of directly writing to the helper files \Macro{@writefile} itself will write to a new helper file \Macro{jobname}\File{.wrt}. To write all the helper files this will file be input several times. One time for each helper file. \subsection{The Clone File Write Feature} Sometimes it is useful to input a file not only once but several times. As \Macro{@starttoc} does not open files for writing any longer, this may be done by simply using \Macro{\@starttoc} several times with the same extension. But sometimes you may have additional entries in only some of the content directories. Because of this, \Package{scrwfile} allows to copy all entries of a file to another file, too. We call this cloning. %\iffalse^^A meta-comment \begin{Declaration} %\fi^^A meta-comment % \DescribeMacro{\TOCclone} % The command \Macro{TOCclone}% \OParameter{heading}\Parameter{source}\Parameter{destination} %\iffalse^^A meta-comment \end{Declaration} \BeginIndex{Cmd}{TOCclone}% %\fi^^A meta-comment activates the clone feature for files with extensions \PName{source} and \PName{destination}. All entries to the file \Macro{jobname}\File{.}\PName{source} will be added to \Macro{jobname}\File{.}\PName{destination}, too. If extension \PName{destination} is a new one, \PName{destination} will be added to the list of known extensions using the \KOMAScript{} package \Package{tocbasic}. If the optional argument \PName{heading} is given, a new list-of macro \Macro{listof}\PName{destination} is defined. \PName{heading} will be used as section (or chapter) heading of this list. In this case several \Package{tocbasic} features of the \PName{source} will be copied to \PName{destination}, if and only if they have been set up when \Macro{TOCclone} was used. Feature \PName{nobabel} will always be set, because the language selection commands are part of the helper file and would be cloned, too. % \subparagraph*{How you can use it:} %\iffalse^^A meta-comment \begin{Example} %\fi^^A meta-comment E.g., you want a short table of contents with only the chapter level but an additional entry with the table of contents: \begin{lstcode} \usepackage{scrwfile} \TOCclone[Short \contentsname]{toc}{stoc} \AtBeginDocument{% % aux first opened at \begin{document}. So wait until this: \addtocontents{toc}{% first toc entry: \proctect\addcontentsline{stoc}{% write to Short Contents \protect\tableofcontents% Contents }% }% } \begin{document} \setcounter{tocdepth}{1}% show chapters only \listofstoc% Write short table of contents \setcounter{tocdepth}{6}% show all levels \tableofcontents% Write table of contents \end{lstcode} You need at least three \LaTeX{} runs to get a short table of contents and a detailed table of contents. The detailed one produces an entry at the short one but this entry will not be part of the detailed table of contents. %\iffalse^^A meta-comment \end{Example} \EndIndex{Cmd}{TOCclone} %\fi^^A meta-comment %\iffalse % %\fi % % \StopEventually{% % \clearpage % \PrintIndex\PrintChanges} % % % \section{Implementation} % % \iffalse %<*package> %<*identify> % \fi % % \begin{macrocode} \PackageWarningNoLine{scrwfile}{% THIS IS AN ALPHA VERSION!\MessageBreak USAGE OF THIS VERSION 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.% } % \end{macrocode} %\iffalse % %\fi % % \subsection{Options} % \iffalse %<*option> % \fi % % Currently we don't need options. % % \iffalse % % \fi % % \subsection{Body} % \iffalse %<*body> % \fi % % \subsubsection{Needed Packages} % % Package \textsf{scrbase} is needed, because of using several \KOMAScript{} % basic commands. % \begin{macrocode} \RequirePackage{scrbase}[2010/09/17] % \end{macrocode} % % Package \textsf{tocbasic} is needed for the lists of cloned TOCs. % \begin{macrocode} \RequirePackage{tocbasic}[2010/10/01] % \end{macrocode} % % Package \textsf{scrlfile} is needed because of the \texttt{aux} file % handling and \verb|\protected@immediate@write|. % \begin{macrocode} \RequirePackage{scrlfile}[2010/09/30] % \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 % |\@starttoc| and |\@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 |\@writefile| to do so. % \end{description} % Every patch should be minimum invasive, so that files, that are not under % \textsf{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 \textsf{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@only\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} % \begin{macro}{\scrwfile@@starttoc} % This is the internal redefinition of |\@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]{% % \typeout{Use 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} % \end{macro} % % \begin{macro}{\scrwfile@writefile} % \begin{macro}{\scrwfile@@writefile} % \begin{macro}{\scrwfile@wrtout} % \begin{macro}{\scrwfile@writefilelist} % This is the internal redefinition of |\@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]{% % \typeout{Use 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} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@writefile} % We have to add the single handle feature and the clone file feature to this. % \begin{macro}{\scrwfile@saved@writefile} % This is the original definition, that will be used, if the file is not under % \texttt{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}{% % \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} % \end{macro} % \end{macro} % % \begin{macro}{\@starttoc} % We have to add the single handle feature to this. % \begin{macro}{\scrwfile@saved@starttoc} % This is the original definition, that will be used, if the file is not under % \texttt{scrwfile}'s control. % \begin{macrocode} \newcommand*{\scrwfile@saved@starttoc}{} \let\scrwfile@saved@starttoc\@starttoc \let\@starttoc\scrwfile@starttoc % \end{macrocode} % \end{macro} % \end{macro} % % % \subsubsection{Clone TOC Feature} % % \textsf{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{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 % \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{macro}{\TOCclone} % 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|. \textbf{Note:} We use owner \texttt{TOCclone} for all cloned % extensions. % \begin{macrocode} \newcommand*{\TOCclone}[3][]{% \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}}{}% }% } % \end{macrocode} % \end{macro} % % \iffalse % % % \fi % % \Finale % \endinput % % end of file `scrwfile.dtx' %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% End: