The collect package. Jonathan Sauer jonathan.sauer@gmx.de 2004/09/10



Similar documents
Impreso: 22/02/2011 Página 1 de 19. Origen: FSC Versión: 2011-v3 EBILLING FAQ

JBackpack Manual. Version Abstract

UNIVERSITY OF CALGARY Information Technologies WEBFORMS DRUPAL 7 WEB CONTENT MANAGEMENT

A couple of things involving environments

Debugging Complex Macros

Introduction to MS WINDOWS XP

A package for rotated objects in L A TEX

MAXMAILER USER GUIDE

user guide This user guide can be used as a whole manual, or sections, depending on the user s access permissions to AgendaOnline.

Python Loops and String Manipulation

How To Write Tvalue Amortization Software

Quick Reference Guide PAYMENT GATEWAY (Virtual Terminal)

The Social Accelerator Setup Guide

Lexical analysis FORMAL LANGUAGES AND COMPILERS. Floriano Scioscia. Formal Languages and Compilers A.Y. 2015/2016

BF Survey Plus User Guide

INSTALL/UPGRADE GUIDE: Amicus Small Firm Accounting

NCID User Guide Version 1.8. Office of Information Technology Services As of July 26, 2011

Chapter 6. Formatting Text with Character Tags

The ogonek package. Janusz Stanisław Bień 94/12/21

University of Florida Student Academic Support System Coordinator's Guide. Table of Contents. A. Sass Web Sign on. B. Introduction

FILESURF 7.5 SR3/WORKSITE INTEGRATION INSTALLATION MANUAL 1 PRELIMINARIES...3 STEP 1 - PLAN THE FIELD MAPPING...3 STEP 2 - WORKSITE CONFIGURATION...

How to Use SDTM Definition and ADaM Specifications Documents. to Facilitate SAS Programming

7JjX Macros for COBOL Syntax Diagrams

Base year recalculation methodologies for structural changes

Introduction to Python

TEX BY TOPIC, A TEXNICIAN S REFERENCE

Overview of Kronos iseries Manager

HPUG_1014. Shaw Home Phone. User Guide

Avira Exchange Security Small Business Edition. Quick Guide

Context sensitive markup for inline quotations

The Comprehensive Guide to Using Syncless

Greatest Common Factor and Least Common Multiple

A Python Tour: Just a Brief Introduction CS 303e: Elements of Computers and Programming

River Valley Credit Union Online Banking

1603 Program Online System Guide Submitting Reviewer Requested Documentation Pages 6 8

NASDAQ Market Velocity and Forces 2.1

Importing and Exporting With SPSS for Windows 17 TUT 117

Creating a website using Voice: Beginners Course. Participant course notes

VIP Quick Reference Card

A Tutorial on Creating Presentations Using Beamer

LETTERS, LABELS &

Exercise 4 Learning Python language fundamentals

Search help. More on Office.com: images templates

How To Program An Nxt Mindstorms On A Computer Or Tablet Computer

Relocation Personnel Roles and Responsibilities MC&FP

How To Use The Correlog With The Cpl Powerpoint Powerpoint Cpl.Org Powerpoint.Org (Powerpoint) Powerpoint (Powerplst) And Powerpoint 2 (Powerstation) (Powerpoints) (Operations

9 Calculated Members and Embedded Summaries

Magenta CMS Training: RAF Station/ RAF Sport websites

Lead Management User Guide

The Principle of Translation Management Systems

NON DEPARTMENT OF DEFENSE SCHOOLS PROGRAM STUDENT ONLINE REGISTRATION USER GUIDE

Exchanger XML Editor - Canonicalization and XML Digital Signatures

The gensymb package for L A TEX 2ε

An Introduction to the WEB Style of Literate Programming

User Manual. BarcodeOCR Version: September Page 1 of 25 - BarcodeOCR

CRM Global Search: Installation & Configuration

Self-Service Portal Registering, downloading & activating a soft token

How to Use Swiftpage for Microsoft Excel

A Babel language definition file for Icelandic

Compiler Construction

Tralics, a LaTeX to XML translator Partie II

Programming in Access VBA

Helping English Language Learners Understand Content Area Texts

How to use the Self Service Password Reset

How to Create a Campaign in AdWords Editor

M&T Web InfoPLU$ GETTING STARTED GUIDE

SET UP AND OPERATION GUIDE

Scanner. tokens scanner parser IR. source code. errors

How To Use A Development Site Safely

VFComb 1.3 the program which simplifies the virtual font management

HP-1000 Powerline Ethernet Adapter

HP-1000 Powerline USB Adapter

Virtual Terminal User Manual for Direct Users

Version Control with. Ben Morgan

Using an external agency or individual to transcribe your qualitative data

BRILL s Editorial Manager (EM) Manual for Reviewers

Magit-Popup User Manual

BAILLIE GIFFORD. The Baillie Gifford Online Management Service (OMS) Further Information

A FRESH NEW LOOK FOR YOUR INVESTMENTS

How to Create a Spreadsheet With Updating Stock Prices Version 3, February 2015

Programming Assignment II Due Date: See online CISC 672 schedule Individual Assignment

How to Setup an IMAP account in Outlook Express to Connect to Your Arrowmail Mailbox

Printing labels with ConTEXt

About the HealthStream Learning Center

C Compiler Targeting the Java Virtual Machine

HowTo. Planning table online

Access Control and Audit Trail Software

NewsletterAdmin 2.4 Setup Manual

Transcription:

The collect package Jonathan Sauer jonathan.sauer@gmx.de 2004/09/10 Abstract This file describes the collect package that makes it possible to collect text for later use. Contents 1 Introduction 1 2 Usage 2 2.1 collect................................. 2 2.2 Other environments.......................... 3 3 Examples 3 3.1 collect................................. 3 3.2 Other environments.......................... 4 4 Creating your own environment 4 5 Notes 5 6 Implementation 5 6.1 Main environments and macros.................... 5 6.1.1 collect............................. 5 6.1.2 Other environments...................... 7 6.2 Internal environments and macros.................. 7 1 Introduction Suppose you are writing the specification of a programming language. Then you will surely insert definitions of the grammar (i.e. using the syntax package). Most This document corresponds to collect.sty v0.9, dated 2004/09/10. 1

likely you will insert the grammar for i.e. loops, conditions et cetera in the appropriate chapter, but for easy implementation of a parser, you will want to include the complete grammar as an appendix, so that one does not have to collect the complete grammar from the bits in each chapter. Of course you could do this by hand using the copy-and-paste facility of your text editor. But this is cumbersome and errorprone if you modify the grammar afterwards, i.e. for a second version. This package provides the collect environment that typesets its contents and collects it for later use as well. In other situations you will want to save the contents of an environment in a macro. Then the collectinmacro environment should do the trick. 2 Usage General note If an environment exists in a normal and a starred form (i.e. collect and collect*), then the former does not typeset the environment contents, while the latter typesets it. Note, too, that the normal and the starred version of an environment often have a different number of parameters. Stripping of spaces All environments strip any leading space before the start of the text and any trailing space after the end of the text. Trailing \pars (i.e. resulting from a blank line at the end of the environment) are not removed. 2.1 collect You can define several collections. Each collection can be used independently to collect text across the document. You define a collection using \definecollection, use it in the collect and collect* environment and typeset it using \includecollection. Note The name of the collection is used as the suffix of the file that stores the collection (the complete name is jobname. name). So you should not name a collection tex, log, dvi, pdf and so on. \definecollection collect* Note You can only include a collection after completely collecting it. If you include it and continue to collect afterwards, the collection will be cleared after its inclusion. This can be used to recycle a collection: Use it in the first part of your document to collect text, typeset this text using \includecollection and then reuse the collection in the second part of your document to collect new text which will finally be typeset using \includecollection a second time. Usage: \definecollection { name }. Defines a collection of the name name. Usage: \begin{collect*} { name } { before } { after } { beforecol } { aftercol }... \end{collect*}. 2

Collects the text inside the environment in the collection name. Then typesets the text. name must have been defined using \definecollection. before and after are tokens inserted before and after the environment contents in the collection as well as the typeset text. beforecol and aftercol are tokens inserted before and after the environment contents only in the collection. This can be used to insert a section heading ( beforecol ) and a backref to the section where the text has been collected ( aftercol ). collect \includecollection collectinmacro Note The collect* environment uses a temporary file jobname.tmp to temporarily store the environment contents and include it afterwards. 1 Usage: \begin{collect} { name } { beforecol } { aftercol }... \end{collect}. Collects the text inside the environment in the collection name. Does not typeset the text (therefore, the two parameters before and after are missing); except for that, this environment is identical to collect*. Usage: \includecollection { name }. Includes the collection name. Afterwards, the collection is reset. You can include the collection before it is actually collected in the same way you can include a table of contents at the beginning of your document. Simply say \includecollection and then use the collect* or collect environment to collect text. Then run L A TEX on your file twice. (the first time to collect the text, the second time to put it in the document using \includecollection) 2.2 Other environments Usage: \begin{collectinmacro} { macro } { before } { after }... \end{collectinmacro}. Collects the contents of an environment inside a macro macro without typesetting it. If macro has been defined prior to using this environment, its previous meaning is lost. The new definition is global. before and after are tokens inserted before and after the environment contents in the macro. Important note This environment differs slightly from collect and collect*: Some macros, i.e. \verb, do not work correctly when macro is used later on. 2 3 Examples 3.1 collect \begin{collect*}{tst}{before\par}{\par After}{Before file\par}{\par After file} This is a test \end{collect*} 1 This way, catcode changes inside the environment are honored. 2 As the catcodes have already been set when collecting the contents and cannot be changed afterwards, at least not without etex. 3

This results in the following text typeset directly: Before This is a test After And following text is typeset when the collection tst is included using \includecollection{tst}: Before file Before This is a test After After file 3.2 Other environments \begin{collectinmacro}{\collectedtext}{before\par}{\par After} This is a test \end{collectinmacro} This results in no text typeset directly and the following text stored in the macro \collectedtext: Before\par This is a test\par After 4 Creating your own environment You can create your own environment based on any of the environments in this package, i.e. to create a grammarpart environment to typeset part of a grammar. You can for example say: \definecollection{gra} \newenvironment{grammarpart}[1]{% \@nameuse{collect*}{gra}{% \emph{start of grammar #1 }\par% }{% \par\emph{end of grammar}\par% }{% \subsection{#1}% }{% \par See some section in the text. }% }{% \@nameuse{endcollect*}% } 4

This will create a grammarpart environment with one parameter, the part of the grammar defined. (i.e. Identifiers ) At the start of the environment the text Start of grammar part will be typeset, followed by the grammar (the contents of the environment), and finally a line End of grammar will be added. When including the collected grammar parts using \includecollection each grammar part will be prefixed by a subsection heading bearing the grammar part as its title and suffixed by See some section in the text. (this could be extended to include a backref using \ref label ) Note If you use any of the environments inside a custom environment to afterwards collect text with this custom environment (as in the example of the grammarpart environment above), you must not begin and end it using \begin and \end, or the environment contents will not be collected correctly. You must use \@nameuse{ environment } and \@nameuse{end environment } as in the example above, or, if the environment is not starred, \ environment and \end environment. Note You still can use the environments of this package inside other environments (i.e. a itemize environment) without any problems. 5 Notes If you use any of the environments inside your own environment, note that the end of the environment is executed, but not included in the collected text! (that s why the the environments collect* and collectinmacro have two parameters for including text before and after the environment, before and after ). 6 Implementation \definecollection 6.1 Main environments and macros 6.1.1 collect Usage: \definecollection { name } Defines a collection name. This macro allocates a \newwrite CE@@ name @out and defines a \newif CE@@ name open. 1 \newcommand{\definecollection}[1]{% 2 \@ifundefined{ce@@#1@out}{% 3 \expandafter\newwrite\csname CE@@#1@out\endcsname% 4 \expandafter\newif\csname ifce@@#1@open\endcsname% 5 \csname CE@@#1@openfalse\endcsname% 6 }{% 7 \PackageError{collect}{Collection #1 has already % 5

8 been defined}{\@ehc}% 9 }% 10 } collect* collect Usage: \begin{collect*} { name } { before } { after } { beforecol } { aftercol }... \end{collect*}. 11 \newenvironment{collect*}[5]{% 12 \global\toks@{}% 13 \def\ce@file{#1}% 14 \def\ce@preenv{#2}% 15 \def\ce@postenv{#3}% 16 \def\ce@prefileenv{#4}% 17 \def\ce@postfileenv{#5}% 18 \CE@get@env@body@start% 19 }{% What are we doing? We make sure the collection is open, then we save beforecol, before, the collected environment contents, after and aftercol in the collection file. 20 \CE@ensure@opened{\CE@file}% 21 \edef\@tempa{\csname CE@@\CE@file @out\endcsname}% 22 \immediate\write\@tempa{\ce@meaning\ce@prefileenv}% 23 \immediate\write\@tempa{\ce@meaning\ce@preenv}% 24 \immediate\write\@tempa{\the\toks@}% 25 \immediate\write\@tempa{\ce@meaning\ce@postenv}% 26 \immediate\write\@tempa{\ce@meaning\ce@postfileenv}% Now we repeat the same thing, but with the temporary file and writing only before, the collected environment contents and after. Then we include the temporary file. Why so complicated, as we have the contents of the environment in \toks@? Because the catcodes might not be correct, i.e. if \verb is used inside the environment. So we have to read the environment contents again, which without etex is only possible using a temporary file. 27 \immediate\openout\ce@tmp@out=\jobname.tmp% 28 \immediate\write\ce@tmp@out{\ce@meaning\ce@preenv}% 29 \immediate\write\ce@tmp@out{\the\toks@}% 30 \immediate\write\ce@tmp@out{\ce@meaning\ce@postenv}% 31 \immediate\closeout\ce@tmp@out% 32 \@input{\jobname.tmp}% 33 \par% 34 } Usage: \begin{collect} { name } { beforecol } { aftercol }... \end{collect}. 35 \newenvironment{collect}[3]{% 36 \global\toks@{}% 37 \def\ce@file{#1}% 38 \def\ce@prefileenv{#2}% 6

39 \def\ce@postfileenv{#3}% 40 \CE@get@env@body@start% 41 }{% As this environment, contrary to collect*, does not typeset its contents, we only write to the collection file: 42 \CE@ensure@opened{\CE@file}% 43 \edef\@tempa{\csname CE@@\CE@file @out\endcsname}% 44 \immediate\write\@tempa{\ce@meaning\ce@prefileenv}% 45 \immediate\write\@tempa{\the\toks@}% 46 \immediate\write\@tempa{\ce@meaning\ce@postfileenv}% 47 } \includecollection Usage: \includecollection { name }. Includes the collection name which must have been defined previously using \definecollection. Afterwards, the collection is cleared. 48 \newcommand{\includecollection}[1]{% 49 \CE@ensure@closed{#1}% 50 \@input{\jobname.#1}% 51 } 6.1.2 Other environments collectinmacro Usage: \begin{collectinmacro} { macro } { before } { after }... \end{collectinmacro}. Collects the contents of an environment inside a macro. 52 \newenvironment{collectinmacro}[3]{% 53 \def\ce@destmacro{#1}% 54 \def\ce@postenv{#3}% We initialize the result with before : 55 \toks@{#2}% 56 \CE@get@env@body@start% 57 }{% We add after : 58 \toks@\expandafter\expandafter\expandafter{% 59 \expandafter\the\expandafter\toks@\ce@postenv}% Finally we globally define macro to contain the collected contents: 60 \expandafter\expandafter\expandafter% 61 \gdef\expandafter\ce@destmacro\expandafter{\the\toks@}% 62 \toks@{}% 63 } 6.2 Internal environments and macros We allocate a new \newwrite for the processing of a temporary file: 64 \newwrite\ce@tmp@out 7

\CE@get@env@body@start \CE@get@env@body@start@ Starts the collecting of the contents of an environment. (the environment starts immediately after the macro) 65 \def\ce@get@env@body@start{% 66 \let\@tempa\ce@get@env@body% We may have to gobble leading spaces, therefore we check the first character in the environment: 67 \futurelet\@tempb\ce@get@env@body@start@% 68 } Support macro for \CE@get@env@body@start. Checks if the next token is a space, then calls \CE@get@env@body@start@@. Otherwise, the collecting of the environment contents is started. 69 \def\ce@get@env@body@start@{% \@sptoken contains a single space and is defined in ltdefns.dtx: 70 \ifx\@tempb\@sptoken% 71 \expandafter\ce@get@env@body@start@@% 72 \else% 73 \expandafter\ce@get@env@body% 74 \fi% 75 } \CE@get@env@body@start@@ Support macro for \CE@get@env@body@start@. Gobbles up any space following the macro, then start the collecting of the environment contents using \CE@get@env@body. 76 \def\ce@get@env@body@start@@{% 77 \afterassignment\ce@get@env@body% 78 \let\@tempb= % 79 } \CE@get@env@body Usage: \CE@get@env@body { body } \end { envname }. To ensure proper initialization, this macro should not be called directly; instead \CE@get@env@body@start should be called. First we change the catcode of Q to 3 (math switch) in order to have a really unique character for parameter matching later on. 3 We do this in a group in order to easily restore the catcode later on and make all macro definitions global: 80 \bgroup 81 \catcode \Q=3 Now we begin the macro: 82 \long\gdef\ce@get@env@body#1\end#2{% Right at the beginning of the macro, we are at an \end (and #1 contains the contents prior to it). We check if it ends the current environment (#2 contains the name of the environment ended): 83 \def\@tempb{#2}% 84 \ifx\@tempb\@currenvir% 3 Taken from Around the bend 15 8

Yes, it ends the current environment. We add the contents to \toks@ and are done. But we do not add the contents directly as there may be a trailing space left (multiple spaces have been collapsed into one space by TEX). So we call \CE@get@env@body@ using delimited parameters (note that Q has catcode 3, therefore a normal Q is not matched). What exactly is going on here? Suppose we have the text Hello World_ (the _ denotes the trailing space). Then \CE@get@env@body@ is called like this: \CE@get@env@body@Hello World Q Q \CE@get@env@body@ matches the parameters like this: #1 is Hello World ; leaving _Q (added by the call from \CE@get@env@body) in the input. \CE@get@env@body@ then calls \CE@get@env@body@@ using #1 and Q, resulting in the call: \CE@get@env@body@@Hello WorldQ Q \CE@get@env@body@@ matches its parameter like this: #1 is Hello World again, and #2 is the second Q. But what happened to the space between the two Qs? As #2 is not a delimited parameter, TEX skips spaces after matching the first Q until it reaches the second Q, thus gobbling up the space inbetween. 4 Now suppose we have the text Hello World without any trailing space. Then \CE@get@env@body@ is called like this: \CE@get@env@body@Hello WorldQ Q \CE@get@env@body@ matches its parameters like this: #1 is Hello WorldQ. \CE@get@env@body@ then calls \CE@get@env@body@@ using #1 and Q, resulting in the call: \CE@get@env@body@@Hello WorldQQ \CE@get@env@body@@ matches its parameter like this: #1 is Hello World without the trailing Q, and #2 is the second Q. The only difference to the situation described above is the missing space between the two Qs. 4 c.f. TEXbook chapter 20. 9

Remember that the Q is always Q with catcode 3, thus no Q in the environment contents is matched. 85 \CE@get@env@body@#1Q Q% 86 \def\@tempa{\end{#2}}% 87 \else No, it ends another environment. We add the contents as well as the \end environment to \toks@. Then we continue collecting: 88 \toks@\expandafter{\the\toks@#1\end{#2}}% 89 \fi% 90 \@tempa% 91 } \CE@get@env@body@ \CE@get@env@body@@ Support macro for \CE@get@env@body. See \CE@get@env@body for explanations. 92 \long\gdef\ce@get@env@body@#1 Q{% 93 \CE@get@env@body@@#1Q% 94 } Support macro for \CE@get@env@body@. See \CE@get@env@body for explanations. 95 \long\gdef\ce@get@env@body@@#1q#2{% 96 \toks@\expandafter{\the\toks@#1}% 97 } \CE@meaning \CE@ensure@opened Finally we end the group, thus restoring the catcode of Q: 98 \egroup Usage: \CE@meaning { macro }. Expands to the meaning of macro. 99 \long\def\ce@meaning#1{% 100 \expandafter\strip@prefix\meaning#1% 101 } Usage: \CE@ensure@opened { name }. Ensures that the file for collection name is opened. 102 \def\ce@ensure@opened#1{% 103 \@ifundefined{ifce@@#1@open}{% 104 \PackageError{collect}{Collection #1 has not been defined}{\@ehc}% 105 }{% 106 \csname ifce@@#1@open\endcsname\else% 107 \expandafter\immediate\expandafter\openout% 108 \csname CE@@#1@out\endcsname=\jobname.#1% 109 \expandafter\global\csname CE@@#1@opentrue\endcsname% 110 \fi% 111 }% 112 } 10

\CE@ensure@closed Usage: \CE@ensure@closed { name }. Ensures that the file for collection name is closed. 113 \def\ce@ensure@closed#1{% 114 \@ifundefined{ifce@@#1@open}{% 115 \PackageError{collect}{Collection #1 has not been defined}{\@ehc}% 116 }{% 117 \csname ifce@@#1@open\endcsname% 118 \expandafter\immediate\expandafter\closeout% 119 \csname CE@@#1@out\endcsname% 120 \expandafter\global\csname CE@@#1@openfalse\endcsname% 121 \fi% 122 }% 123 } Index Numbers written in italic refer to the page where the corresponding entry is described, the ones underlined to the code line of the definition, the rest to the code lines where the entry is used. Symbols \@sptoken........ 70 A \afterassignment.. 77 C \CE@destmacro... 53, 61 \CE@ensure@closed......... 49, 113 \CE@ensure@opened....... 20, 42, 102 \CE@file...... 13, 20, 21, 37, 42, 43 \CE@get@env@body...... 66, 73, 77, 80 \CE@get@env@body@ 85, 92 \CE@get@env@body@@.......... 93, 95 \CE@get@env@body@start.... 18, 40, 56, 65 \CE@get@env@body@start@......... 67, 69 \CE@get@env@body@start@@......... 71, 76 \CE@meaning........ 22, 23, 25, 26, 28, 30, 44, 46, 99 \CE@postenv........ 15, 25, 30, 54, 59 \CE@postfileenv....... 17, 26, 39, 46 \CE@preenv.. 14, 23, 28 \CE@prefileenv........ 16, 22, 38, 44 \CE@tmp@out.. 27 31, 64 collect (environment).......... 3, 35 collect* (environment)..... 2, 11 collectinmacro (environment).. 3, 52 D \definecollection 1, 2 E environments: collect*..... 2, 11 collectinmacro 3, 52 collect...... 3, 35 I \includecollection 3, 48 Q \Q.............. 81 11