% \iffalse meta-comment % % subfiles - class and package for multi-file projects in LaTeX % Copyright 2002, 2012 Federico Garcia (feg8@pitt.edu, fedegarcia@hotmail.com) % Copyright 2018-2020 Gernot Salzer (salzer@logic.at) % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Gernot Salzer. % % This work consists of the files subfiles.dtx and subfiles.ins % and the derived files subfiles.cls, subfiles.sty and subfiles.pdf % % ------------------------------------------- % %<*driver> % \fi \ProvidesFile{subfiles.dtx}[2020/11/14 v2.2 Multi-file projects] % \iffalse \documentclass{ltxdoc} \GetFileInfo{subfiles.dtx} \title{A Document Class and a Package\\for Handling Multi-File Projects} \date{2020/11/14 v2.2} \author{Federico Garcia, Gernot Salzer} \usepackage{hyperref} \begin{document} \maketitle \DocInput{\filename} \end{document} % % \fi % \begin{abstract} % The |subfiles| package allows authors to split a document into one main file and several subsidiary files (subfiles) akin to the |\input| command, with the added benefit of making the subfiles compilable on their own. % This is achieved by reusing the preamble of the main file also for the subfiles. % \end{abstract} % \tableofcontents % \section{Introduction} % 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. % % 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 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 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} % % \DescribeMacro{subfiles.sty} % The main file, i.e., the file with the preamble to be shared with the subfiles, has to load the package |subfiles|: % \begin{center} % \begin{tabular}{l} % |\documentclass[...]{...}|\\ % |\usepackage{subfiles}|\\ % |\begin{document}| % \end{tabular} % \end{center} % \DescribeMacro{\subfile} % Subordinate files (subfiles) are loaded from the main file or from other subfiles with the command % \begin{center} % |\subfile{|\meta{subfile\_name}|}| % \end{center} % \DescribeMacro{subfiles.cls} % 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}[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} % Now there are two possibilities. % \begin{itemize} % \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 preamble of the subfile up to |\begin{document}| as well as |\end{document}| and the lines following it are ignored. % \end{itemize} % % \section{Advanced usage} % % \subsection{Including files instead of inputting them} % % \DescribeMacro{\subfileinclude} % In plain \LaTeX, you can use either |\input| or |\include| to load a file. % In most cases the first is appropriate, but sometimes there are reasons to prefer the latter. % Internally, the |\subfile| command uses |\input|. % For those cases where you need |\include|, the package provides the command % \begin{center} % |\subfileinclude{|\meta{subfile\_name}|}| % \end{center} % % \subsection{Fixing pathes} % % \DescribeMacro{\subfix} % Whenever an error message of \LaTeX\ or an external program indicates that a file cannot be found, the reason may be that the missing file has to be addressed by varying pathes, depending on which file is typeset. % In such a case, it may help to apply the command |\subfix| to the file or path names. % Examples: % \begin{center} % \begin{tabular}{ll} % package & command when used with |subfiles| \\ % \hline % |biblatex| & |\addbibresource{\subfix{|\meta{file}|}}| \\ % |bibunits| & |\putbib[\subfix{|\meta{file1}|},\subfix{|\meta{file2}|},|\dots|]|\\ % & |\defaultbibliography{\subfix{|\meta{file1}|},|\dots|}| % \end{tabular} % \end{center} % \DescribeMacro{\bibliography} % \DescribeMacro{\graphicspath} % Some commands already apply the fix on the fly. % At the moment these are the standard \LaTeX\ command |\bibliography| and |\graphicspath| from the |graphics|/|graphicx| package. % % \subsection{Conditional execution of commands} % % \DescribeMacro{\ifSubfilesClassLoaded} % The command |\ifSubfilesClassLoaded| is useful to execute commands conditionally, depending on whether the main file is typeset or a subfile. % \begin{center} % \begin{tabular}{l} % |\ifSubfilesClassLoaded{% then branch|\\ % \quad \dots\ commands executed when the subfile is typeset \dots\\ % |}{% else branch|\\ % \quad \dots\ commands executed when the main file is typeset \dots\\ % |}| % \end{tabular} % \end{center} % As an example, this can be used to add the bibliography to the main document or to the subdocument, whichever is typeset: % \begin{center}\small % \begin{tabular}[t]{l} % \multicolumn{1}{c}{main file} \\ % \hline % |\documentclass[...]{...}| \\ % |\usepackage{subfiles}|\\ % |\bibliographystyle{alpha}|\\ % |\begin{document}| \\ % \dots \\ % |\subfile{|\meta{subfile\_name}|}| \\ % \dots \\ % |\bibliography{bibfile}|\\ % |\end{document}| \\ % \hline % \end{tabular} % \hfill % \begin{tabular}[t]{l} % \multicolumn{1}{c}{subfile} \\ % \hline % |\documentclass[|\meta{main\_file\_name}|]{subfiles}| \\ % |\begin{document}| \\ % \dots \\ % |\ifSubfilesClassLoaded{%|\\ % \quad|\bibliography{bibfile}%|\\ % |}{}|\\ % |\end{document}| \\ % \hline % \end{tabular} % \end{center} % % \subsection{Unusual locations for placing definitions and text} % % Starting with version 2.0, the |subfiles| package treats sub-preambles and text after |\end{document}| as one would expect: % The preamble of subfiles is skipped when loaded with |\subfile|, and everything after |\end{document}| is ignored. % In most cases this is what you want. % % \DescribeMacro{[v1]} % For reasons of compatibility, the option |v1| restores the behaviour of previous versions. % \begin{center} % |\usepackage[v1]{subfiles}| % \end{center} % This will have three effects. % % \emph{Code after the end of the main document} is added to the preamble of the subfiles, but is ignored when typesetting the main file. % Here, one can add commands that are to be processed as part of the preamble when the subfiles are typeset on their one. % But this also means that any syntax error after |\end{document}| will ruin the \LaTeX ing of the subfile(s). % % \emph{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 with the option |v1|, 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 here may not work outside. % % \emph{Code after \texttt{\textbackslash end\{document\}} in a subfile} is treated like the code preceding it when the subfile is loaded from the main file, but is ignored when typesetting the subfile. % The code after |\end{document}| behaves as if following the |\subfile| command in the main file, except that it is still part of the group enclosing the subfile. % As a consequence, empty lines at the end of the subfile lead to a new paragraph in the main document, even if the |\subfile| command is immediately followed by text. % % \section{Use cases} % % \subsection{Hierarchy of directories} % % Sometimes it is desirable to put a subfile together with its images and supplementary 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 file 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. % % \subsection{Cross-referencing between subfiles} % When working with multiple subfiles under a main file, say |main.tex|, one may want to refer in subfile |A.tex| to labels in subfile |B.tex|. To make this work, load the package |xr| in the preamble of the main file and add an |\externaldocument| command after loading the |subfiles| package: % \begin{center} % \begin{tabular}{l} % |\usepackage{xr}| \\ % |\usepackage{subfiles}| \\ % |\externaldocument[M-]{\subfix{main}}| % \end{tabular} % \end{center} % In the |\externaldocument| command, |main| is the name of the main document. % Moreover, |M-| is an arbitrary sequence of characters that is added as prefix to the labels. % The |\subfix| command is only needed if the subfiles are not in the same directory as the main file, but it doesn't hurt if you add it in any case. % % To cross-reference between documents, add labels as usual. % Suppose you have |\label{mylabel}| in any of the files. % Then you can use |\ref{M-mylabel}| and |\pageref{M-mylabel}| to obtain the (page) number that the label refers to in the main document. % % Note that you first have to compile |main.tex|. % This generates |main.aux|, which then can be loaded by the subfiles to provide the information for the labels prefixed with |M-|. % % \subsection{Avoiding extra spaces} % % 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 similar to |\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} % % \section{Troubleshooting} % % Here are some hints that solve most problems. % % \begin{enumerate} % \item % Make sure to use the most recent version of the |subfiles| package, available from CTAN\footnote{\url{https://ctan.org/pkg/subfiles}} and Github\footnote{\url{https://github.com/gsalzer/subfiles}}. % \item % Make sure that |\usepackage{subfiles}| appears near the end of the main preamble. If you need the package |standalone|, then it has to be loaded before |subfiles|. % \item % If some external program that cooperates with \TeX, like |bibtex| or |biber|, complains about not being able to find a file, locate the name of the file in the \LaTeX\ source and replace \meta{filename} by |\subfix{|\meta{filename}|}|. % \item % If nothing of the above helps, ask the nice people on tex.stackexchange\footnote{\url{https://tex.stackexchange.com/}} or file an issue in the bug tracker of the Github repository\footnote{\url{https://github.com/gsalzer/subfiles/issues}}. % \end{enumerate} % % % \section{Dependencies} % % The |import| package by Donald Arsenau is needed to load subfiles from different directories. % When the |standalone| package is used, the |subfiles| package requires the |xpatch| package by Enrico Gregorio to patch the command |\includestandalone|. % Both packages are part of the standard \TeX\ distributions. % % % \section{Version history} % % \begin{enumerate} % \item[v1.1:] % Initial version by Federico Garcia. (Subsequent versions by Gernot Salzer.) % \item[v1.2:] % \begin{itemize} % \item Incompatibility with classes and packages removed that modify the |\document| command, like the class |revtex4|. % \end{itemize} % \item[v1.3:] % \begin{itemize} % \item Use of |import| package to handle directory hierarchies. % \item |\ignorespaces| added to avoid spurious spaces. % \item Incompatibility with commands removed that expect |\document| to be equal to |\@onlypreamble| after the preamble. Thanks to Eric Domenjoud for analysing the problem. % \end{itemize} % \item[v1.4:] % \begin{itemize} % \item Incompatibility with |memoir| class and |comment| package removed. % \item Bug `|\unskip| cannot be used in vertical mode` fixed. % \end{itemize} % \item[v1.5:] % \begin{itemize} % \item Command |\subfileinclude| added. % \item Basic support for |bibtex| related bibliographies in subfiles added. % Seems to suffice also for sub-bibliographies with the package |chapterbib|. % \item Support for sub-bibliographies with package |bibunits| added. % \end{itemize} % \item[v1.6:] % \begin{itemize} % \item Support for sub-bibliographies with package |bibunits| dropped, in favor of |\subfix|. % \item Command |\subfix| added. % \item Incompatibility with |standalone| class removed. % \item The options of the main class are now also processed when typesetting a subfile; before they were ignored. Thanks to J\'an Kl'uka for analysing the problem. % \end{itemize} % \item[v2.0:] % \begin{itemize} % \item Incompatibility with \LaTeX\ Oct.~2020 removed. % Thanks to Ulrike \mbox{Fischer} from the \LaTeX3 team for the timely warning. % \item By default, text after |\end{document}| as well as the preamble of subfiles, when loaded with |\subfile|, are ignored now. % The old behaviour is available via the new package option |v1|. % \item Command |\ifSubfilesClassLoaded| added and documentation regarding the use of the |\bibliography| command corrected. % Thanks to Github user |alan-isaac| for reporting the issue. % \item Subfiles now can have the same name as the main file. % Thanks to Github user |June-6th| for reporting the issue. % \item Problem with the search path for images resolved. % Thanks to Github user |maxnick| for reporting the issue. % \end{itemize} % \item[v2.1] % \begin{itemize} % \item Bugfix: In some situations, the hooks of |\begin{document}| and |\end{document}| were triggered when loading a subfile. % This occurred in particular with packages for handling CJK languages. % Thanks to Github user |yuishin-kikuchi| for reporting the issue. % \item Section about cross-referencing added. % Thanks to Github user |ndvanforeest| for the input. % \end{itemize} % \item[v2.2] % \begin{itemize} % \item Bugfix: The bugfix of v2.1 introduced an incompatibility with |tabular| environments in subfiles. Thanks to |yuishin-kikuchi| and |nvmnghia| on Github for reporting the issue. Kudos to |Phelype Oleinik| on tex.stackexchange.com for explaining the intricacies of the |tabular| environment and its interaction with the |\end| command. % \end{itemize} % \end{enumerate} % %\section{The Implementation} %\subsection{The class} % % \iffalse %<*class> % \fi % % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesClass{subfiles}[2020/11/14 v2.2 Multi-file projects (class)] \DeclareOption*{% \typeout{Preamble taken from file `\CurrentOption'}% \let\preamble@file\CurrentOption } \ProcessOptions % \end{macrocode} % % After processing the option of the |subfiles| class, we reset |\@classoptionslist| such that the options in the main file will be processed. % % \begin{macrocode} \let\@classoptionslist\relax % \end{macrocode} % % To handle subfiles in separate directories, we use the |import| package. % We load it now, since it resets the macro |\import@path|. % \begin{macrocode} \RequirePackage{import} % \end{macrocode} % % We redefine |\documentclass| to load the class of the main document. % % \begin{macrocode} \let\subfiles@documentclass\documentclass \def\documentclass{% \let\documentclass\subfiles@documentclass \LoadClass } % \end{macrocode} % % In earlier versions, we used |\subimport| to load the preamble of the main file, which has the unwanted effect of undoing changes to the graphics path. % Therefore we use |\input| and initialize |\import@path| and |\input@path| to the path of the main file. % We use the internal \LaTeX\ macro |\filename@parse| to obtain this path. % % \begin{macrocode} \filename@parse{\preamble@file} \edef\import@path{\filename@area} \edef\input@path{{\filename@area}} \input{\preamble@file} % \end{macrocode} % % After loading the preamble of the main file, we reset |\import@path|. % Since the preamble may have changed the catcode of the |@| sign, we make it (again) a letter. Better safe than sorry. % % \begin{macrocode} {\makeatletter \gdef\import@path{} } % \end{macrocode} % % \iffalse % % \fi % % % \subsection{The package} % % \iffalse %<*package> % \fi % % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{subfiles}[2020/11/14 v2.2 Multi-file projects (package)] % \end{macrocode} % \subsubsection*{Auxiliary commands} % % When redefining the |\end| command, we have to have to keep it expandable to a certain depth. % Therefore we need an expandable way to compare strings. % We borrow the function from LaTeX's |expl3| part. % % \begin{macrocode} \ExplSyntaxOn \cs_new_eq:NN \subfiles@StrIfEqTF \str_if_eq:nnTF \ExplSyntaxOff % \end{macrocode} % % The macro |\subfiles@renewBeginDocument{|\meta{code}|}| redefines |\begin| such that the next |\begin{document}| executes \meta{code} (and then restores the original definition of |\begin|). % % \begin{macrocode} \def\subfiles@renewBeginDocument#1{% \let\subfiles@begin\begin \def\begin##1{% \subfiles@StrIfEqTF{##1}{document}{% \let\begin\subfiles@begin #1% }{% \csname subfiles@begin\endcsname{##1}% }% }% } % \end{macrocode} % % The macro |\subfiles@renewEndDocument{|\meta{code}|}| redefines |\end| such that the next |\end{document}| executes \meta{code} (and then restores the original definition of |\end|). % This macro is more complex then the previous one, as we have to ensure that % |\expandafter\expandafter\expandafter\relax\end{env}| expands to |\relax\endenv|. % This is necessary for |tabular|s to work correctly. % % \begin{macrocode} \def\subfiles@saveEndTo#1{\expandafter\let\expandafter#1\csname end \endcsname} \def\subfiles@restoreEndFrom{\expandafter\let\csname end \endcsname} \def\subfiles@renewEndDocument#1{% \ifcsname subfiles@end\endcsname \else \subfiles@saveEndTo\subfiles@end \fi \expandafter\def\csname end \endcsname##1{% \romannumeral \subfiles@StrIfEqTF{##1}{document}{% \z@ \subfiles@restoreEndFrom\subfiles@end #1% }{% \expandafter\expandafter\expandafter\z@\subfiles@end{##1}% }% }% } % \end{macrocode} % % \subsubsection*{Handling the main document} % % When the main document is loaded from a subfile, the preamble is read, but the document itself is skipped. % The end of the preamble is marked by |\begin{document}|. % In version 1.x of the |subfiles| package, everything up to (and including) |\end{document}| is skipped, but the lines following it are treated again as part of the preamble. % The macro |\subfiles@handleMainDocumentVi| redefines |\begin{document}| accordingly. % % \begin{macrocode} \def\subfiles@handleMainDocumentVi{% \long\def\subfiles@skipToEndDocument##1\end##2{% \subfiles@StrIfEqTF{##2}{document}{\ignorespaces}{\subfiles@skipToEndDocument}% }% \subfiles@renewBeginDocument{% \subfiles@skipToEndDocument }% } % \end{macrocode} % % In version 2.x of the |subfiles| package, everything following |\begin{document}| is ignored. % The macro |\subfiles@handleMainDocumentVii| redefines this command accordingly. % % \begin{macrocode} \def\subfiles@handleMainDocumentVii{% \subfiles@renewBeginDocument{% \endinput \ignorespaces }% } % \end{macrocode} % % \subsubsection*{Handling subfiles} % % When a subfile is loaded, the preamble and |\end{document}| have to be ignored. % More precisely, in older versions (v1.x), the following happens: % \begin{itemize} % \item |\documentclass[...]{subfiles}| is ignored. % \item The contents of the preamble becomes part of the text. % \item |\begin{document}| is ignored. % \item |\end{document}| is ignored. % \item Any lines after |\end{document}| are also part of the text. % \end{itemize} % % \begin{macrocode} \def\subfiles@handleSubDocumentVi{% \let\subfiles@documentclass\documentclass \def\documentclass{% \@ifnextchar[\subfiles@documentclass@{\subfiles@documentclass@[]}% }% \def\subfiles@documentclass@[##1]##2{% \let\documentclass\subfiles@documentclass \ignorespaces }% \subfiles@renewBeginDocument{% \subfiles@renewEndDocument\ignorespaces \ignorespaces }% } % \end{macrocode} % In newer versions (v2.x), the following happens: % \begin{itemize} % \item The preamble, up to |\begin{document}|, is ignored. % \item |\end{document}| as well as any lines after it are ignored. % \end{itemize} % % \begin{macrocode} \def\subfiles@handleSubDocumentVii{% \let\subfiles@documentclass\documentclass \long\def\documentclass##1\begin##2{% \subfiles@StrIfEqTF{##2}{document}{% \let\documentclass\subfiles@documentclass \subfiles@renewEndDocument{% \endinput \ignorespaces }% \ignorespaces }{\documentclass} }% } % \end{macrocode} % % \subsubsection*{Processing the package options} % % The package has currently only one option, |v1|, which affects the way how the text after |\end{document}| and in the preamble of subfiles is handled. % We initialize the macros for handling main and sub documents with the behavior of version 2.x. % \begin{macrocode} \let\subfiles@handleMainDocument\subfiles@handleMainDocumentVii \let\subfiles@handleSubDocument\subfiles@handleSubDocumentVii % \end{macrocode} % When option |v1| is present, the macros are set to the behavior of version 1.x. % \begin{macrocode} \DeclareOption{v1}{% \let\subfiles@handleMainDocument\subfiles@handleMainDocumentVi \let\subfiles@handleSubDocument\subfiles@handleSubDocumentVi } \DeclareOption*{\PackageWarning{subfiles}{Option '\CurrentOption' ignored}} \ProcessOptions\relax % \end{macrocode} % % \subsubsection*{Loading subfiles} % % To handle subfiles in separate directories, we use the |import| package. % If it has already been loaded, e.g.\ by the |subfiles| class, this line does nothing. % \begin{macrocode} \RequirePackage{import} % \end{macrocode} % % The |\subimport| command requires path and filename as separate arguments, so we have to split qualified filenames into these two components. % The internal \LaTeX\ command |\filename@parse| almost fits the bill, except that it additionally splits the filename into basename and extension. % Unfortunately, concatenating basename and extension to recover the filename is not clean: % Under Unix/Linux, the filenames |base| and |base.| denote different entities, but after |\filename@parse| both have the same basename and an empty extension. % Therefore we redefine the command |\filename@simple| temporarily; it is responsible for this unwanted split. % % \begin{macrocode} \def\subfiles@split#1{% \let\subfiles@filename@simple\filename@simple \def\filename@simple##1.\\{\edef\filename@base{##1}}% \filename@parse{#1}% \let\filename@simple\subfiles@filename@simple }% % \end{macrocode} % % E.g., after executing |\subfiles@split{../dir1/dir2/file.tex}| the macros |\filename@area| and |\filename@base| expand to |../dir1/dir2/| and |file.tex|, respectively. % % \DescribeMacro{\subfile} % The command |\subfile| specifies the command |\subimport| for |\input|ing the subfile, and then calls |\subfiles@subfile|. % % \begin{macrocode} \newcommand\subfile{% \let\subfiles@loadfile\subimport \subfiles@subfile } % \end{macrocode} % % \DescribeMacro{\subfileinclude} % The command |\subfileinclude| specifies the command |\subincludefrom| for |\include|ing the subfile, and then calls |\subfiles@subfile|. % % \begin{macrocode} \newcommand\subfileinclude{% \let\subfiles@loadfile\subincludefrom \subfiles@subfile } % \end{macrocode} % % The main functionality is implemented in |\subfiles@subfile|. % It sets up the handling of the sub-preamble, splits the filename and loads the subfile. % % \begin{macrocode} \def\subfiles@subfile#1{% \begingroup \subfiles@handleSubDocument \subfiles@split{#1}% \subfiles@loadfile{\filename@area}{\filename@base}% \endgroup } % \end{macrocode} % % \subsubsection*{Fixing incompatibilities} % % \DescribeMacro{\subfix} % If some package provides a command that takes a filename as argument, then it has to be prefixed with the current |\import@path|. % This is what the |\subfix| command tries to do. % In order to succeed, the filename has to be expanded immediately, such that the current value of |\import@path| is used. % % \begin{macrocode} \def\subfix#1{\import@path#1} % \end{macrocode} % % For patching a list of file or path names, we define two auxiliary macros, one iterating over a comma-separated list of names and one processing a sequence of names enclosed in braces. % % \begin{macrocode} \def\subfiles@fixfilelist#1{% \def\subfiles@list{}% \def\subfiles@sep{}% \@for\subfiles@tmp:=#1\do{% \edef\subfiles@list{\subfiles@list\subfiles@sep\subfix{\subfiles@tmp}}% \def\subfiles@sep{,}% }% } \def\subfiles@fixpathlist#1{% \def\subfiles@list{}% \@tfor\subfiles@tmp:=#1\do{% \edef\subfiles@list{\subfiles@list{\subfix\subfiles@tmp}}% }% } % \end{macrocode} % % \DescribeMacro{\bibliography} % \DescribeMacro{\graphicspath} % We patch |\bibliography| and |\graphicspath| (from the |graphics|/|graphicx| package) such that users don't have to worry about adding |\subfix|. % % \begin{macrocode} \let\subfiles@bibliography\bibliography \def\bibliography#1{% \subfiles@fixfilelist{#1}% \expandafter\subfiles@bibliography\expandafter{\subfiles@list}% } \@ifpackageloaded{graphics}{% \let\subfiles@graphicspath\graphicspath \def\graphicspath#1{% \subfiles@fixpathlist{#1}% \edef\subfiles@list{{\subfix{}}\subfiles@list}% \expandafter\subfiles@graphicspath\expandafter{\subfiles@list}% }% }{} % \end{macrocode} % % \DescribeMacro{\includestandalone} % The command |\includestandalone| handles subfiles in its own way. % Therefore we modify it to use the original definition of |\end|. % % \begin{macrocode} \@ifpackageloaded{standalone}{ \RequirePackage{xpatch} \xpretocmd\includestandalone{% \subfiles@saveEndTo\subfiles@end@ \ifcsname subfiles@end\endcsname \subfiles@restoreEndFrom\subfiles@end \fi }{}{} \xapptocmd\includestandalone{\subfiles@restoreEndFrom\subfiles@end@}{}{} }{} % \end{macrocode} % % \subsubsection*{Do we typeset the main file or a subfile?} % % \DescribeMacro{\ifSubfilesClassLoaded} % To add code or text conditionally, depending on whether the main document or a subfile is typeset, we provide the command |\ifSubfilesClassLoaded|. % % \begin{macrocode} \newcommand\ifSubfilesClassLoaded{% \expandafter\ifx\csname ver@subfiles.cls\endcsname\relax \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi } % \end{macrocode} % % % \subsubsection*{The end is near} % % The |subfiles| package is loaded near the end of the main preamble. % If it is loaded from a subfile, i.e., if |subfiles.cls| has been loaded, then we prepare for skipping the main document. % \begin{macrocode} \ifSubfilesClassLoaded{% \subfiles@handleMainDocument }{} % \end{macrocode} % % \iffalse % % \fi