% \iffalse meta-comment % % extract package by Hendri Adriaens. % % Extract package files and examples and create documentation: % latex extract.dtx % latex extract.dtx % bibtex extract % makeindex -s gglo.ist -o extract.gls extract.glo % makeindex -s gind.ist -o extract.ind extract.idx % latex extract.dtx % latex extract.dtx % % To finish the installation you have to move the following % file into a directory searched by LaTeX: % extract.sty % %% --------------------------------------- %% Copyright (C) 2004-2019 Hendri Adriaens %% --------------------------------------- %% %% 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 2003/12/01 or later. %% %% This work has the LPPL maintenance status "maintained". %% %% This Current Maintainer of this work is Hendri Adriaens. %% %% This work consists of the file extract.dtx and the derived files %% extract.sty, xtrex1.tex, xtrex2.tex, xtrex3.tex, xtrex4.tex, %% xtrex5.tex, xtrex6.tex and xtrex7.tex. %% %% The following files constitute the extract package and must be %% distributed as a whole: readme, extract.dtx, extract.pdf and %% extract.sty. %% %<*batchfile> \begingroup \input docstrip \keepsilent \preamble \endpreamble \askforoverwritefalse \generate{ \file{extract.sty}{\from{extract.dtx}{extract}} \file{xtrex1.tex}{\from{extract.dtx}{xtrex1}} \file{xtrex2.tex}{\from{extract.dtx}{xtrex2}} \file{xtrex3.tex}{\from{extract.dtx}{xtrex3}} \file{xtrex4.tex}{\from{extract.dtx}{xtrex4}} \file{xtrex5.tex}{\from{extract.dtx}{xtrex5}} \file{xtrex6.tex}{\from{extract.dtx}{xtrex6}} \file{xtrex7.tex}{\from{extract.dtx}{xtrex7}} \file{xtrpream.ble}{\from{extract.dtx}{preamble}} \file{extract.bib}{\from{extract.dtx}{bib}} } \endgroup % %<*driver> \documentclass[a4paper]{ltxdoc} \input{xtrpream.ble} \begin{document} \DocInput{extract.dtx} \let\Section\section\def\section*#1{\Section*{#1}\addcontentsline{toc}{section}{#1}} \bibliographystyle{plain} \bibliography{extract} \section*{Acknowledgements} Thanks go to David Carlisle for proposing the technique implemented in this package to solve my initial problem.\footnote{See section~\ref{sec:intro}.} Thanks also go to Michael Kohlhase and Johannes Luber for reporting bugs and providing ideas for extensions of the package. \PrintChangesX\PrintIndexX \end{document} % % \fi % % \changes{v1.0}{2004/12/19}{Initial release} % \changes{v1.1}{2005/01/01}{Added conditional extraction using labels} % \changes{v1.1}{2005/01/01}{Revised documentation} % \changes{v1.2}{2005/01/06}{Fixed \cs{AfterEndEnv} hook for nested environments} % \changes{v1.2}{2005/01/06}{Simplified optional argument check for \texttt{extract} environment} % \changes{v1.2}{2005/01/06}{Increased efficiency of the package} % \changes{v1.3}{2005/01/12}{Removed some input checks for more flexibility} % \changes{v1.3}{2005/01/12}{Added \cs{extractline}} % \changes{v1.3}{2005/01/12}{Added line extraction method for commands} % \changes{v1.3}{2005/01/12}{Simplified package} % \changes{v1.3}{2005/01/12}{Added \texttt{document-handles} option} % \changes{v1.3}{2005/01/12}{Added examples and documentation} % \changes{v1.3}{2005/01/12}{Updated license information} % \changes{v1.4}{2005/02/06}{Adjusted options section for \pf{xkeyval} (\cs{XKV@tkey} not defined anymore)} % \changes{v1.4}{2005/02/06}{Added \texttt{extractskip} environment} % \changes{v1.4}{2005/02/06}{Allow for any filename} % \changes{v1.4}{2005/02/06}{Changed temp extension to \texttt{.xtr}} % \changes{v1.5}{2005/02/08}{Solved bug in options section} % \changes{v1.5}{2005/02/08}{Avoid using counters for conditional extraction with numbers} % \changes{v1.6}{2005/02/14}{Improved options section} % \changes{v1.6}{2005/02/14}{Added optional header for extracted files} % \changes{v1.7}{2005/03/31}{Solved small bug with `no-header' option} % \changes{v1.7}{2005/03/31}{Revised documentation} % \changes{v1.8}{2005/05/07}{Added \texttt{copydocumentclass} option} % \changes{v1.8}{2005/05/07}{Changed name of option \texttt{no-header} to \texttt{header}} % \changes{v1.8}{2005/05/07}{Changed name of option \texttt{document-handles} to \texttt{handles}} % \changes{v1.8}{2005/05/07}{Revised documentation and examples} % % \GetFileInfo{extract.sty} % % \CheckSum{1069} % % \DoNotIndex{\@backslashchar,\@bsphack,\@checkend,\@currenvir, % \@currenvline,\@doendpe,\@eha,\@ehc,\@empty,\@endpefalse,\@esphack, % \@expandtwoargs,\@ifundefined,\@ignorefalse,\@latex@error,\do, % \@makeother,\@namedef,\@ne,\@nil,\@nnil,\@temptokena,\@testopt, % \active,\advance,\AtBeginDocument,\AtEndDocument,\begin,\begingroup, % \catcode,\closeout,\csname,\CurrentOption,\DeclareOptionX,\def, % \dospecials,\edef,\else,\end,\endcsname,\endgroup,\expandafter,\fi, % \g@addto@macro,\global,\if@endpe,\if@ignore,\ifcat,\ifin@,\ifnum,\ifx, % \ignorespaces,\immediate,\in@,\input,\jobname,\lccode,\let,\lowercase, % \m@ne,\NeedsTeXFormat,\newcount,\newif,\newwrite,\noexpand,\on@line, % \openout,\ProcessOptionsX,\ProvidesPackage,\relax,\RequirePackage, % \reserved@a,\romannumeral,\string,\the,\write,\XTR@activefalse, % \XTR@activetrue,\XTR@handlestrue,\XTR@resa,\XTR@tempa,\XTR@tempb,\z@, % \PackageError,\gdef,\count@,\day,\divide,\month,\multiply,\space, % \time,\xdef,\year,\@nameuse,\@tempcnta,\@tempcntb,\\,\!,\(,\), % \define@boolkey,\XTR@sttrue,\XTR@stfalse,\documentclass,\filename@base, % \filename@ext,\filename@parse,\KV@@sp@def,\XKV@afterelsefi,\XKV@afterfi, % \XKV@classoptionslist,\XKV@documentclass,\XKV@for@n,\XKV@for@o, % \XKV@ifstar,\XKV@ifundefined,\XKV@sp@deflist,\XKV@tkey,\chapter} % % \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 \~} % %\title{The \pf{extract} package %\thanks{This package can be downloaded from the CTAN mirrors: %\texttt{/macros/latex/contrib/extract}. See \texttt{extract.dtx} for %information on installing \pf{extract} into your \LaTeX\ %distribution and for the license of this package.}} %\author{\mktitledecor Hendri Adriaens} %\date{\fileversion\ (\filedate)} %\maketitle % %\begin{abstract}\noindent %This package can be used to (conditionally) extract specific %commands and environments from a source file and write them to a %target file. This can be done without significant changes to the %source document, but labels inside the source can be used for more %flexibility. The package also provides environments to write code %directly to the target file or use code in both the source and the %target file. These tools allow one to generate ready-to-run files %from a source document, containing only the extracted material, in %an otherwise ordinary \LaTeX\ run. %\end{abstract} % %\tableofcontents % %\section{Introduction}\label{sec:intro} %I created this package when I was working on some lecture notes with %exercises in the text and wanted to generate an exercises book on %the fly. David Carlisle put forward the idea to use a technique as %is now implemented in this package. The package heavily uses the %\pf{verbatim} package \cite{verbatim} by Rainer Sch\"opf and uses %the \pf{xkeyval} package \cite{xkeyval} to provide a simple and easy %interface\footnote{And some tools like \cs{XKV@ifundefined} and %\cs{XKV@sp@deflist}. See section~\ref{sec:imple} for more %information.}. % %There are other packages around that provide tools for conditionally %typesetting material or writing material to an external file. Let me list a few. %\begin{description} %\item[\pf{askinclude} \cite{askinclude}, \pf{excludeonly} \cite{excludeonly}]\indent\\ %These packages enhance \LaTeX's |\include| and |\includeonly| %system to select the files that should be included in typesetting. %\item[\pf{comment} \cite{comment}, \pf{verbatim} \cite{verbatim}, \pf{xcomment} \cite{xcomment}]\indent\\ %The first two packages define the |comment| environment and the %third the |xcomment| environment. These environments ignore their %body. But if the command |\xcomment| is used and supplied with a %list of environments, these environments will be typeset when they %appear in the body of the |xcomment| environment. The \pf{comment} %package provides the commands |\includecomment| and %|\excludecomment| to do a similar job. %\item[\pf{optional} \cite{optional}, \pf{version} \cite{version}, \pf{versions} \cite{versions}]\indent\\ %These packages define some commands with which you can %control which material should be typeset. %\item[\pf{pagesel} \cite{pagesel}, \pf{pdfpages} \cite{pdfpages}, \pf{selectp} \cite{selectp}]\indent\\ %These packages only typeset certain pages. %\item[\pf{fancyvrb} \cite{fancyvrb}, \pf{listings} \cite{listings}]\indent\\ %These packages (among others) provide tools to write text to an %external file. %\end{description} % %The \pf{extract} package differs from all these packages since it %extracts content and leaves the typeset version of the original %document untouched. Furthermore, for simple extraction jobs, it is %not necessary to make any changes to the document other than adding %the |\usepackage| command. This allows for conditional extraction of %commands and environments based on the number of the command or %environment counted from the beginning of the document. More %flexible conditional extraction can be achieved by adding labels to %the source document. How all of this works will be explained in the %sections to come. % %\section{Environment extraction}\label{sec:envxtr} %The following provides an example of the user interface of the package. %\begin{example} % \usepackage[ % active, % generate=file, % extract-env={figure,table} % ]{extract} %\end{example} %\DescribeOptions{active,generate,extract-env} %If the |active| option is not specified (or set to |false|), the %package does nothing and no files are generated. If the option is %specified, the package will redefine the environments |figure| and %|table| so that they write their bodies (the content of the %environment) to the file indicated with the |generate| option, here %|file.tex|\footnote{If a file extension is lacking, \texttt{.tex} %will be used.}, including the |\begin{figure}| and |\end{figure}| %commands. Besides that, the environments will be executed as usual. %Most environments are supported (known exception is the |document| %environment). When the package encounters |\begin{document}| or %|\end{document}| in the source file, by default\footnote{See %section~\ref{sec:misc} for the \texttt{handles} %option.}, it will also write these commands to the target file, such %that, if a suitable preamble is added, the file is ready to be run %by \LaTeX. See listing~\vref{list:env} for an example.\footnote{See %section~\ref{sec:manual} for the \texttt{extract} environment, %section~\ref{sec:misc} for the \texttt{copydocumentclass} option and %section~\ref{sec:sande} how to obtain the example files.} %\begin{Listing}\caption{Environment extraction.}\label{list:env} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex1.tex| %\begin{example} % \documentclass[10pt]{article} % \usepackage[ % active, % generate=file, % copydocumentclass=false, % extract-env=equation % ]{extract} % \begin{extract} % \documentclass[11pt]{article} % \end{extract} % \begin{document} % Some text. % \begin{equation} % a^2+b^2=c^2 % \end{equation} % Some text. % \begin{equation} % x^2+y^2=z^2 % \end{equation} % Some text. % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass[11pt]{article} % % \begin{document} % % \begin{equation} % a^2+b^2=c^2 % \end{equation} % % \begin{equation} % x^2+y^2=z^2 % \end{equation} % % \end{document} %\end{example} %\end{minipage} %\end{Listing} %The package will also write a header to the target file with some %information about the source and time of generation of the target %file. This header can be turned off with the |no-header| option. %See also section~\ref{sec:misc}. % %\section{Command extraction}\label{sec:cmdxtr} %\DescribeOptions{extract-cmd,extract-cmdline} %This package can also extract commands. It supplies two methods to %do this. See the example below. %\begin{example} % \usepackage[ % active, % generate=file, % extract-cmd=section, % extract-cmdline=label % ]{extract} %\end{example} %The first method (accessed with the |extract-cmd| option) is based %on the particular syntax of the command and hence only supports %particular commands. It will read it arguments and write them, %together with the original command, to the target file. Besides %that, the command will be executed as usual. Currently, the commands %|\chapter|, |\section|, |\subsection|, and |\subsubsection| in the %standard \LaTeX\ classes (and classes or packages derived from %those) are supported. An optional argument to these commands, like %|\chapter[short]{long}| is supported. However, the starred version %|\chapter*{title}| will not be written to the file due to technical %limitations. Sections~\ref{sec:how} and~\ref{sec:imple} will explain %this in more detail. % %The second method (accessed with the |extract-cmdline| option) will %redefine commands to write themselves and all the text following on %the same line to the target file and will also execute the entire %line as with an ordinary \LaTeX\ run. This allows to redefine any %command that is not supported by the first method, but should be %applied with care. If the command is used internally in a class or %style file, your document might fail to run. In particular, one %should not redefine one of the commands supported by the first %method with this method. See listing~\vref{list:cmd} for a working %example of both methods.\footnote{See section~\ref{sec:manual} for %the \texttt{extract*} environment.} %\begin{Listing}\caption{Command extraction.}\label{list:cmd} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex2.tex| %\begin{example} % \documentclass{article} % \usepackage[ % active, % generate=file, % extract-env=exercise, % extract-cmd=section, % extract-cmdline=label % ]{extract} % \begin{extract*} % \newtheorem{exercise}{Exercise} % \end{extract*} % \begin{document} % \section{Theory} % \label{sec:1} % Some text. % \section{Exercises} % \begin{exercise} % Use the results from section % \ref{sec:1} to show that\dots % \end{exercise} % Some text. % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass{article} % \newtheorem{exercise}{Exercise} % % \begin{document} % % \section{Theory} % % \label{sec:1} % % \section{Exercises} % % \begin{exercise} % Use the results from section % \ref{sec:1} to show that\dots % \end{exercise} % % \end{document} %\end{example} %\end{minipage} %\end{Listing} % %\section{Conditional extraction}\label{sec:conditional} %\subsection{Extraction with numbers} %\DescribeOptions{-nrs} %It is also possible to conditionally extract environments and %commands. After the options |extract-env|, |extract-cmd| and %|exstract-cmdline| are used, for each environment or command %specified there, there will be a new option with the name of that %environment or command and the |-nrs| postfix. This option can take %a comma separated list in which you can specify which environments %or macros (counting from the |\usepackage{extract}| %command\footnote{Notice that starred commands like \cs{chapter*}, %which won't be redefined by the \texttt{extract-cmd} option, will %also not be counted.}) should be extracted. Table~\vref{tab:syntax} lists %the syntax that can be used in the comma separated list. The term %`item' is used for `command or environment'. %\begin{table}[htb]\centering %\begin{tabular}{cp{8.5cm}} %Syntax&Meaning\\\hline %$\meta{x}$&Item $\meta{x}$ will be extracted.\\ %-$\meta{x}$&All items up to and including item $\meta{x}$ will be extracted.\\ %$\meta{x}$-&All items from and including item $\meta{x}$ will be extracted.\\ %$\meta{x}$-$\meta{y}$&All items in between $\meta{x}$ and $\meta{y}$, including %$\meta{x}$ and $\meta{y}$ will be extracted. %\end{tabular} %\caption{Syntax for conditional extraction with numbers.}\label{tab:syntax} %\end{table} %See an example in the listing below. %\begin{example} % \documentclass{book} % \usepackage[ % active, % generate=file, % extract-env={figure,table}, % figure-nrs={-2,4-}, % extract-cmd=chapter, % chapter-nrs={3-5,7} % ]{extract} % \begin{document} % ... % \end{document} %\end{example} %This example, when completed with content, will extract all |table| %environments, |figure| environments 1, 2, and all figures from (and %including) figure 4. It will also extract chapter commands 3 to 5 and 7. % %\subsection{Extraction with labels} %\DescribeOptions{-labels} %Conditional extraction is also possible with labels. The advantage of %using labels is that output does not change (in comparison to using %numbers) when commands or environments are added. The drawback is %that one needs to modify the source document and add labels in the %text. % %\DescribeMacro{\extractionlabel} %Labels are declared with the following command. %\begin{command} % `\cs{extractionlabel}\marg{name}' %\end{command} %A label should be declared just before the command or environment %that you want to extract. For instance %\begin{example} % \extractionlabel{exer-a} % \begin{exercise} % ... % \end{exercise} %\end{example} %You can reuse the same label multiple times and you can specify %which items should be extracted by the options with a |-labels| %prefix. This works in the same way as with numbers. %\begin{example} % \documentclass{book} % \usepackage[ % active, % generate=file, % extract-env=exercise, % exercise-labels={exer-a,exer-c} % ]{extract} % \begin{document} % ... % \end{document} %\end{example} %This example will only extract exercises that have been preceded by %the declaration |\extractionlabel{exer-a}| or %|\extractionlabel{exer-c}|. % %When using both conditional extraction with numbers and with labels, %the command or environment at hand will be extracted when at least %on of the conditions is true. Find an example in listing~\vref{list:cond}. %\begin{Listing}\caption{Conditional extraction.}\label{list:cond} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex3.tex| %\begin{example} % \documentclass{article} % \usepackage[ % active, % generate=file, % extract-env=figure, % figure-nrs={1,3}, % figure-labels={fig-a,fig-b} % ]{extract} % \begin{document} % Some text. % \begin{figure} % Figure 1. % \end{figure} % Some text. % \extractionlabel{fig-a} % \begin{figure} % Figure 2. % \end{figure} % Some text. % \extractionlabel{fig-b} % \begin{figure} % Figure 3. % \end{figure} % Some text. % \extractionlabel{fig-c} % \begin{figure} % Figure 4. % \end{figure} % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass{article} % % \begin{document} % % \begin{figure} % Figure 1. % \end{figure} % % \begin{figure} % Figure 2. % \end{figure} % % \begin{figure} % Figure 3. % \end{figure} % % \end{document} %\end{example} %\end{minipage} %\end{Listing} % %\section{Extraction tools}\label{sec:tools} %\subsection{Manual extraction}\label{sec:manual} %\DescribeEnv{extract} %The package provides the environment |extract|. %\begin{command} % `\cs{begin\char`\{extract\char`\}}' % `\meta{body}' % `\cs{end\char`\{extract\char`\}}' %\end{command} %This environment writes its body only to the target file. This can %be used to generate a preamble in the target file so that you can %run the generated file through \LaTeX\ immediately after creation. %See the example in listing~\vref{list:env} and the example below. % %\DescribeEnv{extract*} %There also exists a starred version of the |extract| environment. %\begin{command} % `\cs{begin\char`\{extract*\char`\}}' % `\meta{body}' % `\cs{end\char`\{extract*\char`\}}' %\end{command} %This environment will not only write the body to the target file, %but will also execute the code in the source document. This can be %used to create a common preamble which holds packages and commands %that will be used in both the source and the target file. See %listing~\vref{list:cmd} and listing~\vref{list:xtrenv} for examples. %Notice that the `answer' will not appear in |xtrex4.dvi|. %\begin{Listing}\caption{Extract environments.}\label{list:xtrenv} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex4.tex| %\begin{example} % \documentclass{article} % \usepackage[ % active, % generate=file, % extract-env=equation* % ]{extract} % \begin{extract*} % \usepackage{amsmath} % \end{extract*} % \begin{document} % Some text. % \begin{equation*} % x^2+y^2=z^2 % \end{equation*} % \begin{extract} % $x=3$, $y=4$ and $z=5$ % satisfy this equation. % \end{extract} % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass{article} % \usepackage{amsmath} % % \begin{document} % % \begin{equation*} % x^2+y^2=z^2 % \end{equation*} % $x=3$, $y=4$ and $z=5$ % satisfy this equation. % % \end{document} %\end{example} %\end{minipage} %\end{Listing} % %\DescribeMacros{\extractline,\extractline*} %The package also provides a command that extracts the current line. %\begin{command} % `\cs{extractline}' % `\cs{extractline*}' %\end{command} %The starred version also executes the code at that line. See the %example below. %\begin{example} % \extractline This line should be extracted. % \extractline*This line should be extracted and executed. %\end{example} %Notice that a space is following the command |\extractline| and that no space is %following the command |\extractline*|. In the first line, \LaTeX\ will eat this %space, but it won't do that in the second line. If we add a space %there in between the |*| and |This|, this space will be executed and %extracted as well. % %\DescribeMacros{\extractline,\extractline*} %\DescribeEnvs{extract,extract*} %The |extract| and |extract*| environments and the macros %|\extractionlabel| and |\extractionlabel*| have an optional argument %for specifying the label directly. %\begin{command} % `\cs{begin\char`\{extract\char`\}}\oarg{name}' % `\cs{begin\char`\{extract*\char`\}}\oarg{name}' % `\cs{extractline}\oarg{name}' % `\cs{extractline*}\oarg{name}' %\end{command} %\newpage %\DescribeOptions{extract-nrs,line-nrs,extract-labels,line-labels} %The options |extract-nrs| and |line-nrs| can be used to %control conditional extraction of these environments and commands %using numbers. Moreover, one can do conditional extractions with %labels for these commands and environments as well. Use the options %|extract-labels| and |line-labels| for that purpose. See also %section~\ref{sec:conditional} for information about conditional extraction. % %See an example in listing~\vref{list:optlab}. %This example will demonstrate that only certain lines and environments %are extracted. Note that, when running |xtrex5.tex| with \LaTeX, %the output, |xtrex5.dvi|, will contain the following. %\begin{example} % line 2 % line 4 % line 5 %\end{example} %\begin{Listing}\caption{Optional labels.}\label{list:optlab} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex5.tex| %\begin{example} % \documentclass{article} % \usepackage[ % active, % generate=file, % copydocumentclass=false, % extract-labels=type-a, % line-labels={type-a,type-c}, % line-nrs=3 % ]{extract} % \begin{extract}[type-a] % \documentclass{article} % \end{extract} % \begin{extract}[type-b] % \documentclass{book} % \end{extract} % \begin{document} % \parindent0pt % \extractline[type-a]line 1\\ % \extractline*line 2\\ % \extractline line 3\\ % \extractline*[type-a]line 4\\ % \extractline*[type-c]line 5\\ % \extractline line 6\\ % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass{article} % % \begin{document} % line 1\\ % line 3\\ % line 4\\ % line 5\\ % % \end{document} %\end{example} %\end{minipage} %\end{Listing} % %\subsection{Skipping extraction} %\DescribeEnv{extractskip} %The package also provides the |extractskip| environment. %\begin{command} % `\cs{begin\char`\{extractskip\char`\}}\oarg{name}' % `\meta{body}' % `\cs{end\char`\{extractskip\char`\}}' %\end{command} %The body of this environment will not be written to the target file, %but will be executed. This environment can be used to skip material %in an environment which extracts its entire body. This could be the %|extract| environment, but also an environment that has been %redefined to be extracted using the |extract-env| option. The argument %\meta{name} is optional and contains the label. % %\DescribeOptions{extractskip-nrs,extractskip-labels} %This environment can also operate conditionally as has been %described in section~\ref{sec:conditional} using the options %|extractskip-nrs| and |extractskip-labels|. Listings~\vref{list:skip1} %and~\vref{list:skip2} will demonstrate this environment. %\begin{Listing}\caption{Skipping extraction.}\label{list:skip1} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex6.tex| %\begin{example} % \documentclass{article} % \usepackage[ % active, % generate=file, % extract-env=figure % ]{extract} % \begin{document} % \begin{figure}[!h] % \begin{extractskip} % \fbox{figure 1} % \end{extractskip} % \fbox{figure 2} % \end{figure} % \begin{extract*} % \begin{itemize} % \item 1 % \item 2 % a\begin{extractskip}b % \item 3 % c\end{extractskip}d % \item 4 % \begin{extractskip} % \item 5 % \end{extractskip} % \end{itemize} % \end{extract*} % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass{article} % % \begin{document} % % \begin{figure}[!h] % \fbox{figure 2} % \end{figure} % \begin{itemize} % \item 1 % \item 2 % a % d % \item 4 % \end{itemize} % % \end{document} %\end{example} %\end{minipage} %\end{Listing} %\begin{Listing}\caption{Skipping extraction conditionally.}\label{list:skip2} %\begin{minipage}[t]{.49\linewidth} %\hfill |xtrex7.tex| %\begin{example} % \documentclass{article} % \usepackage[ % active, % generate=file, % extractskip-labels=skipb % ]{extract} % \begin{document} % \begin{extract*} % \begin{itemize} % \begin{extractskip}[skipa] % \item 1 % \end{extractskip} % \begin{extractskip}[skipb] % \item 2 % \end{extractskip} % \begin{extractskip}[skipc] % \item 3 % \end{extractskip} % \end{itemize} % \end{extract*} % \end{document} %\end{example} %\end{minipage} %\hfill %\begin{minipage}[t]{.49\linewidth} %\hfill |file.tex| %\begin{example} % \documentclass{article} % % \begin{document} % \begin{itemize} % \item 1 % \item 3 % \end{itemize} % % \end{document} %\end{example} %\end{minipage} %\end{Listing} % %\subsection{Miscellaneous options}\label{sec:misc} %\DescribeOption{header} When setting the |header| option to %|false|, no header will be written to the target file. If the option %is not specified or set to |true|, the package will write a header %to the target file including information on when the target file was %generated and which source file was used. % %\DescribeOption{handles} %This option controls whether the package will write %|\begin{document}| and |\end{document}| to the target file when it %encounters these commands in the source document. By default, this %option is set to |true|. When the option is set to |false|, the %generated file can be |\input|ed or |\include|d by another file %immediately after production. % %\DescribeOption{copydocumentclass} %This option control whether the target file should get the same %|\documentclass| command as the source document (including class %options). If set to |false|, you should specify another document class %for the target file, for instance using the |extract| environment. %See listing~\vref{list:env} for an example. % %\section{How it works, limitations}\label{sec:how} %The package works as follows. When an environment is asked to be %extracted, the package will first make a backup of the environment %with the |XTR| prefix, for instance, |XTRequation*|. After that, the %package will redefine the environment to read the lines of its body %verbatim (without executing), parse the lines to locate %|extractskip| environments and write all lines to a temporary file %and the lines that are not in an |extractskip| environment to a %temporary file. After the environment is finished, the temporary %file, containing for instance %\begin{example} % \begin{XTRequation*} % x^2+y^2=z^2 % \end{XTRequation*} %\end{example} %will be inserted in the source document using |\input|. This works, %at least in theory, with most environments. Notice that this method %does require a change to the |\begin| and |\end| macros provided by %the \LaTeX\ kernel \cite{LaTeXbase}. I had to add a hook to these %commands to be able to collect code to be executed after the current %environment is ended. In particular, this package will use those %hooks to |\input| the original code after finishing the current %group. See section~\ref{sec:imple} for more details. % %Commands require a different approach. As a command can have a very %specific argument structure, redefining commands safely, without %distorting its original behavior, is not possible in general. I have %chosen to support the most basic document structure commands as %provided by standard \LaTeX\ classes, like \pf{book} and %\pf{article}. Extraction of commands from other classes, like %provided by the \pf{koma-script} bundle, might work, but there is no %guarantee. % %To be more precise: when requested, the macros |\@chapter| and %|\@sect| will be redefined. These commands are at the basis of all %chapter and section commands. When \pf{extract} redefines one of %these commands, it first makes a backup, like |\XTR@chapter|. After %that, it will redefine the original command to read its argument(s), %export them to the target file and execute the backup with the %proper arguments. % %An alternative to this, rather restricted method is the method %accessed by the |extract-cmdline| option which redefines the %commands listed there to read the entire line of text, write that to %the target file and afterwards execute it with a backup copy of the %original command. This methods too has its drawbacks though as you %can't redefine commands that are used internally in other macros. % %More details on the package code can be found in %section~\ref{sec:imple}. % %\section{Source and examples}\label{sec:sande} %To generate this documentation, find the source of this %package, |extract.dtx| in your local \LaTeX\ installation or on CTAN %and perform the following steps. %\begin{example} % latex extract.dtx % latex extract.dtx % bibtex extract % makeindex -s gglo.ist -o extract.gls extract.glo % makeindex -s gind.ist -o extract.ind extract.idx % latex extract.dtx % latex extract.dtx %\end{example} % %If you only want to produce the package and example files from the %source, then the first step is sufficient. This step will generate %the package file |extract.sty| and the example files |xtrex1.tex|, %|xtrex2.tex|, |xtrex3.tex|, |xtrex4.tex|, |xtrex5.tex|, |xtrex6.tex| %and |xtrex7.tex|. % %\StopEventually{} % % \section{Implementation}\label{sec:imple} % Initializations. % \begin{macrocode} %<*extract> \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{extract} [2019/09/18 v1.9a extract content from document (HA)] \RequirePackage{verbatim} \RequirePackage{xkeyval} \newwrite\XTR@out \newwrite\XTR@tmp \newif\ifXTR@st \newif\ifXTR@skip \newif\ifXTR@extract % \end{macrocode} % \begin{macro}{\XTR@err} % \marg{text}\\ % Error macro. % \begin{macrocode} \def\XTR@err#1{\PackageError{extract}{#1}\@ehc} % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@namelet} % \marg{cmd1}\marg{cmd2}\\ % Version of |\let| for two command sequence names. % \begin{macrocode} \def\XTR@namelet#1#2{% \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname } % \end{macrocode} % \end{macro} % Options section, powered by \pf{xkeyval}. % \DescribeOption{active} % Control extraction with one switch. % \begin{macrocode} \define@boolkey[XTR]{extract.sty}[XTR@]{active}[true]{} % \end{macrocode} % \DescribeOption{header} % Do not create a header in the target file. % \begin{macrocode} \define@boolkey[XTR]{extract.sty}[XTR@]{header}[true]{} % \end{macrocode} % \DescribeOption{handles} % Extract |\begin{document}| and |\end{document}| or not. % \begin{macrocode} \define@boolkey[XTR]{extract.sty}[XTR@]{handles}[true]{} % \end{macrocode} % \DescribeOption{copydocumentclass} % Copy the |\documentclass| command to the target file. % \begin{macrocode} \define@boolkey[XTR]{extract.sty}[XTR@]{copydocumentclass}[true]{} % \end{macrocode} % \DescribeOption{generate} % Entry point for the target file name. % \begin{macrocode} \DeclareOptionX[XTR]{generate}{\lowercase{\def\XTR@file{#1}}} % \end{macrocode} % \DescribeOption{extract-env} % Environments that should be extracted. % \begin{macrocode} \DeclareOptionX[XTR]{extract-env}{% \def\XTR@envs{#1}% \XKV@for@n{#1}\XTR@tempa\XTR@tempb } % \end{macrocode} % \DescribeOption{extract-cmd} % Commands that should be extracted with the `arguments method'. % \begin{macrocode} \DeclareOptionX[XTR]{extract-cmd}{% \def\XTR@cmdsargs{#1}% \XKV@for@n{#1}\XTR@tempa\XTR@tempb } % \end{macrocode} % \DescribeOption{extract-cmdline} % Commands that should be extracted with the `line method'. % \begin{macrocode} \DeclareOptionX[XTR]{extract-cmdline}{% \def\XTR@cmdsline{#1}% \XKV@for@n{#1}\XTR@tempa\XTR@tempb } \def\XTR@tempb{% % \end{macrocode} % \DescribeOptions{-nrs,-labels} % For each environment or command provide new package options that % save the argument to a list cleared from redundant spaces. The % |-nrs| options also create a `counter' for counting the commands or % environments. The lists and counters will be used for conditional % extraction. Note that |\XTR@tkey| contains the key name inside % the option macro (due to the use of |\ProcessOptionsXi|). % \begin{macrocode} \DeclareOptionX[XTR]{\XTR@tempa-nrs}{% \expandafter\XKV@sp@deflist\csname XTR@\XKV@tkey\endcsname{##1}% \XTR@namelet{XTR@\XKV@tkey @cnt}{z@}% }% \DeclareOptionX[XTR]{\XTR@tempa-labels}{% \expandafter\XKV@sp@deflist\csname XTR@\XKV@tkey\endcsname{##1}% }% } % \end{macrocode} % \DescribeOptions{line-nrs,line-labels} % Generate options for |\extractline| commands. % \begin{macrocode} \def\XTR@tempa{line}\XTR@tempb % \end{macrocode} % \DescribeOptions{extract-nrs,extract-labels} % Generate options for |extract| environments. % \begin{macrocode} \def\XTR@tempa{extract}\XTR@tempb % \end{macrocode} % \DescribeOptions{extractskip-nrs,extractskip-labels} % Generate options for |extractskip| environments. % \begin{macrocode} \def\XTR@tempa{extractskip}\XTR@tempb % \end{macrocode} % Generate an error for unknown options. % \begin{macrocode} \DeclareOptionX*{\XTR@err{Unknown option `\CurrentOption'}} % \end{macrocode} % Initialize options. % \begin{macrocode} \ExecuteOptionsX[XTR]{header=true,handles=true,copydocumentclass=true} % \end{macrocode} % Process options. % \begin{macrocode} \ProcessOptionsX[XTR] % \end{macrocode} % \begin{macro}{\XTR@opentmp} % \begin{macro}{\XTR@writetmp} % \begin{macro}{\XTR@closetmp} % \begin{macro}{\XTR@writeout} % Shortcut macros for much used command sequences. % \begin{macrocode} \def\XTR@opentmp{\immediate\openout\XTR@tmp\jobname.xtr\relax} \def\XTR@writetmp{\immediate\write\XTR@tmp} \def\XTR@closetmp{\immediate\closeout\XTR@tmp} \def\XTR@writeout{\immediate\write\XTR@out} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % Perform some checks on the input. Notice the use of |\XKV@ifundefined| % which is equal to |\@ifundefined| if no $\varepsilon$-\TeX\ engine % is available and which uses |\ifcsname| when it is. In the latter % case, testing whether commands are defined does not create an % entry in \TeX's hash table. % \begin{macrocode} \ifXTR@active \XKV@ifundefined{XTR@file}{ \XTR@activefalse \XTR@err{no file to generate; extract deactivated} }{} \XTR@opentmp \XTR@writetmp{% \string\lowercase{\string\def\string\XTR@tempa{\jobname}}% } \XTR@closetmp \input{\jobname.xtr} \ifx\XTR@tempa\XTR@file \XTR@activefalse \XTR@err{attempt to overwrite source file; extract deactivated} \fi \fi % \end{macrocode} % \begin{macro}{\@envdepth} % Counter for depth of environments. % \begin{macrocode} \newcount\@envdepth\@envdepth\z@ % \end{macrocode} % \end{macro} % \begin{macro}{\begin} % \marg{environment}\\ % \changes{v1.9a}{2019/09/18}{Added definitions for robust versions of \cs{begin} and \cs{end}} % Modify the macro |\begin| to allow adding code to a level specific % hook which can be executed after |\endgroup| in |\end|. See for % more info on this macro the \LaTeX\ source~\cite{LaTeXbase}. We first do this % for the new \LaTeX\ format, which defines robust versions of |\begin| and |\end|. % \begin{macrocode} \@ifl@t@r\fmtversion{2019/10/01}% {% new format \@namedef{begin }#1{% \@ifundefined{#1}% {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}% {\def\reserved@a{\def\@currenvir{#1}% \edef\@currenvline{\on@line}% \csname #1\endcsname}}% \@ignorefalse \begingroup\@endpefalse % \end{macrocode} % Advance depth level. % \begin{macrocode} \global\advance\@envdepth\@ne % \end{macrocode} % Initialize the hook for this level. % \begin{macrocode} \global\@namedef{@afterendenvhook@\romannumeral\@envdepth}{}% \reserved@a }% % \end{macrocode} % \end{macro} % \begin{macro}{\end} % \marg{environment}\\ % Modify |\end| to execute the code collected in the hook. % \begin{macrocode} \@namedef{end }#1{% \csname end#1\endcsname\@checkend{#1}% \expandafter\endgroup\if@endpe\@doendpe\fi % \end{macrocode} % Copy current hook code to a temporary macro. % \begin{macrocode} \expandafter\let\expandafter\reserved@a \csname @afterendenvhook@\romannumeral\@envdepth\endcsname % \end{macrocode} % Decrease the depth. % \begin{macrocode} \global\advance\@envdepth\m@ne % \end{macrocode} % Execute the hook of the current environment. This is done after % decreasing the depth as to avoid level mixing problems when the % hook contains another environment. This environment has to be % executed at the same level as the environment in which the hook was % defined since it is executed after the group and does not belong % anymore to the environment in which the hook was defined. % \begin{macrocode} \reserved@a\relax \if@ignore\@ignorefalse\ignorespaces\fi }% % \end{macrocode} % \end{macro} % \begin{macro}{\begin} % \marg{environment}\\ % This is the code for the old format of \LaTeX. % \begin{macrocode} }{% old format \def\begin#1{% \@ifundefined{#1}% {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}% {\def\reserved@a{\def\@currenvir{#1}% \edef\@currenvline{\on@line}% \csname #1\endcsname}}% \@ignorefalse \begingroup\@endpefalse \global\advance\@envdepth\@ne \global\@namedef{@afterendenvhook@\romannumeral\@envdepth}{}% \reserved@a }% % \end{macrocode} % \end{macro} % \begin{macro}{\end} % \marg{environment} % This is the code for the old format of \LaTeX. % \begin{macrocode} \def\end#1{% \csname end#1\endcsname\@checkend{#1}% \expandafter\endgroup\if@endpe\@doendpe\fi \expandafter\let\expandafter\reserved@a \csname @afterendenvhook@\romannumeral\@envdepth\endcsname \global\advance\@envdepth\m@ne \reserved@a\relax \if@ignore\@ignorefalse\ignorespaces\fi }% } % \end{macrocode} % \end{macro} % \begin{macro}{\AfterEndEnv} % Adds code to the macros |\@afterendenvhook@i|, |ii|, etc. which will % be executed after the group of the current environment. % \begin{macrocode} \def\AfterEndEnv{% \expandafter\g@addto@macro \csname @afterendenvhook@\romannumeral\@envdepth\endcsname } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@checkxtr} % \marg{type}\marg{item}\\ % Checks whether a certain environment or command should be extracted or skipped. % \meta{type} is the type of check: for extraction or for skipping % content. \meta{item} is the name of a command or an environment. % \begin{macrocode} \def\XTR@checkxtr#1#2{% \@nameuse{XTR@#1false}% \XTR@namelet{XTR@maketrue}{XTR@#1true}% % \end{macrocode} % First check whether, for this macro or environment, some method of % conditional extraction is used. If not, just extract. % \begin{macrocode} \XKV@ifundefined{XTR@#2-nrs}{% \XKV@ifundefined{XTR@#2-labels}\XTR@maketrue{}% }{% % \end{macrocode} % Advance the `counter'. % \begin{macrocode} \begingroup \expandafter\count@\csname XTR@#2-nrs@cnt\endcsname \advance\count@\@ne \edef\XTR@resa{\expandafter\noexpand\expandafter\gdef\expandafter \noexpand\csname XTR@#2-nrs@cnt\endcsname{\the\count@}}% \expandafter\endgroup\XTR@resa }% \@nameuse{ifXTR@#1}\else \XKV@ifundefined{XTR@#2-labels}{}{% % \end{macrocode} % If the current label is in the list for extraction, extract it. % \begin{macrocode} \ifx\XTR@currentlabel\relax\else \@expandtwoargs\in@{,\XTR@currentlabel,}% {,\csname XTR@#2-labels\endcsname,}% \ifin@\XTR@maketrue\fi \fi }% \fi \@nameuse{ifXTR@#1}\else \XKV@ifundefined{XTR@#2-nrs}{}{% % \end{macrocode} % If the current command or environment number is in the list, extract it. % \begin{macrocode} \expandafter\XTR@ch@ckxtr\csname XTR@#2-nrs\expandafter \endcsname\csname XTR@#2-nrs@cnt\endcsname }% \fi % \end{macrocode} % Redefine |\XTR@currentlabel| to avoid extracting all following % environments of this type. % \begin{macrocode} \global\let\XTR@currentlabel\relax } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@ch@ckxtr} % \meta{list}\meta{counter}\\ % Parse the \meta{list} of numbers and compare each item with the %\meta{counter} holding the number of the current item. % \begin{macrocode} \def\XTR@ch@ckxtr#1#2{% \XKV@for@o#1\XTR@resa{\expandafter\XTR@ch@ck@tr\XTR@resa--\@nil#2}% } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@ch@ck@tr} % \meta{x}|-|\meta{y}|-|\meta{z}|\@nil|\meta{counter}\\ % Parse an element of the list. Basically, decide whether we have |x|, % |x-y|, |x-| or |-y| and act accordingly. % \begin{macrocode} \def\XTR@ch@ck@tr#1-#2-#3\@nil#4{% \ifx\@empty#1\@empty \ifnum#4>#2 \else\XTR@maketrue\fi \else \ifx\@empty#2\@empty \ifx\@empty#3\@empty \ifnum#4=#1 \XTR@maketrue\fi \else \ifnum#4<#1 \else\XTR@maketrue\fi \fi \else \ifnum#4<#1 \else\ifnum#4>#2 \else\XTR@maketrue\fi\fi \fi \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\extractionlabel} % \changes{v1.3}{2005/01/12}{Was \cs{extractlabel}} % \begin{macro}{\XTR@currentlabel} % |\extractionlabel| saves its argument (after removing redundant spaces). % This label will be used for conditional extraction. |\XTR@currentlabel| % is initialized. % \begin{macrocode} \def\extractionlabel{\KV@@sp@def\XTR@currentlabel} \let\XTR@currentlabel\relax % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\extract} % \begin{macro}{\extract*} % Define environments that write verbatim to the target file. The % starred version also executes the code by writing it to a temp file % and inputting it |\AfterEndEnv|, just as with redefining existing % environments. When the package is inactive, |extract| is equivalent % to the |comment| environment and |extract*| takes its body out of the % group and executes it hence acting as if |\begin{extract*}| and % |\end{extract*}| were never typed. % \begin{macrocode} \def\extract{\XTR@stfalse\XTR@extract} \@namedef{extract*}{\XTR@sttrue\XTR@extract} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\XTR@extract} % Prepare verbatim reading and check for an optional argument. % \begin{macrocode} \def\XTR@extract{% \@bsphack \let\do\@makeother\dospecials\catcode`\^^M\active \@testopt\XTR@@xtract\@nil } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@@xtract} % \oarg{label}\\ % Process the optional label, define line processing and start reading % verbatim. Do not extract when the package is not active. Use a % temporary file to extract the body to in case this needs to be % executed in the source document (|extract*| environment). % \begin{macrocode} \def\XTR@@xtract[#1]{% % \end{macrocode} % Check state. % \begin{macrocode} \ifXTR@active \def\XTR@tempa{#1}% \ifx\XTR@tempa\@nnil\else \KV@@sp@def\XTR@currentlabel{#1}% \fi \XTR@checkxtr{extract}{extract}% \else \XTR@extractfalse \fi \ifXTR@st\XTR@opentmp\fi \let\verbatim@processline\XTR@processline@begin \verbatim@start } % \end{macrocode} % \end{macro} % \begin{macrocode} \begingroup \lccode`\!=`\\ \lccode`\(=`\{ \lccode`\)=`\} \lowercase{\endgroup % \end{macrocode} % \begin{macro}{\XTR@processline@begin} % This macro starts the reparsing of a line read by \pf{verbatim}. It % is possible to have |\begin{extractskip}| and |\end{extractskip}| % on the same line. % \begin{macrocode} \def\XTR@processline@begin{% % \end{macrocode} % Initialize |\@temptokena| (used for temp file) and |\verbatim@line| % (used for output file). Save the original content of |\verbatim@line| % for later use. % \begin{macrocode} \@temptokena{}% \edef\XTR@orig@line{\the\verbatim@line}% \verbatim@line{}% \expandafter\XTR@testbegin\XTR@orig@line!begin(extractskip)\@nil } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@testbegin} % \meta{text1}|\begin{extractskip}|\meta{text2}|\@nil|\\ % Checks whether |\begin{extractskip}| occurs. % \begin{macrocode} \def\XTR@testbegin#1!begin(extractskip)#2\@nil{% \@temptokena\expandafter{\the\@temptokena#1}% \verbatim@line\expandafter{\the\verbatim@line#1}% \def\XTR@tempa{#2}% % \end{macrocode} % If \meta{text2} empty, there is no |\begin{extractskip}|. Just write the % content to file. % \begin{macrocode} \ifx\XTR@tempa\@empty\XTR@processline@write\else\XKV@afterfi % \end{macrocode} % Check the label. % \begin{macrocode} \XTR@skiplabel#2[]\@nil % \end{macrocode} % Should we skip the |extractskip| environment or not? % \begin{macrocode} \XTR@checkxtr{skip}{extractskip}% % \end{macrocode} % Switch to scanning for |\end{extractskip}| in the next line. % \begin{macrocode} \let\verbatim@processline\XTR@processline@end % \end{macrocode} % Remove some stuff that we added and continue scanning for |\end{extractskip}| % on the current line. % \begin{macrocode} \ifx\XTR@tempa\@nnil\XKV@afterelsefi \XTR@t@stbegin#2\@nil \else\XKV@afterfi \expandafter\XTR@t@stbegin\XTR@tempa\@nil \fi \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@skiplabel} % \meta{text1}\oarg{label}\meta{text2}|\@nil|\\ % This macro checks whether a label is present and sets |\XTR@currentlabel| % if necessary. % \begin{macrocode} \def\XTR@skiplabel#1[#2]#3\@nil{% \def\XTR@tempa{#1}% \def\XTR@tempb{#2}% \ifx\XTR@tempa\@empty \ifx\XTR@tempb\@empty \let\XTR@tempa\@nnil \else \KV@@sp@def\XTR@currentlabel{#2}% \XTR@sk@plabel#3\@nil \fi \else \let\XTR@tempa\@nnil \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@sk@plabel} % \meta{text}|[]\@nil|\\ % Remove extra brackets from input. % \begin{macrocode} \def\XTR@sk@plabel#1[]\@nil{\def\XTR@tempa{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@t@stbegin} % \meta{text}|\begin{extractskip}\@nil|\\ % Remove the extra |\begin{extractskip}| and start scanning for % |\end{extractskip}| in the current line. % \begin{macrocode} \def\XTR@t@stbegin#1!begin(extractskip)\@nil{% \XTR@testend#1!end(extractskip)\@nil } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@processline@end} % Starts scanning for |\end{extractskip}| in case this was not on one % line together with |\begin{extractskip}|. Comparable to |\XTR@processline@begin|. % \begin{macrocode} \def\XTR@processline@end{% \@temptokena{}% \edef\XTR@orig@line{\the\verbatim@line}% \verbatim@line{}% \expandafter\XTR@testend\XTR@orig@line!end(extractskip)\@nil } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@testend} % \meta{text1}|\end{extractskip}|\meta{text2}|\@nil|\\ % Check whether |\end{extractskip}| occurs in the line. % \begin{macrocode} \def\XTR@testend#1!end(extractskip)#2\@nil{% \@temptokena\expandafter{\the\@temptokena#1}% % \end{macrocode} % Skip material conditionally on labels or numbers. % \begin{macrocode} \ifXTR@skip\else\verbatim@line\expandafter{\the\verbatim@line#1}\fi \def\XTR@tempa{#2}% \ifx\XTR@tempa\@empty\XTR@processline@write\else\XKV@afterfi % \end{macrocode} % Switch to scanning for |\begin{extractskip}| in the next line. % \begin{macrocode} \let\verbatim@processline\XTR@processline@begin % \end{macrocode} % Continue scanning for |\begin{extractskip}| in the current line. % \begin{macrocode} \XTR@t@stend#2\@nil \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@t@stend} % \meta{text}|\end{extractskip}\@nil|\\ % Remove the redundant |\end{extractskip}| and continue scanning for % for the string |\begin{extractskip}| in this line. % \begin{macrocode} \def\XTR@t@stend#1!end(extractskip)\@nil{% \XTR@testbegin#1!begin(extractskip)\@nil }} % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@processline@write} % \changes{v1.8}{2005/05/07}{Solved bug of not copying empty lines to the target file} % Writes the material to the appropriate file. If one of the tokens % has become empty, it might be because the line was empty originally % or because the parsing and removal of |\begin{extractskip}| and % |\end{extractskip}| made it empty. In the latter case, do not write % the empty line. In the former case, do write it. % \begin{macrocode} \def\XTR@processline@write{% \ifXTR@st\ifcat$\the\@temptokena$\else \XTR@writetmp{\the\@temptokena}% \fi\fi \ifXTR@extract\ifcat$\the\verbatim@line$\else \XTR@writeout{\the\verbatim@line}% \fi\fi \ifx\XTR@orig@line\@empty\XTR@writetmp{}\XTR@writeout{}\fi } % \end{macrocode} % \end{macro} % \begin{macro}{\endextract} % \begin{macro}{\endextract*} % Stop reading verbatim and if necessary execute the body of the % environment after the |extract*| environment. % \begin{macrocode} \def\endextract{\XTR@stfalse\XTR@endextract} \@namedef{endextract*}{\XTR@sttrue\XTR@endextract} \def\XTR@endextract{% \@esphack \ifXTR@st \XTR@closetmp \AfterEndEnv{\input{\jobname.xtr}}% \fi } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\extractskip} % \begin{macro}{\endextractskip} % The |extractskip| environment when it is not used inside an environment % that is redefined to be extracted. Hence this environment makes itself % disappear, just as |extract*|, but doesn't write to the output file. % The trick with |XTR@activefalse| will remain local. % \begin{macrocode} \@namedef{extractskip}{\XTR@activefalse\@nameuse{extract*}} \XTR@namelet{endextractskip}{endextract*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\extractline} % This macro extracts all text after the macro and at the same line. % First we check for an optional star. % \begin{macrocode} \def\extractline{% \XKV@ifstar{\XTR@sttrue\XTR@extractline}% {\XTR@stfalse\XTR@extractline}% } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@extractline} % Start the group and reset all catcodes for verbatim reading. % \begin{macrocode} \def\XTR@extractline{% \begingroup \let\do\@makeother\dospecials\catcode`\^^M\active % \end{macrocode} % Test for an optional argument. Note that, due to reset catcodes, % macros won't work in the optional argument, but that is not a real % restriction, while it saves some tokens and memory. If we want to % allow for macro arguments, we need an extra macro for the check. % \begin{macrocode} \@testopt\XTR@@xtractline\@nil } % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@@xtractline} % \oarg{label}\meta{text}\meta{eol}\\ % The workhorse that reads input until the end of the line. Use the % |\lowercase| trick for the definition. % \begin{macrocode} \begingroup \catcode`\~=\active\lccode`\~=`\^^M \lowercase{\endgroup \def\XTR@@xtractline[#1]#2~{% % \end{macrocode} % Check state. % \begin{macrocode} \ifXTR@active \def\XTR@tempa{#1}% \ifx\XTR@tempa\@nnil\else \KV@@sp@def\XTR@currentlabel{#1}% \fi \XTR@checkxtr{extract}{line}% \else \XTR@extractfalse \fi \ifXTR@extract\XTR@writeout{#2}\fi % \end{macrocode} % If we need to execute the line, the catcodes are wrong, so write it % to the temporary file and insert it again when the catcodes are % reset by |\endgroup|. % \begin{macrocode} \ifXTR@st\XTR@opentmp\XTR@writetmp{#2}\XTR@closetmp\fi \endgroup % \end{macrocode} % Insert original content. % \begin{macrocode} \ifXTR@st \input{\jobname.xtr}% \fi }% } % \end{macrocode} % \end{macro} % Only define the following macros when the package is active. This % branch also performs redefinitions of the macros and environments % that should be extracted. % \begin{macrocode} \ifXTR@active % \end{macrocode} % Start writing the target file. % \begin{macrocode} \immediate\openout\XTR@out\XTR@file\relax % \end{macrocode} % Write header to the target file. % \begin{macrocode} \ifXTR@header % \end{macrocode} % Compute the time. % \begin{macrocode} \@tempcnta\time \divide\@tempcnta 60 \edef\XTR@tempb{% \the\year/\ifnum\the\month<10 0\fi\the\month/% \ifnum\the\day<10 0\fi\the\day,\the\@tempcnta:% } \multiply\@tempcnta 60 \@tempcntb\time \advance\@tempcntb-\@tempcnta \ifnum\@tempcntb<10 \xdef\XTR@tempb{\XTR@tempb0\the\@tempcntb} \else \xdef\XTR@tempb{\XTR@tempb\the\@tempcntb} \fi \begingroup % \end{macrocode} % Save the \% character. % \begin{macrocode} \catcode`\%=12 \gdef\XTR@tempa{%%\space} \endgroup % \end{macrocode} % Write all information to the target file. % \begin{macrocode} \XTR@writeout{\XTR@tempa} \filename@parse\XTR@file \ifx\filename@ext\relax\def\filename@ext{tex}\fi \XTR@writeout{% \XTR@tempa This is file, `\filename@base.\filename@ext',% } \XTR@writeout{% \XTR@tempa generated with the extract package.^^J\XTR@tempa } \XTR@writeout{\XTR@tempa Generated on : \space\XTR@tempb} \filename@parse\jobname \ifx\filename@ext\relax\def\filename@ext{tex}\fi \XTR@writeout{% \XTR@tempa From source \space: \space\filename@base.\filename@ext } \XTR@writeout{% \XTR@tempa Using options: \space\csname opt@extract.sty\endcsname } \XTR@writeout{\XTR@tempa} \fi % \end{macrocode} % If requested, reconstruct the |\documentclass| command using % information from \pf{xkeyval}. % \begin{macrocode} \ifXTR@copydocumentclass \def\XTR@tempa#1.cls\@nil{\def\XTR@tempa{#1}} \expandafter\XTR@tempa\XKV@documentclass\@nil \ifx\XKV@classoptionslist\@empty \XTR@writeout{\string\documentclass{\XTR@tempa}} \else \@temptokena\expandafter{\XKV@classoptionslist}% \XTR@writeout{\string\documentclass[\the\@temptokena]{\XTR@tempa}} \fi \fi % \end{macrocode} % Perform redefinitions at the beginning of the document. % \begin{macrocode} \AtBeginDocument{% \ifXTR@handles \XTR@writeout{}% \XTR@writeout{\string\begin{document}}% \fi % \end{macrocode} % Redefine environments. % \begin{macrocode} \XKV@ifundefined{XTR@envs}{}{% \XKV@for@o\XTR@envs\XTR@tempa{% % \end{macrocode} % Check whether the environment is defined. % \begin{macrocode} \XKV@ifundefined\XTR@tempa{% \XTR@err{% environment `\XTR@tempa' not defined; extraction canceled% }% }{% % \end{macrocode} % Backup the beginning of the environment. % \begin{macrocode} \XTR@namelet{XTR\XTR@tempa}{\XTR@tempa}% % \end{macrocode} % Redefine the beginning of the environment. This uses \pf{verbatim} % internally. % \begin{macrocode} \@namedef{\XTR@tempa\expandafter}\expandafter{\expandafter \def\expandafter\XTR@tempa\expandafter{\XTR@tempa}% % \end{macrocode} % Check whether the current environment should be extracted. Note % that |\XTR@tempa| contains the current environment name. % \begin{macrocode} \XTR@checkxtr{extract}\XTR@tempa \ifXTR@extract % \end{macrocode} % If extraction is required, write to the target file and to a temporary % file for inclusion afterwards. % \begin{macrocode} \XTR@writeout{}\XTR@opentmp \@bsphack \let\do\@makeother\dospecials\catcode`\^^M\active % \end{macrocode} % \begin{macro}{\verbatim@processline} % \changes{v1.1}{2005/01/01}{Made to write content on same line as % environment heading if so in source file} % Process macro for \pf{verbatim}. % \begin{macrocode} \def\verbatim@processline{% % \end{macrocode} % |\verbatim@processline| is redefined here since the first line is % treated specially, see below. % \begin{macrocode} \let\verbatim@processline\XTR@processline@begin % \end{macrocode} % Write the content to the files. % \begin{macrocode} \XTR@writeout{% \string\begin{\XTR@tempa}\the\verbatim@line }% \XTR@writetmp{% \string\begin{XTR\XTR@tempa}\the\verbatim@line }% }% % \end{macrocode} % \end{macro} % \begin{macrocode} \XTR@sttrue\let\XTR@tempb\verbatim@ \else % \end{macrocode} % Else, execute the backup of the current environment. % \begin{macrocode} \edef\XTR@tempb{\noexpand\begin{XTR\XTR@tempa}}% \fi \XTR@tempb }% % \end{macrocode} % Backup the end of the environment. % \begin{macrocode} \XTR@namelet{endXTR\XTR@tempa}{end\XTR@tempa}% % \end{macrocode} % Redefine the end of the environment. % \begin{macrocode} \@namedef{end\XTR@tempa\expandafter}\expandafter{\expandafter \def\expandafter\XTR@tempa\expandafter{\XTR@tempa}% \ifXTR@extract \@esphack % \end{macrocode} % Finalize writing and add the |\input| to the hook at the end of the % current environment. % \begin{macrocode} \XTR@writeout{\string\end{\XTR@tempa}}% \XTR@writetmp{\string\end{XTR\XTR@tempa}}% \XTR@closetmp \AfterEndEnv{\input{\jobname.xtr}}% \else % \end{macrocode} % If not extracting, execute the backup of the end of the environment. % \begin{macrocode} \edef\XTR@tempa{\noexpand\end{XTR\XTR@tempa}}% \expandafter\XTR@tempa \fi }% }% }% }% % \end{macrocode} % Redefine commands using the arguments. % \begin{macrocode} \XKV@ifundefined{XTR@cmdsargs}{}{% % \end{macrocode} % Once backup the current definitions. % \begin{macrocode} \let\XTR@sect\@sect \let\XTR@chapter\@chapter \def\XTR@tempb{chapter}% % \end{macrocode} % Redefine a list of macros to write themselves to the target file. % Chapters and section are treated differently since they are % constructed differently. |\chapter*| will not extract itself since % this gives technical difficulties due to the fact that this macro % is reused at several places inside other macros, taking none-character % input in its argument. % \begin{macrocode} \XKV@for@o\XTR@cmdsargs\XTR@tempa{% \XKV@ifundefined\XTR@tempa{% \XTR@err{command `\@backslashchar\XTR@tempa' not defined; extraction canceled% }% }{% % \end{macrocode} % Check whether allowed or not. % \begin{macrocode} \@expandtwoargs\in@{,\XTR@tempa,}% {,chapter,section,subsection,subsubsection,}% \ifin@ \ifx\XTR@tempa\XTR@tempb \def\@chapter[#1]#2{% % \end{macrocode} % Check whether to extract this chapter or not. % \begin{macrocode} \XTR@checkxtr{extract}{chapter}% \ifXTR@extract \XTR@writeout{}% \def\XTR@tempa{#1}% \def\XTR@tempb{#2}% \ifx\XTR@tempa\XTR@tempb \@temptokena{{#2}}% \else \@temptokena{[#1]{#2}}% \fi % \end{macrocode} % Write to file. % \begin{macrocode} \XTR@writeout{\string\chapter\the\@temptokena}% \fi % \end{macrocode} % Typeset the chapter. % \begin{macrocode} \XTR@chapter[#1]{#2}% }% \else % \end{macrocode} % We do a similar thing for sections created with |\@sect|. % \begin{macrocode} \def\@sect#1#2#3#4#5#6[#7]#8{% \@expandtwoargs\in@{,#1,}{,\XTR@cmdsargs,}% \ifin@ \XTR@checkxtr{extract}{#1}% \ifXTR@extract \XTR@writeout{}% \def\XTR@tempa{#7}% \def\XTR@tempb{#8}% \ifx\XTR@tempa\XTR@tempb \@temptokena{{#8}}% \else \@temptokena{[#7]{#8}}% \fi \XTR@writeout{\expandafter \string\csname#1\endcsname\the\@temptokena}% \fi \fi \XTR@sect{#1}{#2}{#3}{#4}{#5}{#6}[#7]{#8}% }% \fi \else \XTR@err{unsupported command `\XTR@tempa'; try the `extract-cmdline option}% \fi }% }% }% \XKV@ifundefined{XTR@cmdsline}{}{% % \end{macrocode} % Redefine a list of commands to write themselves and the text on the % same line to the target file. This works similar to |\extractline|. % \begin{macrocode} \XKV@for@o\XTR@cmdsline\XTR@tempa{% \XKV@ifundefined\XTR@tempa{% % \end{macrocode} % Check whether the command is defined. % \begin{macrocode} \XTR@err{command `\@backslashchar\XTR@tempa' not defined; extraction canceled}% }{% % \end{macrocode} % Check whether allowed or not. % \begin{macrocode} \@expandtwoargs\in@{,\XTR@tempa,}% {,chapter,section,subsection,subsubsection,}% \ifin@ \XTR@err{% use the `extract-cmd' option for command `\XTR@tempa'% }% \else % \end{macrocode} % Backup the command. % \begin{macrocode} \XTR@namelet{XTR\XTR@tempa}{\XTR@tempa}% % \end{macrocode} % Redefine the command. Note that, inside the definition of the command, % |\XTR@tempa| contains the command name. % \begin{macrocode} \@namedef{\XTR@tempa\expandafter}\expandafter{\expandafter \def\expandafter\XTR@tempa\expandafter{\XTR@tempa}% % \end{macrocode} % Check whether this command should be extracted. % \begin{macrocode} \XTR@checkxtr{extract}\XTR@tempa \begingroup \let\do\@makeother\dospecials\catcode`\^^M\active \XTR@extractcmdline }% \fi }% }% \begingroup \catcode`\~=\active\lccode`\~=`\^^M % \end{macrocode} % \begin{macro}{\XTR@extractcmdline} % \changes{v1.4}{2005/02/06}{Changed temp macro to token register} % \meta{text}\meta{eol}\\ % Workhorse for the command line extraction method. This macros reads % until the next end of line and saves the content in |\XTR@tempb|. % \begin{macrocode} \lowercase{\endgroup \def\XTR@extractcmdline#1~{\verbatim@line{#1}\XTR@@xtractcmdline}% }% % \end{macrocode} % \end{macro} % \begin{macro}{\XTR@@xtractcmdline} % Finalize the operation with the content of the current line. We write % it to a target file and to a temporary file for execution in the % current document. Note that |\XTR@tempa| still contains the current % command name. % \begin{macrocode} \def\XTR@@xtractcmdline{% \XTR@writeout{}% \XTR@writeout{\expandafter\string\csname\XTR@tempa \endcsname\the\verbatim@line }% \XTR@opentmp \XTR@writetmp{\expandafter\string\csname XTR\XTR@tempa \endcsname\the\verbatim@line }% \XTR@closetmp \endgroup \input{\jobname.xtr}% }% }% } % \end{macrocode} % \end{macro} % Finalize writing the target file. % \begin{macrocode} \AtEndDocument{% \ifXTR@handles \XTR@writeout{}% \XTR@writeout{\string\end{document}}% \fi \immediate\closeout\XTR@out } \fi % % \end{macrocode} % \Finale % \endinput % \iffalse %<*xtrex1> \documentclass[10pt]{article} \usepackage[ active, generate=file, copydocumentclass=false, extract-env=equation ]{extract} \begin{extract} \documentclass[11pt]{article} \end{extract} \begin{document} Some text. \begin{equation} a^2+b^2=c^2 \end{equation} Some text. \begin{equation} x^2+y^2=z^2 \end{equation} Some text. \end{document} % % %<*xtrex2> \documentclass{article} \usepackage[ active, generate=file, extract-env=exercise, extract-cmd=section, extract-cmdline=label ]{extract} \begin{extract*} \newtheorem{exercise}{Exercise} \end{extract*} \begin{document} \section{Theory} \label{sec:1} Some text. \section{Exercises} \begin{exercise} Use the results from section \ref{sec:1} to show that\dots \end{exercise} Some text. \end{document} % % %<*xtrex3> \documentclass{article} \usepackage[ active, generate=file, extract-env=figure, figure-nrs={1,3}, figure-labels={fig-a,fig-b} ]{extract} \begin{document} Some text. \begin{figure} Figure 1. \end{figure} Some text. \extractionlabel{fig-a} \begin{figure} Figure 2. \end{figure} Some text. \extractionlabel{fig-b} \begin{figure} Figure 3. \end{figure} Some text. \extractionlabel{fig-c} \begin{figure} Figure 4. \end{figure} \end{document} % % %<*xtrex4> \documentclass{article} \usepackage[ active, generate=file, extract-env=equation* ]{extract} \begin{extract*} \usepackage{amsmath} \end{extract*} \begin{document} Some text. \begin{equation*} x^2+y^2=z^2 \end{equation*} \begin{extract} $x=3$, $y=4$ and $z=5$ satisfy this equation. \end{extract} \end{document} % % %<*xtrex5> \documentclass{article} \usepackage[ active, generate=file, copydocumentclass=false, extract-labels=type-a, line-labels={type-a,type-c}, line-nrs=3 ]{extract} \begin{extract}[type-a] \documentclass{article} \end{extract} \begin{extract}[type-b] \documentclass{book} \end{extract} \begin{document} \parindent0pt \extractline[type-a]line 1\\ \extractline*line 2\\ \extractline line 3\\ \extractline*[type-a]line 4\\ \extractline*[type-c]line 5\\ \extractline line 6\\ \end{document} % % %<*xtrex6> \documentclass{article} \usepackage[ active, generate=file, extract-env=figure ]{extract} \begin{document} \begin{figure}[!h] \begin{extractskip} \fbox{figure 1} \end{extractskip} \fbox{figure 2} \end{figure} \begin{extract*} \begin{itemize} \item 1 \item 2 a\begin{extractskip}b \item 3 c\end{extractskip}d \item 4 \begin{extractskip} \item 5 \end{extractskip} \end{itemize} \end{extract*} \end{document} % % %<*xtrex7> \documentclass{article} \usepackage[ active, generate=file, extractskip-labels=skipb ]{extract} \begin{document} \begin{extract*} \begin{itemize} \begin{extractskip}[skipa] \item 1 \end{extractskip} \begin{extractskip}[skipb] \item 2 \end{extractskip} \begin{extractskip}[skipc] \item 3 \end{extractskip} \end{itemize} \end{extract*} \end{document} % % %<*preamble> \usepackage{url} \usepackage{extract} \usepackage{xcolor} \usepackage{fourier} \usepackage{varioref} \usepackage{pst-text} \def\reftextafter{on page~\thevpagerefnum} \def\reftextbefore{on page~\thevpagerefnum} \def\reftextfaceafter{on page~\thevpagerefnum} \def\reftextfacebefore{on page~\thevpagerefnum} \usepackage{listings} \lstnewenvironment{command}{% \lstset{columns=flexible,frame=single,backgroundcolor=\color{blue!20},% xleftmargin=\fboxsep,xrightmargin=\fboxsep,escapeinside=`',gobble=1}}{} \lstnewenvironment{example}{% \lstset{basicstyle=\footnotesize\ttfamily,columns=flexible,frame=single,% backgroundcolor=\color{yellow!20},xleftmargin=\fboxsep,% xrightmargin=\fboxsep,gobble=1}}{} \def\mktitledecor{% \rput[tl]{90}(-6.5,-22.56){% \psline[linewidth=1pt](0,1.5)(\paperheight,1.5)% \rput[lB](.075\paperheight,.5){\pscharpath[linecolor=blue!50,% fillcolor=yellow!20,fillstyle=solid,linewidth=.5pt]% {\Huge\bfseries\sffamily extract}% }% \rput[rB](.925\paperheight,.5){\pscharpath[linecolor=blue!50,% fillcolor=yellow!20,fillstyle=solid,linewidth=.5pt]% {\Huge\bfseries Documentation}% }% \psline[linewidth=1pt](0,0)(\paperheight,0)% }% } \usepackage{float} \newfloat{Listing}{htb}{loe} \makeatletter \def\tableofcontents{% \begin{multicols}{2}% [\section*{Contents}% \setlength{\columnseprule}{.4pt}% \setlength{\columnsep}{18pt}]% \@starttoc{toc}% \end{multicols}% } \def\changes@#1#2#3{% \protected@edef\@tempa{% \noexpand\glossary{\textbf{#1}\hfill\emph{(#2)}% \levelchar \ifx\saved@macroname\@empty \space\actualchar\generalname \else \expandafter\@gobble\saved@macroname \actualchar\string\verb\quotechar*% \verbatimchar\saved@macroname\verbatimchar \fi :\levelchar #3}% }% \@tempa\endgroup\@esphack } \def\DescribeMacros{\leavevmode\@bsphack \begingroup\MakePrivateLetters\Describe@Macros} \def\Describe@Macros#1{\endgroup\strut \marginpar{\raggedleft \def\@tempa{#1}\count@\z@ \@for\@tempa:=\@tempa\do{% \ifnum\count@>\z@\\\fi\advance\count@\@ne \MacroFont\expandafter\string\@tempa \expandafter\SpecialUsageIndex\expandafter{\@tempa}% }}% \@esphack\ignorespaces } \def\DescribeOption#1{\leavevmode\@bsphack \marginpar{\raggedleft\PrintDescribeOption{#1}}% \SpecialOptionIndex{#1}\@esphack\ignorespaces} \def\PrintDescribeOption#1{\strut\emph{option}\\\MacroFont #1\ } \def\SpecialOptionIndex#1{\@bsphack \index{#1\actualchar{\protect\ttfamily#1} (option)\encapchar usage}% \index{options:\levelchar#1\actualchar{\protect\ttfamily#1}\encapchar usage}\@esphack} \def\DescribeOptions#1{\leavevmode\@bsphack \marginpar{\raggedleft\strut\emph{options}% \@for\@tempa:=#1\do{% \\\strut\MacroFont\@tempa\SpecialOptionIndex\@tempa }}\@esphack\ignorespaces} \def\DescribeEnv#1{\leavevmode\@bsphack \marginpar{\raggedleft\PrintDescribeEnv{#1}}% \SpecialEnvIndex{#1}\@esphack\ignorespaces} \def\PrintDescribeEnv#1{\strut\emph{environment}\\\MacroFont #1\ } \def\SpecialEnvIndex#1{\@bsphack \index{#1\actualchar{\protect\ttfamily#1} (environment)\encapchar usage}% \index{environments:\levelchar#1\actualchar{\protect\ttfamily#1}\encapchar usage}\@esphack} \def\SpecialMainEnvIndex#1{\@bsphack\special@index{% #1\actualchar {\string\ttfamily\space#1} \encapchar main}% \special@index{environments:\levelchar#1\actualchar{% \string\ttfamily\space#1}\encapchar main}\@esphack} \def\DescribeEnvs#1{\leavevmode\@bsphack \marginpar{\raggedleft\strut\emph{environments}% \@for\@tempa:=#1\do{% \\\strut\MacroFont\@tempa\SpecialEnvIndex\@tempa }}\@esphack\ignorespaces} \renewenvironment{theglossary}{% \glossary@prologue \GlossaryParms \let\item\@idxitem \ignorespaces }{}% \makeatother \def\PrintChangesX{% \begingroup \let\efill\relax \PrintChanges \endgroup } \def\PrintIndexX{% \begingroup \setcounter{IndexColumns}{2} \setlength{\columnsep}{18pt}% \setlength{\columnseprule}{.4pt}% \PrintIndex \endgroup } \def\pf#1{\textsf{#1}} \def\descriptionlabel{\hspace\labelsep\normalfont} \EnableCrossrefs \RecordChanges \GlossaryPrologue{\section*{Version history}} \CodelineIndex % % %<*bib> @MISC{LaTeXbase, author = {Johannes Braams and David Carlisle and Alan Jeffrey and Leslie Lamport and Frank Mittelbach and Chris Rowley and Rainer Sch\"opf}, title = {The {\LaTeXe} Sources}, howpublished = {\url{CTAN:/macros/latex/base}}, year = 2003 } @MISC{xkeyval, author = {Hendri Adriaens}, title = {\pf{xkeyval} package}, howpublished = {\url{CTAN:/macros/latex/contrib/xkeyval}} } @MISC{verbatim, author = {Rainer Sch\"opf}, title = {\pf{verbatim} package, v1.5q}, howpublished = {\url{CTAN:/macros/latex/required/tools}}, year = {2003/08/22} } @MISC{xcomment, author = {Timothy Van Zandt}, title = {\pf{xcomment} package, v1.2}, howpublished = {\url{CTAN:/macros/latex/contrib/seminar}}, year = {1993/02/12} } @MISC{askinclude, author = {{Pablo A. Straub}}, title = {\pf{askinclude} package, v1.2e}, howpublished = {\url{CTAN:/macros/latex/contrib/misc}}, year = {1994/11/11} } @MISC{excludeonly, author = {Dan Luecking}, title = {\pf{excludeonly} package, v1.0}, howpublished = {\url{CTAN:/macros/latex/contrib/misc}}, year = {2003/03/14} } @MISC{comment, author = {Victor Eijkhout}, title = {\pf{comment} package, v3.6}, howpublished = {\url{CTAN:/macros/latex/contrib/comment}}, year = {1999/10} } @MISC{optional, author = {Donald Arseneau}, title = {\pf{optional} package, v2.2}, howpublished = {\url{CTAN:/macros/latex/contrib/misc}}, year = {2001/09} } @MISC{version, author = {Stephen Bellantoni}, title = {\pf{version} package}, howpublished = {\url{CTAN:/macros/latex/contrib/misc}}, year = {1990} } @MISC{versions, author = {Uwe L\"uck}, title = {\pf{versions} package, v0.51}, howpublished = {\url{CTAN:/macros/latex/contrib/versions}}, year = {2003/10/15} } @MISC{pagesel, author = {Heiko Oberdiek}, title = {\pf{pagesel} package, v1.1}, howpublished = {\url{CTAN:/macros/latex/contrib/oberdiek}}, year = {1999/04/13} } @MISC{pdfpages, author = {Andreas Matthias}, title = {\pf{pdfpages} package, v0.3e}, howpublished = {\url{CTAN:/macros/latex/contrib/pdfpages}}, year = {2004/01/31} } @MISC{selectp, author = {Donald Arseneau}, title = {\pf{selectp} package, v0.9}, howpublished = {\url{CTAN:/macros/latex/contrib/misc}}, year = {1992/09/25} } @MISC{fancyvrb, author = {Timothy Van Zandt}, title = {\pf{fancyvrb} package, v2.6}, howpublished = {\url{CTAN:/macros/latex/contrib/fancyvrb}}, year = {1998/07/17} } @MISC{listings, author = {Carsten Heinz}, title = {\pf{listings} package, v1.3}, howpublished = {\url{CTAN:/macros/latex/contrib/listings}}, year = {2004/09/07} } % % % \fi