texlive[52526] Master/texmf-dist: subfiles (24oct19)

commits+karl at tug.org commits+karl at tug.org
Thu Oct 24 23:48:25 CEST 2019


Revision: 52526
          http://tug.org/svn/texlive?view=revision&revision=52526
Author:   karl
Date:     2019-10-24 23:48:25 +0200 (Thu, 24 Oct 2019)
Log Message:
-----------
subfiles (24oct19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/subfiles/README
    trunk/Master/texmf-dist/doc/latex/subfiles/subfiles.pdf
    trunk/Master/texmf-dist/source/latex/subfiles/subfiles.dtx
    trunk/Master/texmf-dist/source/latex/subfiles/subfiles.ins
    trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.cls
    trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.sty

Modified: trunk/Master/texmf-dist/doc/latex/subfiles/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/subfiles/README	2019-10-24 21:48:12 UTC (rev 52525)
+++ trunk/Master/texmf-dist/doc/latex/subfiles/README	2019-10-24 21:48:25 UTC (rev 52526)
@@ -1,6 +1,6 @@
 subfiles - class and package for multi-file projects in LaTeX
 
-Author: Federico Garcia
+Author: Federico Garcia, Gernot Salzer
 
 This material is subject to the LaTeX Project Public License. See
 http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html

Modified: trunk/Master/texmf-dist/doc/latex/subfiles/subfiles.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/subfiles/subfiles.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/subfiles/subfiles.dtx	2019-10-24 21:48:12 UTC (rev 52525)
+++ trunk/Master/texmf-dist/source/latex/subfiles/subfiles.dtx	2019-10-24 21:48:25 UTC (rev 52526)
@@ -2,7 +2,7 @@
 %
 % subfiles - class and package for multi-file projects in LaTeX
 % Copyright 2002, 2012 Federico Garcia (feg8 at pitt.edu, fedegarcia at hotmail.com)
-% Copyright 2018 Gernot Salzer (salzer at logic.at)
+% Copyright 2018, 2019 Gernot Salzer (salzer at logic.at)
 %
 % This work may be distributed and/or modified under the
 % conditions of the LaTeX Project Public License, either version 1.3
@@ -23,13 +23,13 @@
 %
 %<*driver>
 % \fi
-\ProvidesFile{subfiles.dtx}[2018/07/31 v1.2 Multi-file projects]
+\ProvidesFile{subfiles.dtx}[2019/09/28 v1.3 Multi-file projects]
 % \iffalse
 \documentclass{ltxdoc}
 \GetFileInfo{subfiles.dtx}
-\title{A Document Class and a Package for handling multi-files projects}
+\title{A Document Class and a Package\\for Handling Multi-File Projects}
 \date{\filedate{}}
- \author{Federico Garcia\\{\small (v1.2 update by Gernot Salzer)}}
+ \author{Federico Garcia, Gernot Salzer}
 
 \begin{document}
 \maketitle
@@ -38,68 +38,205 @@
 %</driver>
 % \fi
 % \begin{abstract}
-% With the |subfiles| set, the typesetting of a multi-file project consisting of one main file and one or more subsidiary files (subfiles) is more comfortable, since the user can \LaTeX\ either the main file, which will |\input| the subfiles normally, or the subfiles by themselves, which take the preamble of the main file and become self-sufficient \LaTeX\ documents.
+%   The |subfiles| package allows authors to split a document into one main file and one and more subsidiary files (subfiles) akin to the |\input| command, with the added benefit of making the subfiles compilable by themselves.
+%   This is achieved by reusing the preamble of the main file also for the subfiles.
 % \end{abstract}
 % \section{Introduction}
-% \LaTeX\ commands |\include| and |\input| allow for the creation of different input files to be typeset jointly into a single output. The advantages of this are evident in the creation of large documents with many chapters, but there are also other circumstances in which the author might want to use this feature. I have used it particularly for long-coded examples, tables, figures, etc\@.\footnote{In my case most times it has been musical examples, whose code in MusiX\TeX\ is long, intrincate, and barely readable.}, which require a considerable amount of trial-and-error. 
+% The \LaTeX\ commands |\include| and |\input| allow the user to split the \TeX\ source of a document into several input files.
+% This is useful when creating documents with many chapters, but also for handling large tables, figures, and code samples, which require a considerable amount of trial-and-errors.%
+% \footnote{Frederico had to typset numerous musical examples, whose code in MusiX\TeX\ is long, intrincate, and barely readable.} 
 %
-% In this process the rest of the document is of little use, and it can even disturb.\footnote{For example, the error messages indicate not only a wrong line number, but even the wrong file.} Frequently, one ends up wanting to work \emph{only} on the new file, which means following three steps:
+% In this process the rest of the document is of little use, and can even interfere.
+% For example, error messages may indicate not only the wrong line number, but may point to the wrong file.
+% Frequently, one ends up wanting to work only on the new file:
 % 
 % \begin{itemize}
-% \item Create a new file, and copy-paste in it the preamble of the main file;
-% \item Work in the example, typeset it \emph{alone} as many times as necessary; 
-% \item When the result is satisfactory, delete the preamble from the new file (and the |\end{document}|!), and |\include| or (more frequently) |\input| it from the main file.
+% \item Create a new file, and copy-paste the preamble of the main file into it.
+% \item Work on this file, typeset it \emph{alone} as many times as necessary.
+% \item Finally, when the result is satisfactory, delete the preamble from the file (alongside with |\end{document}|!), and |\include| or |\input| it from the main file.
 % \end{itemize}
 % 
-% It is desirable to reduce these three steps to the only interesting one, the middle one. This would mean that each new, subordinated file (henceforth, `subfile') should be \emph{both} part of a project and a self-sufficient \LaTeX\ document, depending on whether it is \LaTeX ed or |\included|/|\input|. This is what the set of class and package under the name |subfiles| is intended for. 
+% It is desirable to reduce these three steps to the interesting, middle one.
+% Each new, subordinate file (henceforth `subfile') should behave both as a self-sufficient \LaTeX\ document and as part of the whole project, depending on whether it is \LaTeX ed individually or |\included|/|\input| from the main document.
+% This is what the class |subfiles.cls| and the package |subfiles.sty| are intended for. 
+% 
+% \section{Basic usage}
 %
-% The main idea behind it is the redefinition of |\documentclass| and the |document| environment; while these two features of \LaTeX\ are important to keep unchanged, |subfiles| changes them, as far as I know, harmlessly, and I have took care of undoing the changes when finished. This is the first version of |subfiles|, and although I have tried it a few times, it is still susceptible to conflicts with other packages and/or classes. (In fact, a conflict with the |revtex4| class later gave rise to version 1.2 of the package.)
-% 
-% \section{Usage}
-% 
-% \subsection{Setting up}
-% 
-% The files involved have the following basic structures:
-% 
+% The main file, i.e., the file with the preamble to be shared with the subfiles, has to load the package |subfiles| \emph{at the very end of the preamble}:
+% \begin{center}
+%   \begin{tabular}{l}
+%     |\usepackage{subfiles}|\\
+%     |\begin{document}|
+%   \end{tabular}
+% \end{center}
+% Subordinate files (subfiles) are loaded from the main file or from other subfiles with the command
+% \begin{center}
+%   |\subfile{|\meta{subfile\_name}|}|
+% \end{center}
+% The subfiles have to start with the line
+% \begin{center}
+%   |\documentclass[|\meta{main\_file\_name}|]{subfiles}|
+% \end{center}
+% which loads the class |subfiles|.
+% Its only `option', which is actually mandatory, gives the name of the main file.
+% This name follows \TeX\ conventions: |.tex| is the default extension, the path has to be provided if the main file is in a different directory, and directories in the path have to be separated by |/| (not |\|).
+% Thus, we have the following structure:
 % \begin{center}\small
-% \begin{tabular}{ll}
-% \multicolumn{1}{c}{\emph{MAIN FILE}} & \multicolumn{1}{c}{\emph{SUBFILE}}\\
-% \qquad\meta{some preamble} & |\documentclass[|\meta{main\_file\_name}|]{subfiles}|\\
-% |\usepackage{subfiles}| & |\begin{document}|\\
-% |\begin{document}| & \qquad\meta{text, graphics, etc.}\\
-% \qquad\meta{text}&|\end{document}|\\
-% |\subfile{|\meta{subfile\_name}|}|\\
-% \qquad\meta{more text}\\
-% |\end{document}|
-% \end{tabular}
+%   \begin{tabular}[t]{l}
+%     \multicolumn{1}{c}{main file} \\
+%     \hline
+%     |\documentclass[...]{...}| \\
+%     \meta{shared preamble} \\
+%     |\usepackage{subfiles}| \\
+%     |\begin{document}| \\
+%     \dots \\
+%     |\subfile{|\meta{subfile\_name}|}| \\
+%     \dots \\
+%     |\end{document}| \\
+%     \hline 
+%   \end{tabular}
+%   \hfill  
+%   \begin{tabular}[t]{l}
+%     \multicolumn{1}{c}{subfile} \\
+%     \hline
+%     |\documentclass[|\meta{main\_file\_name}|]{subfiles}| \\
+%     |\begin{document}| \\
+%     \dots \\
+%     |\end{document}| \\
+%     \hline
+%   \end{tabular}
 % \end{center}
-% 
-% The |subfiles| package is to be loaded in the main file of a \LaTeX\ project at the end of the preamble, and the |subfiles| class is to be loaded by each subordinate file. Note that the |subfiles| class handles only \emph{one} `option' (whose presence is actually mandatory), the name of the main file. The name should be given according to \TeX\ conventions: |.tex| is the default extension; the path has to be indicated (|/|, not |\|) if the main file is in a different directory from the subfile; spaces are gobbled (at least under Windows).
-% 
-% \subsection{Results}
-% This done, \LaTeX ing either the main or the subordinate file produces the following results:
+% Now there are two possibilities.
 % \begin{itemize}
-% \item If the subfile is typeset by itself, it takes as preamble the one of the main file (including its |\documentclass|). The rest is typeset normally.
-% \item If the subordinated file was |\subfile|'d, it ignores everything before and including |\begin{document}|, and then ignores |\end{document}| too. (The body of the file, nothing else, is effectively |\input|.)
+% \item If \LaTeX\ is run on the subfile, the line |\documentclass[..]{subfiles}| is replaced by the preamble of the main file (including its |\documentclass| command).
+%   The rest of the subfile is processed normally.
+% \item If \LaTeX\ is run on the main file, the subfile is loaded like with an |\input| command, except that the three lines |\documentclass[..]{subfiles}|, |\begin{document}|, and |\end{document}| are ignored.
 % \end{itemize}
+%
+% \section{Advanced usage}
+%
+% \subsection{Hierarchy of directories}
+%
+% Sometimes it is desirable to put a subfile together with its images and further files into its own directory.
+% The difficulty now is that these additional files have to be addressed by different pathes depending on whether the main files or the subfile is typeset.
+% As of version 1.3, the |subfiles| package handles this problem by using the |import| package.
+%
+% As an example, consider the following hierarchy of files:
+% \begin{center}\ttfamily
+%   \begin{tabular}{l}
+%     main.tex\\
+%     mypreamble.tex\\
+%     dir1/subfile1.tex\\
+%     dir1/image1.jpg\\
+%     dir1/text1.tex\\
+%     dir1/dir2/subfile2.tex\\
+%     dir1/dir2/image2.jpg\\
+%     dir1/dir2/text2.tex
+%   \end{tabular}
+% \end{center}
+% where |main|, |subfile1|, and |subfile2| have the following contents:
+% \begin{center}
+% \begin{tabular}[t]{l}
+%   \multicolumn{1}{c}{|main.tex|} \\
+%   \hline
+%   |\documentclass{article}| \\
+%   |\input{mypreamble}| \\  
+%   |\usepackage{graphicx}| \\
+%   |\usepackage{subfiles}| \\
+%   |\begin{document}| \\
+%   |\subfile{dir1/subfile1}|\\
+%   |\end{document}|\\
+%   \hline
+% \end{tabular}%
+% \hfill
+% \begin{tabular}[t]{l}
+%   \multicolumn{1}{c}{|subfile1.tex|} \\
+%   \hline
+%   |\documentclass[../main]{subfiles}| \\
+%   |\begin{document}| \\
+%   |\input{text1}|\\ 
+%   |\includegraphics{image1.jpg}|\\ 
+%   |\subfile{dir2/subfile2}| \\  
+%   |\end{document}| \\
+%   \hline
+% \end{tabular}\\[2ex]
+% \begin{tabular}[t]{l}
+%   \multicolumn{1}{c}{|subfile2.tex|} \\
+%   \hline
+%   |\documentclass[../../main]{subfiles}| \\
+%   |\begin{document}| \\
+%   |\input{text2}|\\ 
+%   |\includegraphics{image2.jpg}|\\ 
+%   |\end{document}| \\
+%   \hline
+% \end{tabular}
+% \end{center}
+% Then each of the three files can be typeset individually in its respective directory, where \LaTeX\ is able to locate all included text files and images.
 % 
-% The |\subfile| command is more like |\input| than |\include| in the sense that it does not start a new page. It allows nesting, but there is no exclusion mechanism analogous to |\includeonly|. 
+% \subsection{Additional definitions for subfiles}
 %
-% \subsection{Further details and warnings}
+% Usually all definitions and packages required by the subfiles should go into the preamble of the main file.
+% There are some places, though, where one might consider adding definitions for the subfiles.
 %
-% To be precise, a subfile typeset by itself does not exactly take the preamble of the main file, but \emph{everything outside} \verb|\begin{document}| and \verb|\end{document}|. This has two consequences: $a)$~the user can add some commands to be read only when the subfiles are typeset by themselves---which in any case are processed as part of the preamble; but also $b)$~the user has to be careful even \emph{after} |\end{document}| (in the main file), for any syntax error there will ruin the \LaTeX ing of the subfile(s).
+% \paragraph{Code after the end of the main document} is added to the preamble of the subfiles, but is ignored when typesetting the main file.
+% This happens because a subfile typeset by itself does not really take the preamble of the main file, but \emph{everything outside} of \verb|\begin{document}| and \verb|\end{document}|.
+% This has two consequences: \emph{a)}~the user can add some commands to be processed as part of the preamble only when the subfiles are typeset by themselves; but also \emph{b)}~the user has to be careful even \emph{after} |\end{document}| in the main file, for any syntax error there will ruin the \LaTeX ing of the subfile(s).
 %
-% The preamble of the main file can |\input| (not |\include| nor |\subfile|) other files (e.g.\ files with definitions and shorthand-commands), and the subfiles will too. But it has to be kept in mind that each subfile is |\input| within a group, so definitions made within them might not work outside. A good practice when using |subfiles| (and also when not using it) is to make any definitions in the preamble of the main file, avoiding confusion and allowing to find them easily.
+% \paragraph{Code in the preamble of a subfile} is processed as part of the text when typesetting the main file, but as part of the preamble when typesetting the subfile.
+% This means that the preamble of a subfile can only contain stuff that is acceptable for both, the preamble and the text area.
+% One should also keep in mind that each subfile is |\input| within a group, so definitions made within may not work outside.
+% A good practice when using |subfiles| (and also when not using it) is to make any definitions in the preamble of the main file, avoiding confusion and allowing the reader to find them easily.
 %
-% In principle, nesting files with |\subfile| should work and has worked in my tries, as far as every subfile loads the main file as its option to the |subfiles| class. However, who knows, the behavior can be unpredictable in weird situations. In any case, |subfiles| does \emph{not} disable |\include| nor |\input|, which remain available for free use.
+% \subsection{Avoiding extra spaces}
 %
-% The |subfiles| package requires the |verbatim| package (whose |comment| environment is used to ignore the different parts of different files); this should not be a problem since it makes part of the standard distribution of \LaTeX $2_\varepsilon$.
+% Sometimes you may want to load the contents of a subfile without white space separating it from the contents of the main file.
+% In this respect |\subfile| behaves like |\input|.
+% Any space or newline before and after the |\subfile| command will appear in the typeset document, as will any white space between the last character of the subfile and |\end{document}|.
+% Therefore, to load the contents of a subfile without intervening spaces, you have either to add comment signs:
+% \begin{center}
+%   \begin{tabular}[t]{l}
+%       \multicolumn{1}{c}{|main.tex|}\\
+%       \hline
+%       \dots\\
+%       |text before%|\\
+%       |\subfile{sub.tex}%|\\
+%       |text after|\\
+%       \hline
+%   \end{tabular}
+%   \qquad
+%   \begin{tabular}[t]{l}
+%       \multicolumn{1}{c}{|sub.tex|}\\
+%       \hline
+%       |\documentclass[main.tex]{subfiles}|\\
+%       |\begin{document}|\\
+%       |contents of subfile%|\\
+%       |\end{document}|\\
+%       \hline
+%   \end{tabular}
+% \end{center}
+% or to put everything on the same line:
+% \begin{center}
+%   |text before\subfile{sub.tex}text after|\\
+%   |contents of subfile\end{document}|
+% \end{center}
 %
-% \subsection{Version history}
+% \section{Dependencies}
 %
+% The |subfiles| package requires the |verbatim| package, whose |comment| environment is used to ignore the text area of the main file when typesetting subfiles separately.
+% Moreover, the |import| package is needed to load subfiles and their auxiliary files from different directories.
+% Both packages are part of the standard \TeX\ distributions.
+%
+% \section{Version history}
+%
 % \begin{description}
-% \item[v1.1:] Start of version history. Written by Federico Garcia.
-% \item[v1.2:] The |subfiles| package is now compatible with classes and packages that modify the |\document| command, like the class |revtex4|. Modification by Gernot Salzer.
+% \item[v1.1 (FG):]
+%   Start of version history.
+% \item[v1.2 (GS):]
+%   The |subfiles| package becomes compatible with classes and packages that modify the |\document| command, like the class |revtex4|.
+% \item[v1.3 (GS):]
+%   Use of |import| package to handle directory hierarchies.
+%   |\ignorespaces| added to avoid spurious spaces.
+%   Incompatibility with commands removed that expect |\document| to be equal to |\@onlypreamble| after the preamble (thanks to Eric Domenjoud for analysing the problem).
 % \end{description}
 %
 %\section{The Implementation}
@@ -107,70 +244,169 @@
 %    \begin{macrocode}
 %<*class>
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{subfiles}[2018/07/31 Federico Garcia, Gernot Salzer]
+\ProvidesClass{subfiles}[2019/09/28 v1.3 Federico Garcia, Gernot Salzer]
 \DeclareOption*{\typeout{Preamble taken from file `\CurrentOption'}%
     \let\preamble at file\CurrentOption}
-\ProcessOptions
+\ProcessOptions  
 %    \end{macrocode}
 %
-% The first thing to do is to save the regular \LaTeX\ definition of |\documentclass|:
+% We start by saving the regular \LaTeX\ definition of |\documentclass|:
+% 
 %    \begin{macrocode}
-\let\old at documentclass@subfiles\documentclass
+\let\subfiles at documentclass\documentclass
 %    \end{macrocode}
 %
-% Now |\documentclass|, after having already loaded |subfiles.cls|, is set equal to |\LoadClass| such that the class and the options of the main file will be loaded identically.
+% Now |\documentclass| is set equal to |\LoadClass| such that the class and the options of the main file will be loaded as usual.
+%
 %    \begin{macrocode}
 \let\documentclass\LoadClass\relax
 %    \end{macrocode}
 %
-% Now it is possible to |\input| the main file. The main file loads the package |subfiles| as part of the preamble, which saves the contents of |\document| and |\enddocument| as |\old at document@subfiles| and |\old at enddocument@subfiles|, respectively. After having loaded the main file, we can restore the original values of |\document|, |\enddocument| and |\documentclass|. The backup commands are |\undefined| to save memory. That's it.
+% To handle subfiles in separate directories, we load the |import| package.
+% 
 %    \begin{macrocode}
-\input{\preamble at file}
+\RequirePackage{import}
+%    \end{macrocode}
+%
+% The |\subimport| command requires the path and the basename of the file to be loaded in separate arguments.
+% Therefore we have to decompose file names into these two components.
+% 
+%    \begin{macrocode}
+\def\subfiles at split#1{%
+  \edef\subfiles at filename{#1}%
+  \def\subfiles at dir{}%
+  \def\subfiles at base{}%
+  \def\subfiles at sep{}%
+  \expandafter\subfiles at split@\subfiles at filename/\@nil/%
+}
+\def\subfiles at split@#1/{%
+  \def\tmp{#1}%
+  \ifx\tmp\@nnil
+    \let\subfiles at next\relax
+  \else
+    \edef\subfiles at dir{\subfiles at dir\subfiles at base\subfiles at sep}%
+    \def\subfiles at base{#1}%
+    \def\subfiles at sep{/}%
+    \let\subfiles at next\subfiles at split@
+  \fi
+  \subfiles at next  
+}
+%    \end{macrocode}
+%
+% After executing e.g.\ |\subfiles at split{../dir1/dir2/file.tex}|, the commands |\subfiles at dir| and |\subfiles at base| expand to |../dir1/dir2/| and |file.tex|, respectively.
+%
+% Now we split the name of the main file that has been provided as optional argument of the document class, and |\subimport| the main file.
+%
+%    \begin{macrocode}
+\subfiles at split{\preamble at file}
+\subimport{\subfiles at dir}{\subfiles at base}
+%    \end{macrocode}
+%
+% The main file loads the package |subfiles| as part of the preamble, which saves the contents of |\document| and |\enddocument| as |\subfiles at document| and |\subfiles at enddocument|, respectively.
+% Then we restore the original values of |\document|, |\enddocument|, and |\documentclass|. The backup commands are |\undefined| to save memory. That's it.
+%
+%    \begin{macrocode}
 {\catcode`\@=11
-\global\let\document\old at document@subfiles
-\global\let\enddocument\old at enddocument@subfiles
-\global\let\documentclass\old at documentclass@subfiles
-\global\let\old at document@subfiles\undefined
-\global\let\old at enddocument@subfiles\undefined
-\global\let\old at documentclass@subfiles\undefined}
-%</class>
+\global\let\document\subfiles at document
+\global\let\enddocument\subfiles at enddocument
+\global\let\documentclass\subfiles at documentclass
+\global\let\subfiles at document\undefined
+\global\let\subfiles at enddocument\undefined
+\global\let\subfiles at documentclass\undefined
+}
+%</class>      
 %    \end{macrocode}
 %
-% It may not be obvious why |@| has to be catcoded to a letter, since we are in a style file anyway. However, the |\preamble at file| occasionally contains |\usepackage| commands that make |@| a non-letter. This is why the part after loading the main preamble needs a |\catcode| command, grouping, and |\global|'s.
+% It may not be obvious why |@| has to be catcoded to a letter, since we are in a style file anyway.
+% However, the |\preamble at file| occasionally contains |\usepackage| commands that make |@| a non-letter.
+% This is why the part after loading the main preamble needs a |\catcode| command, grouping, and |\global|'s.
 %
+%
 % \subsection{The package}
-% Any option will be ignored. 
+%
+% Any option will be ignored.
+%
 %    \begin{macrocode}
 %<*package>
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{subfiles}[2018/07/31 Federico Garcia, Gernot Salzer]
+\ProvidesPackage{subfiles}[2019/09/28 v1.3 Federico Garcia, Gernot Salzer]
 \DeclareOption*{\PackageWarning{\CurrentOption ignored}}
 \ProcessOptions
 \RequirePackage{verbatim}
 %    \end{macrocode}
 %
-% \DescribeMacro{\skip at preamble}
-% The core of the package. It works by redefining the |document| environment, thus making |\begin{document}| and |\end{document}| of the subfile transparent to the inclusion. The redefinition of |\documentclass| is analogous, just having a required and an optional arguments which mean nothing to |\subfile|.
+% To handle subfiles in separate directories, we load the |import| package.
+% 
 %    \begin{macrocode}
-\newcommand{\skip at preamble}{%
-    \let\document\relax\let\enddocument\relax%
-    \newenvironment{document}{}{}%
-    \renewcommand{\documentclass}[2][subfiles]{}}
+\RequirePackage{import}
 %    \end{macrocode}
+%
+% The |\import| command requires the path and the basename of files in separate arguments.
+% Therefore we have to decompose file names into these two components.
 % 
+%    \begin{macrocode}
+\def\subfiles at split#1{%
+  \edef\subfiles at filename{#1}%
+  \def\subfiles at dir{}%
+  \def\subfiles at base{}%
+  \def\subfiles at sep{}%
+  \expandafter\subfiles at split@\subfiles at filename/\@nil/%
+}
+\def\subfiles at split@#1/{%
+  \def\tmp{#1}%
+  \ifx\tmp\@nnil
+    \let\subfiles at next\relax
+  \else
+    \edef\subfiles at dir{\subfiles at dir\subfiles at base\subfiles at sep}%
+    \def\subfiles at base{#1}%
+    \def\subfiles at sep{/}%
+    \let\subfiles at next\subfiles at split@
+  \fi
+  \subfiles at next  
+}
+%    \end{macrocode}
+%
+% After executing e.g.\ |\subfiles at split{../dir1/dir2/file.tex}|, the commands |\subfiles at dir| and |\subfiles at base| expand to |../dir1/dir2/| and |file.tex|, respectively.
+%
 % \DescribeMacro{\subfile}
-% Note that the new command |\subfile| calls for |\skip at preamble| \emph{within a group}. The changes to |document| and |\documentclass| are undone after the inclusion of the subfile. 
+% The command |\subfile| first redefines |\documentclass| and the |document| environment to do nothing.
+% To avoid spurious spaces we |\ignorespaces|.
+% Moreover, we have to set |\document| to the value it usually has after the end of the preamble, since some commands check this value and raise an error saying that the command cannot be used in the preamble.
+%
 %    \begin{macrocode}
-\newcommand\subfile[1]{\begingroup\skip at preamble\input{#1}\endgroup}
+\newcommand\subfile[1]{%
+  \begingroup
+  \renewcommand\documentclass[2][subfiles]{\ignorespaces}%
+  \renewenvironment{document}{\let\document\@onlypreamble\ignorespaces}{}%
 %    \end{macrocode}
-% If the package is being processed as part of the main file, then we are done. However, if the initial document class was |subfiles|, then the main file is loaded as part of a subfile. In this case the subsequent text between |\begin{document}| and |\end{document}| has to be skipped, but the contents of the commands |\document| and |\enddocument| has to be retained for using it with the contents of the subfile. Therefore we save the contents of the two commands as |\old at document@subfiles| and |\old at enddocument@subfiles|, respectively.  Now the |document| environment is redefined to become the |comment| environment from the |verbatim| package. As a consequence, the body of the main file is ignored by \LaTeX, and only the preamble is read (and anything that comes after |\end{document}|!).
+%
+% Now we split the file name into path and base name and |\subimport| it.
+%
 %    \begin{macrocode}
+  \subfiles at split{#1}%
+  \subimport{\subfiles at dir}{\subfiles at base}%
+  \unskip
+  \endgroup
+}
+%    \end{macrocode}
+% 
+% Note that the changes to |\documentclass| and the |document| environment happen \emph{within a group}, so they are undone after inclusion of the subfile.
+%
+% If the package is being processed as part of the main file, then we are done.
+% However, if the initial document class was |subfiles|, then the main file is loaded as part of a subfile.
+% In this case anything between |\begin{document}| and |\end{document}| has to be skipped, while the contents of the commands |\document| and |\enddocument| has to be retained for later use in the subfile.
+% Therefore we save the contents of the two commands as |\subfiles at document| and |\subfiles at enddocument|, respectively.
+% Now the |document| environment is redefined to become the |comment| environment from the |verbatim| package.
+% Consequently, the body of the main file is ignored by \LaTeX, and only the preamble is read (as well as anything that comes after |\end{document}|!).
+%    \begin{macrocode}
 \@ifclassloaded{subfiles}{%
-  \let\old at document@subfiles\document
-  \let\old at enddocument@subfiles\enddocument
+  \let\subfiles at document\document
+  \let\subfiles at enddocument\enddocument
   \let\document\comment
   \let\enddocument\endcomment
 }{}
 %</package>
 %    \end{macrocode}
-% By loading the |subfiles| package immediately before |\begin{document}| we ensure that |\old at document@subfiles| and |\old at enddocument@subfiles| contain all modifications that the class and the preamble of the main file may have applied to the |document| environment. E.g., the class |revtex4| prepends some commands to |\document|.
\ No newline at end of file
+%
+% By loading the |subfiles| package immediately before |\begin{document}| we ensure that |\subfiles at document| and |\subfiles at enddocument| contain all modifications that the class and the preamble of the main file may have applied to the |document| environment.
+% This happens e.g.\ with the class |revtex4| and the package |pythontex|.
\ No newline at end of file

Modified: trunk/Master/texmf-dist/source/latex/subfiles/subfiles.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/subfiles/subfiles.ins	2019-10-24 21:48:12 UTC (rev 52525)
+++ trunk/Master/texmf-dist/source/latex/subfiles/subfiles.ins	2019-10-24 21:48:25 UTC (rev 52526)
@@ -1,6 +1,6 @@
 % subfiles - class and package for multi-file projects in LaTeX
 % Copyright 2002, 2012 Federico Garcia (feg8 at pitt.edu, fedegarcia at hotmail.com)
-% Copyright 2018 Gernot Salzer (salzer at logic.at)
+% Copyright 2018, 2019 Gernot Salzer (salzer at logic.at)
 %
 % This work may be distributed and/or modified under the
 % conditions of the LaTeX Project Public License, either version 1.3
@@ -23,7 +23,7 @@
 
 This is a generated file.
 
-Copyright 2002, 2012 Federico Garcia; 2018 Gernot Salzer
+Copyright 2002, 2012 Federico Garcia; 2018, 2019 Gernot Salzer
 
 This work may be distributed and/or modified under the
 conditions of the LaTeX Project Public License, either version 1.3

Modified: trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.cls	2019-10-24 21:48:12 UTC (rev 52525)
+++ trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.cls	2019-10-24 21:48:25 UTC (rev 52526)
@@ -8,7 +8,7 @@
 %% 
 %% This is a generated file.
 %% 
-%% Copyright 2002, 2012 Federico Garcia; 2018 Gernot Salzer
+%% Copyright 2002, 2012 Federico Garcia; 2018, 2019 Gernot Salzer
 %% 
 %% This work may be distributed and/or modified under the
 %% conditions of the LaTeX Project Public License, either version 1.3
@@ -26,20 +26,42 @@
 %% and the derived files subfiles.sty and subfiles.pdf
 %% 
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{subfiles}[2018/07/31 Federico Garcia, Gernot Salzer]
+\ProvidesClass{subfiles}[2019/09/28 v1.3 Federico Garcia, Gernot Salzer]
 \DeclareOption*{\typeout{Preamble taken from file `\CurrentOption'}%
     \let\preamble at file\CurrentOption}
 \ProcessOptions
-\let\old at documentclass@subfiles\documentclass
+\let\subfiles at documentclass\documentclass
 \let\documentclass\LoadClass\relax
-\input{\preamble at file}
+\RequirePackage{import}
+\def\subfiles at split#1{%
+  \edef\subfiles at filename{#1}%
+  \def\subfiles at dir{}%
+  \def\subfiles at base{}%
+  \def\subfiles at sep{}%
+  \expandafter\subfiles at split@\subfiles at filename/\@nil/%
+}
+\def\subfiles at split@#1/{%
+  \def\tmp{#1}%
+  \ifx\tmp\@nnil
+    \let\subfiles at next\relax
+  \else
+    \edef\subfiles at dir{\subfiles at dir\subfiles at base\subfiles at sep}%
+    \def\subfiles at base{#1}%
+    \def\subfiles at sep{/}%
+    \let\subfiles at next\subfiles at split@
+  \fi
+  \subfiles at next
+}
+\subfiles at split{\preamble at file}
+\subimport{\subfiles at dir}{\subfiles at base}
 {\catcode`\@=11
-\global\let\document\old at document@subfiles
-\global\let\enddocument\old at enddocument@subfiles
-\global\let\documentclass\old at documentclass@subfiles
-\global\let\old at document@subfiles\undefined
-\global\let\old at enddocument@subfiles\undefined
-\global\let\old at documentclass@subfiles\undefined}
+\global\let\document\subfiles at document
+\global\let\enddocument\subfiles at enddocument
+\global\let\documentclass\subfiles at documentclass
+\global\let\subfiles at document\undefined
+\global\let\subfiles at enddocument\undefined
+\global\let\subfiles at documentclass\undefined
+}
 \endinput
 %%
 %% End of file `subfiles.cls'.

Modified: trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.sty	2019-10-24 21:48:12 UTC (rev 52525)
+++ trunk/Master/texmf-dist/tex/latex/subfiles/subfiles.sty	2019-10-24 21:48:25 UTC (rev 52526)
@@ -8,7 +8,7 @@
 %% 
 %% This is a generated file.
 %% 
-%% Copyright 2002, 2012 Federico Garcia; 2018 Gernot Salzer
+%% Copyright 2002, 2012 Federico Garcia; 2018, 2019 Gernot Salzer
 %% 
 %% This work may be distributed and/or modified under the
 %% conditions of the LaTeX Project Public License, either version 1.3
@@ -26,18 +26,42 @@
 %% and the derived files subfiles.sty and subfiles.pdf
 %% 
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{subfiles}[2018/07/31 Federico Garcia, Gernot Salzer]
+\ProvidesPackage{subfiles}[2019/09/28 v1.3 Federico Garcia, Gernot Salzer]
 \DeclareOption*{\PackageWarning{\CurrentOption ignored}}
 \ProcessOptions
 \RequirePackage{verbatim}
-\newcommand{\skip at preamble}{%
-    \let\document\relax\let\enddocument\relax%
-    \newenvironment{document}{}{}%
-    \renewcommand{\documentclass}[2][subfiles]{}}
-\newcommand\subfile[1]{\begingroup\skip at preamble\input{#1}\endgroup}
+\RequirePackage{import}
+\def\subfiles at split#1{%
+  \edef\subfiles at filename{#1}%
+  \def\subfiles at dir{}%
+  \def\subfiles at base{}%
+  \def\subfiles at sep{}%
+  \expandafter\subfiles at split@\subfiles at filename/\@nil/%
+}
+\def\subfiles at split@#1/{%
+  \def\tmp{#1}%
+  \ifx\tmp\@nnil
+    \let\subfiles at next\relax
+  \else
+    \edef\subfiles at dir{\subfiles at dir\subfiles at base\subfiles at sep}%
+    \def\subfiles at base{#1}%
+    \def\subfiles at sep{/}%
+    \let\subfiles at next\subfiles at split@
+  \fi
+  \subfiles at next
+}
+\newcommand\subfile[1]{%
+  \begingroup
+  \renewcommand\documentclass[2][subfiles]{\ignorespaces}%
+  \renewenvironment{document}{\let\document\@onlypreamble\ignorespaces}{}%
+  \subfiles at split{#1}%
+  \subimport{\subfiles at dir}{\subfiles at base}%
+  \unskip
+  \endgroup
+}
 \@ifclassloaded{subfiles}{%
-  \let\old at document@subfiles\document
-  \let\old at enddocument@subfiles\enddocument
+  \let\subfiles at document\document
+  \let\subfiles at enddocument\enddocument
   \let\document\comment
   \let\enddocument\endcomment
 }{}



More information about the tex-live-commits mailing list