Richard, Nice work! Here's my 2 cents worth. I leave final decisions to you. 1. Theres a Jr after my name. 2. P. 2 middle: Earlier definitions of X.flags, lpr.flags, lp.flags, pr.flags might flow better. 3. P. 2 line 7 from bottom: data in the data frame -> type of data in the data frame 4. Bottom line: footnote for page command: S-Plus (StatSci, Inc) users have a special built-in function called page which we suggest renaming page.something. 5. P. 3 after "fonts, geometry, and color": One particularly useful public-domain X-window pager is "xless", available from ... 6. P. 3 before An alternate usage (of Vars): add after "to the display": "since it was not assigned to another object. Example output might be: > d <- data.frame(x=1:2, y=factor(c("a","b")), + q=structure(3:4, label="Z")) > Vars(d) Label Class Levels q Z x y factor a b 7. P 4 - replace 3 lines of code with form.page <- structure(c(1,1,1,1,...), names=names(my.data.frame), form.dir="Study.R93.124") 8. P 5, top: Are you thinking of different pages of the form being in separate files within a directory for that form? It might be better to have multiple files within a directory, and use sep="." instead of sep="/" After the function definition add: This example assumes the image is in text format. If for example JPEG, GIF, or other image formats commonly used by scanners was used, you can replace page(file=....) with unix(paste("xli",attr(form.page.arg,"form.dir"),".",form.page...., "&")) to use the xli displayer. ("form.dir" -> "form.root" if not use directory) Instead of form(12) use form(12) # display form page containing 12th variable form("cholesterol") #display form page containing cholesterol and add "Here file Study.R92.124.2" is displayed. 9. First reference: add your name - don't forget that I need to give Mike Meyer a new version of vars to reflect your changes. Another model for the form page attribute is to attach the attribute to each variable separately. Then form(cholesterol) would work, and if you add variables, the attributes will still point to the right place (with NULL for new variables). A utility function could take input like c(1,1,1,1,1,...) and piece it out to the variables in my.data.frame.