* Read the documentation from Richmond.
* Read Alan's program.
* Read our version of the Pongrass manual.
* Had Alan show me how to run his program.
* Put Alan's formulas and den screens into MACE.
* Merged Alan's pagform changes into SAGE.
* Increased the UserId field from 6 to 10 characters.
* Shortened the filenames of four screens and five formulas.
MACE limits the base part of file names to eight characters.
* Tested the X Window version of pagform.
It was crashing because the getmsg routine in composition
conflicted with the one in the network socket library.
* Fixed the positioning in the export to SAGE formula.
It used to export the pages upside down.
* Started working on applying spread and squeeze to banners.
* Started a new pagination engine.
* Read ads from the ad database.
* Read agate fillers from the agate house ad database.
* Paginate columns, using Richmond look ahead and agate filler algorithms.
* Write ad and page records to the output ad and page databases.
* Started collecting statistics for spread and squeeze.
* Worked on the code to paginate columns.
It didn't always place enough classification headings.
* Added more statistics for spread and squeeze.
* Started working on windows.
I have some of the height estimation done. I still have to add code
to retry if the estimate is too low.
* Wrote a PostScript dump module to show boxes on a laser printer.
These help for debugging.
* Display statistics for spread and squeeze.
* Improved selection window for banners.
* Started selection window for policy ads.
* Started selection window for corner ads.
* Started selection window for display house ads.
* Added support for requesting page and column positions for house ads.
* Added support for placing multiple copies of house ads.
* Improved filler placement.
No longer places fillers directly below classification headers if it can place
the filler above the header.
* Obey corner requests for corner ads.
* Generate PostScript to hundredths of points instead of just points.
At 300 dpi, rounding to points leaves visible gaps.
* Added a command key menu to the spread menus for banner, corner, house
and policy ads.
This menu has options to set the requested page and column, set the number
of copies, and view the pages and columns where the ad was placed.
* Fixed the calculation for total house ad area.
* Added a menu to display and modify the colors on each page.
* Added a window to show the color ads on each page.
* Added an option to change the first page without starting over.
* Started looking into color separations.
* Added an option to view the unplaced house ads.
* Added color and special position flags to the PostScript dump.
* Started working on setting column reservations.
These will specify open columns or partial pages.
* Added column space reservations.
Each column can have a space reservation on the bottom and on the top.
You can create them before paginating, and modify them after each pass.
The page color selection picklist now shows a mark for pages that have
reservations. The pagination engine creates leading records for them.
* Linked adjacent column reservation with the same height.
This allows the pagination engine to span multi-column ads over reservations.
* Remove empty first pages.
A look ahead could create an extra page. The extra page is now removed at the
end if it is empty.
* Build the sort key conditionally on ad type.
This keeps agate ads sorted by their sort value, and display ads
sorted by their size.
* Added the sort key field to the in-memory ad table.
This allows the sort key to print for debugging and to show on the
* Added a look ahead for banner and display ads
If it looks like a classification will appear on the page, the pagination
engine will try placing some of its non-agate ads early.
* Started code to minimize windows.
This will paginate windows (like service directories) a number of times
to find the smallest required size.
* Optimized code to minimize windows.
After an attempt, find the smallest unused area over the columns and
reduce the next try by at least that amount.
* Improved the banner look ahead scan.
* Added code to level off the first page.
The pagination engine now has a configuration parameter to level off the
first page. It recalculates the pagination using a modified binary
search to find the maximum space that it can reserve at the top without
forcing a new page.
* Added code to generate actual size PostScript output.
You can now generate letter size or actual size output.
* Looked over the manual for the Xitron RIP.
It can accept files from ftp, and it can do color separations.
* Started adding code for leading and cut rules.
* Improved support for leading.
You can specify the amount of leading above and below different types of ads.
* Added column justification by adjusting leading.
It now divides extra space between ads instead of placing it all under the
first single column ad. Larger ads get a larger share of space.
* Added horizontal cut rules.
You can specify which types of ads require horizontal cut rules, whether
the ads require rules above or below them, the rule thickness, and the
* Added vertical cut rules.
You can specify the rule thickness and which types of ads require vertical
* Added a DocumentMedia PostScript comment.
This comment describes the size of the page.
ghostview uses it to scale its preview window.
* Started adding a fast interface to pagform.
This will provide an easy way to preview pages.
* Worked on a fast interface to pagform.
This will provide an easy way to preview pages.
* Improved the arrow key movement on pagform pages.
The response to arrow keys is more predictable. Also, if you arrow key in
one direction and then the other, you now get back where you started.
* Fixed the PostScript proof output.
I increased the margins for the LaserJet and improved the cut rule positioning.
* Added support in pagform to start the multi-page display on a page.
This makes it easier to preview the current page.
* Added color support to the pagform interface.
This makes the color selection more efficient.
* Added an interface for extra user definable description lines in pagform.
This allows pagform to show the classification, the sort key, and other
* Started working on code to import an EPS file
I need this to use the data that Scott copied from Comprint.
* Improved the page dimension parameters for Comprint.
This makes the PostScript output place the ads better.
* Added support for printing PostScript letter size proofs.
It rescales the EPS images to make them the correct size.
* Added support for printing PostScript dummies.
This option draws boxes and does not check for PostScript images.
* Increased the maximum look ahead value.
* Added an agate ad depth threshold value.
Ads larger than the value can be placed out of order like display ads.
* Added a check that a displaced large agate ad gets a classification heading.
display ads and displaced agate ads are kept on a linked list.
After the classification is done, ClassPag scans the list and places headings
* Started working on an algorithm to select the best set of ads to fill a hole.
* Added a fudge factor to the hole filling algorithm to improve its runtime.
If it finds a fit that is close enough, it does not keep searching for a
* Integrated the hole filling algorithm and place the ads it selects.
* Changed the hole filling algorithm to sort the final list in sort order.
* Started working on options to specify which columns require classification
* Added an option to specify which columns require classification headers.
You can specify no extra headers, headers only at the top of the leftmost
column, or headers at the top of every column. For the leftmost option,
if the first page is not full, the header goes on the leftmost used column.
* Added an option to specify whether display ads require classification headers.
* Fixed a test in the paginate.frm formula to handle dynamically added pages.
* Improved the test to check that display ads have headers.
Sometimes the last batch of display ads placed wouldn't get headers.
* Added comments to reservation blocks.
The comments show on the postscript output to indicate what belongs in
* Added code to track the first and last column used by each class.
The routine that creates an index will need this information.
* Added a filter to text strings written to postscript files.
The filter escapes characters with special meanings to prevent user-entered
text from causing postscript errors.
* Added a way to change the debug level without leaving the formula.
The support picklist now has a hidden entry to open a debug level picklist.
* Fixed the logic to flatten the first page.
A change from last week broke it.
* Removed some debug code to make the logs smaller.
* Added comments to the automatically generated reservation blocks.
* Started working on a command to preview the image of an ad.
* Changed the filler maintenance picklist to sort ads by size.
* Added a way to view the images of ads.
I added a pagination menu entry to show a picklist of ads. When you select
an ad, ClassPag generates the postscript for the ad and runs ghostscript.
It automatically scales the ad as large as possible to fit on the screen.
* Increased section names from one character to ten.
* Added a pagination menu option to display the ClassPag version.
* Added a pagination menu option to set the debug level.
* Started working on an option to allow spanned ads.
* Reorganized the pagination menu.
I moved the more frequently used options first.
* Changed the menus to make "debug" last and "version" second last.
This makes the debug option less visible.
* Added the reservation message to the box display window for reserve blocks.
* Added the section name to the folio on PostScript output.
This makes the pages easier to identify.
* Added the section name to the pagform preview display.
* Fixed a test that could place a class header for the internal filler class.
It now uses the header for the classification of the first non-filler ad
in the column.
* Started converting El Pais data.
I extracted the ad number, size and classification.
* Started adding a pass values interface to pagform.
This will allow the pagform edit box formula to access to cpag databases.
* Did more work on the El Pais interface.
It uses report writer to convert one of their dumps into a sort file.
* Did more work on the interface to pagform.
This will allow an ad image preview from the page preview display.
* Fixed a bug in pagform where it could overwrite a window title buffer.
* Added a pagform user_pass_values routine.
This allows formulas run by pagform to access variables in ClassPag.
* Added support to display the ad image preview from the page preview display.
This uses the new interface between pagform and ClassPag.
* Added support for empty section names.
El Pais just uses plain numbers on their classified section.
* Reread the section name when restarting pagination.
* Created a user-definable unit measurement database.
The database has the unit name, abbreviation, and size in centi-points.
* Wrote formulas to convert between unit measures.
* Added extra fields on the config screen to hold unconverted heights.
When you enter a value, a formula writes the centi-points value into
* Changed some of the displays to show the user-selected units.
El Pais uses centimeters.
* Talked with Sam at Xitron.
They will send us the Navigator technical reference manual.
He thinks that we can configure a second spool area for separations
and that we can read their log files to find out if a page printed.
* Added editmasks to the unit measurement database
This improves the formatting for units that need decimal places.
* Added an administration screen for the units measurement database.
This makes it easier to add new units.
* Improved the squeeze needed calculation.
It did not account for house ads with multiple insertion requests.
* Started work on positioning ads from the preview screen.
* Did more work on positioning ads from the preview screen.
* Added a pagform ExecuteCommand formula hook
pagform calls this formula when the user requests a command.
* Added a pagform PagformCommand variable
This variable contains a command for the ExecuteCommand formula.
* Added a pagform SelectedBox variable.
This variable contains the target of a position command.
* Added a pagform PagformDebug variable.
This variable contains the pagform debug level.
I also added a formula picklist to set it.
* Added a ClassPag CPagUnflowAgateAds variable.
Setting this variable removes all of the agate ads.
* Added ClassPag CPagSelectedAd, CPagCurrentAd, CPagCurrentPage, and
The ExecuteCommand formula will use these variables to pass the
command it received from pagform to ClassPag.
* Added initial allocations to some of the databases.
This should make writes run faster by keeping the database files less
* Continued work on implementing manual positioning of ads.
* Added pagform variables for tracking the mouse.
pagform now exports the variables MOUSEPOSX, MOUSEPOSY, MOUSEBUTTONS and
* Added a pagform HandleMouse formula hook.
pagform calls this formula when the user presses a mouse button.
The formula has access to the MOUSExxx variables.
* Added a ClassPag COMMANDOK formula variable.
This variable tells whether the last command ran successfully.
* Added ClassPag CPAGCURRENTPOSX and CPAGCURRENTPOSY variables.
These variables let a formula specify a target location on the page.
The HandleMouse formula can set these based on the MOUSExxx
variables before sending a command request to ClassPag.
* Added support in ClassPag and pagform to show the user selected units.
pagform used to display measures only in points.
* Used the high end of the ad array for holding position requests.
This allows ClassPag to keep the position requests in memory while
re-reading the house ads during pagination runs.
* Added ClassPag hooks for controlling the flow of position information.
As needed, ClassPag stores the requests in a request database file,
a table in memory, in the ad records in memory, and in an
image location field in the ad records. Assignments to the variables
below cause ClassPag to copy requests from one area to another.
CPAGCLEARREQUESTS clears the file;
CPAGREADREQUESTS reads the file into the table;
CPAGLOADREQUESTS copies the table into the ads;
CPAGPLACEREQUESTS copies the ads into the image area;
CPAGSAVEREQUESTS copies the image area into the ads;
CPAGSTOREREQUESTS copies the ads into the table, and
CPAGWRITEREQUESTS writes the table into the file.
* Changed ClassPag so it does not place fillers under manually positioned ads.
* Position requests now show in the pagform box information window.
* Added ClassPag variables to tell when the position information is valid.
* Added CPAGREQUESTTABLEVALID and CPAGREQUESTFILEVALID variables.
ClassPag and the pagination formulas use these to determine when the
position requests must be written to or read from the database.
This way, ClassPag only writes the information to a file the first time
a formula requests to view it in a pick list, and it only re-reads the file
if the formula indicates that the user has changed a record. Since there
may be several hundred records, it is important to optimize their handling.
* Fixed pagform to restore the selected ad when it re-reads a page.
pagform maintained a pointer to the currently selected ad and did
not try to relocate the ad after re-reading a page.
* Wrote a program to read DBF files.
I figured out how to read the DBF files that El Pais keeps sending and made
a new program called dumpdbf that can read DBF format files.
* Removed the paginate / one pass / estimation run window.
This was left over from the design based on the COBOL program.
My full pagination run can do everything the other options can.
* Removed the squeeze pagination option.
In the COBOL program, the spread and squeeze options
opened slightly different windows.
I combined all of the information in one window, so my spread and
squeeze options always did the same thing.
* Reorganized the configuration setup window.
It is now bigger and shows the units setup option on the first page.
* Started working on PostScript output.
I am adding hooks in ClassPag to allow formulas to open spreads and
to control the placement of pages on the spreads.
* Did more work on generating PostScript output.
I added hooks to set the file name, open and close the specified file, open
and close multi-page spreads, define the paper size,
define the page image size, define the page image location, and then select
the page to write in the defined area.
* Fixed the PostScript output to clip the slug and the text inside boxes.
* Added a paper size database.
Each entry specifies a possible output paper size, including the PostScript
name and the dimensions.
* Added a spread database.
Each entry specifies rules for positioning pages images on multi-page
spreads. The entries contain margins for page boxes, even and odd
margins for page images within the boxes, horizontal and vertical
margins, gutter margins between tab spreads, and scale factors.
A formula combines all of the values to compute the page image sizes
and locations. It then uses the ClassPag hooks to draw the page.
* Added maintenance formulas for the spread and paper databases.
* Looked over a sheet with a description of the El Pais liner styles.
It is close to what we need to write formats but has terms in places
where we need numbers. For example, some styles have the term "Ancho"
(wide) for letter spacing. I gave Larry a list of questions.
* Did more work on generating PostScript output.
I added hooks to set whether ClassPag outlines the page with a box
or shows a page slug.
* Added a ClassPag CPagPostscriptBlob variable
ClassPag includes the contents of this variable in the PostScript image of the
current page. The pagination formula can use this variable to include
templates and folios.
* Added support for PostScript Landscape paper orientation.
* Reorganized the "page" window.
It now shows the print status and selection flag of each page.
The list of commands is now to the right of the window and stays open.
* Improved control over selecting pages to print.
You can select (or unselect) the current page, color pages, all pages,
unprinted pages, and pages not printed since the last pagination pass.
* Added an option to view the print log.
* Added an option to preview PostScript page output before printing it.
* Added a lock database to prevent multi-user interference.
* Improved the ClassPag startup scripts.
The main script can now function as a login profile.
The script now removes some scratch files when it is finished.
* Added an option to suppress class headers for empty classifications.
* Added an image replacement database.
The database contains updated size, color and image location for ads.
This will allow someone to change ad information at the last minute without
rebuilding a new interface file or repaginating.
I changed the formula function for finding ad colors to check the image
replacement database before looking up the ad.
The ad information window in the page preview now shows the current image
file name of the ad.
* Improved the page printing interface.
The ClassPag print page function now returns a success code in
CpagCommandOK. The print page formula checks the variable and
displays a message if some pages didn't print correctly.
* Improved the ClassPag PostScript output routine.
It can now handle margins of "0", and it no longer messes up the
trailer on consecutive runs.
* Improved the descriptive size to centi-points conversion formula.
It no longer updates the centi-points field if the descriptive size
hasn't changed. This keeps numbers from changing when you hit
<RETURN> on the configure screen.
* Improved the export formula.
All the files are now local instead of in the global formula initial, so they
get closed when the formula finishes. The formula now uses file variables
instead of record variables to save the interpreter from doing extra copies.
The formula writes the page number instead of the page index in the ad page
* Changed all column positions to two digits.
Different formulas used two, three and even four digit column numbers.
I set them all to two digits to save room in some windows.
Layout only handles 20 columns, and Charles said that Pongrass only
handles 15 columns, so two digits should be enough.
* Improved the handling of unplaced agate and display ads.
Color restrictions can prevent ClassPag from placing ads.
ClassPag now writes unplaced ads into the ClassPag file under
page zero. I added an option to view these ads.
Also, the pagination formula now checks for these ads.
It reports them on the Statistics screen and places them in the
table of unplaced ads along with unplaced house ads.
The formula procedure to show ad descriptions used to be called only
with house ads. I changed it to handle agate and display ads.
* Added a ClassPag CPagCurrentAdType variable.
It returns the ad type of the currently selected ad.
The formulas need the ad type to uniquely identify an ad.
* Improved support for last minute ad changes.
ClassPag and pagform now rebuild the page information when the
image replacement database has changed. This allows them to show
the new box information and postscript images correctly. The image
den screen now validates the image file name.
In the sorted ad list window, you can no longer change the image
of the special group header ad.
* Changed some formulas to hide the den menu bar.
* Started work on reading the El Pais interface files.
I wrote programs to load their ad lines file and their ad manifest into
databases and then a formula to cross-reference them. The ad lists did
not match, and the classification information was completely different.
* Started work on converting El Pais ads into EPS.
I started changing AdClass formulas that Scott gave me to run CompSet.
* Switched to the devel version of spice.
* Discovered that formula truncates blobs at the first null.
This was causing it to zap blobs with PCC codes.
* Discovered that formula does not pass var parameters to the
* Made some screen labels more accurate.
I changed "Half Page Info" to "Page Reservations" and
some "Groups" to "Class".
* Wrote a program to read the El Pais enviar.dbf ad manifest.
This contains their agate and display ads sorted by ad number.
* Wrote a program to read the El Pais Nxxxxmmdd.txt ad text files.
These are the files that they send to PageMaker.
* Wrote a formula to convert their ad text into PCC.
* Wrote a script to convert the PCC into PostScript.
* Added code to convert El Pais files from IBM Extended Ascii to ISO.
* Start working on code to read the El Pais classification database.
I added special ad names for classification headers to the classsrt.out sort
file. These ads have the parent class and the class order in the description
area. This will allow ClassPag to handle nested classifications.
* Worked with Bob Cole to help him with his formula to create the index.
I created an outcls database that contains a page number and sequence value
for each classification. I added a CpagWriteClassOutput variable to request
writing the file, and a CpagClassOutputValid flag that tells if the current
file is up to date.
* Added more fields into the sort interface file class header records.
I added the depth and total depth and flags to select the class, include
ads from the parent, write to the index, and start on a new page.
* Improved the script to restore the terminal when ClassPag is aborted.
It now also removes scan code mode.
* Removed all instances of Select(True).
* Changed NN fields to II.
* Changed ClassPag to use the column justification configuration value.
* Restructured the directories to allow multiple users.
The easiest way to make the second book start on a new page was to set up
cpag to do a different run for each book. This also eliminates the need
to tag house ads with section numbers, to display section specific spread
and squeeze values, and to keep ads from migrating between sections.
I used the new classification select flag to specify which classifications
to include in the run.
* Added a class name database.
This allows the section selection formula to display classification names.
There is no room to pass class names in the sort file, and there
is no need, since they never change. I wrote a formula to enter the
records from their classification dump file.
* Added a pagform REDRAWPAGE variable to force a page recalculation.
* Added test code to convert multi-column classification headers into banners.
The pagination routines depend on having single column headers.
* Added shell escapes into two menus in the pagination formulas.
* Added a page name database.
This database maps special page names into a range of pages.
Display ads that request one of these special page names should be placed
within the page range.
* Added access to the page name database from the pagination setup screen.
* Fixed a bug in pagform where it could overwrite fields in page and ad keys.
* Started working on a book size database for calculating tab spreads.
* Added a minimum space agate threshold.
If there is less than this much space in a column, cpag will not flow in any
* Added procedure to prevent placing agates, display ads or house ads on a page.
The restriction information is kept in the same database as the color
requests and can be changed before each run.
* Removed color page requests with no effect.
If a color page request record has all default values, the pagination
formula removes it. Since cpag must reread this database before every
pagination run, it is important to control the number of records it has.
* Improved consistency in the pagination formula color window.
When you change the color information, the restriction information or
the reservations for a page, you now return to the color window which
has the side effect of updating it with the current values.
* Added configuration options for creating test classification headings.
This was debug code that was originally hard coded. This allows me to
use it for my test product, but have it off for El Pais. I also added
an option for setting the header depth.
* Made fields that hold depth values more consistent.
The free format text field is now a 12 character Alpha field, and the
paired numeric centipoints field is now a 12 character Real field.
* Added a free format text depth field to the image replacement database.
* Added a product key to the image replacement database.
* Fixed a problem with manual ad positioning.
When a position attempt fails, cpag restores the original position instead
of removing the ad.
* When scanning for EPS files, cpag tries with and without an EPS extension.
* Treat El Pais ads with ad type "4" as agate ads.
I was making them into display ads and losing the text.
* Added a warning before a position command that would unflow the agate ads.
* Changed the setup script to set the mouse speed.
* Fixed preview and printing code to handle external ads.
This code was never run before because I didn't have data to test it.
I still need to make it undefine the showpage operator.
* Started integrating Bob Cole's index generation formula.
* On the single page preview display, the right mouse button opens a
* Made names for string and numeric constants and moved them to cconst.ifm.
This reduced the number of strings literals, which will make it easier
to translate into Spanish. Most windows now use constants for their location,
so it is easier to shift windows around without creating lots of overlaps.
* Made a formula function to run makerecs.
This removed a number of places that had to build shell command lines.
* Improved EPS support.
ClassPag now uses save/restore instead of gsave/grestore so
EPS files can not mess up dictionaries. ClassPag also undefines
showpage and sets the line style parameters to their defaults so PageMaker
files do not print extra pages. I added code to parse the BoundingBox because
our composition creates ads below position 0, while PageMaker creates ads above
position 0. ClassPag must generate a translate command based on which program
made the ad.
* Changed the import procedure so the page estimate includes nested classes.
* Changed ClassPag to look for and use position requests in banner ads.
* Improved the readtxt program that reads the El Pais line ad dump.
It now converts tabs to width leader commands (to draw dots) and
adds quad codes to preserve line breaks.
* Fixed problems with duplicated and missing headers.
Gonzalo changed the format of the ad line files so the classification
headers include a classification number. I changed the import procedures
to handle the changes. I eliminated the second pass over the ad line
files and references to the database created during that pass.
* Added a CPagRetryImages variable.
Setting this variable tells ClassPag to retry EPS files that were missing
on an earlier run.
* Improved ad positioning.
ClassPag now has a paste window. You can now use the mouse to move ads into
the paste area and then to select them and place them on another page.
Also, you can now position ads from the top or the bottom of the page,
and you can lock the page when all the ads are positioned.
ClassPag will not move positioned ads, and it will not place display
ads on locked pages.
* Improved automatic display ad placement.
ClassPag now uses the "sizeof: ordering function from Layout.
that combines the ad width with a hyperbolic function based on the ad height.
* Changed the page preview so you can select and print pages from it.
You can now select pages from the multiple page preview and then print
them from a menu on the single page preview.
* Implemented the "paGe: button on the single page preview screen.
It now generates a postscript image of the page and views it with ghostscript.
* Added a way to find ads.
I added a CPagPlacedPage variable that returns the page number of
the current ad.
I added an option to the sorted ad list window that uses this variable
to show the page where the ad is placed.
I added another option to set a prefix string for the ad number to make
it easier to find an ad in the list.
* Added a CPagCurrentPageNum variable to ClassPag.
This variable returns the page number of the string in the CPagCurrentPage
variable. The formulas now use the CPagCurrentPage variable to keep track
of the current page (because formulas can not pass arguments) and to let
ClassPag help them parse page names returned by pagform,
* Added a PagFormHideWins variable to pagform.
This variable lets a formula tell pagform to hide or restore
the graphic preview windows. Since the window routines do not support
painting over part of a graphics area, the formulas need a way to have
pagform hide these windows when they want more room on the screen.
* The page preview box information window now shows the ad position.
* The multi-page preview now shows all of the pages.
It used to show only pages with ads.
* Fixed problems with the multi-page display on overflow pages.
The negative page numbers used to cause these pages to be placed in the
wrong order. Also, commands to position ads would sometimes get confused.
* Worked around 4 character box number limitation in SAGE.
The SAGE database can only handle 9999 boxes, while El Pais
has over twice that many ads. ClassPag now places the ad index mod
10,000 into the SAGE insertion field.
* Improved the rules for defining ad colors on page preview displays.
I added record types to assign different colors to locked ads and to ads
with position requests. I added a maintenance formula and made an entry
on the configuration menu. I added formulas to list and validate the
numeric codes for ad types and screen colors.
* Added a configuration menu option to run the format maintenance formula.
* Changed the compread.sh script so it checks for "cc" before running it.
deptwo at El Pais does not have a development system.
* Changed the interface scripts to use "$TOOLS".
* Added more entries to the control database.
This keeps it from asking for a product every time I install a new version.
* Check sizes against the EPS Bounding Box.
The PostScript output now uses the information in the
BoundingBox comment to position display ads on the page.
If the ad image is larger than the size passed in the interface file,
ClassPag shrinks the ad to make it fit.
* Added an image check window.
This window builds a list of ads with missing EPS files and with ads
with EPS images larger than the size passed in the interface file.
I added an image size tolerance configuration parameter. Ads must be
larger than the tolerance to be included in the list.
I also added menu options to rescan the EPS files.
* Convert liners with no text into one column display ads.
The display ads that come first or last in a classification sometimes
are marked as liner ads in enviar.dbf.
* Treat each CABE line as a separate ad.
I had combined them when Gonzalo was here. I reverted to splitting
them in order to get the correct leading between each group header and the
first classification header below it.
* Added a configuration vertical position adjust parameter.
This allows ClassPag to shift agate ads. I selected a value that
removes the extra space between cut rules and the first line of agate ads.
* Added a double size print option.
This is useful when examining details about the output.
* Added a version number string to the title in the main screen.
This will help identify the weekly releases.
* Made a test page for BC to help him generate the folios.
I made a scaled page with a comment where to put the folio EPS
and then showed him how to view the page with ghostscript.
* Changed the PostScriptBlob variable for use with folios.
ClassPag used to print the data in this variable whenever it was
assigned. It now holds the data until it prints a page.
Inside the page, it generates a save sequence, the same as
when including an EPS ad, then it dumps the data, and then
it generates a restore sequence.
* Developed a page fit calculation
I didn't want to use the one from Layout because it was designed
for papers with 9 columns of news and 6 columns of ads and not for filling
pages. Also, some of the Layout calculations are more complicated
then necessary to avoid using real numbers. My new calculation finds the
region of the page with the pyramid and calculates a least squares linear fit
using the heights at the center of each column. I used the tangent subtraction
identity to compute difference of the slope of the line and a goal slope
based on the estimated percentage of the page that will be used.
* Added a classification size estimate.
The dummying routines depend on an estimate pass. On the first run,
ClassPag estimates locations based on ad areas.
* Changed the setup script for El Pais.
For some reason, normal users can not run uuname.
I changed my setup script to try uname when uuname fails.
* Made a tape update script.
I had Jose use this script to apply the Version 1.1 update.
All you have to do is put the tape in the drive and type one command
to run the script.
* Improved the printer configuration.
I increased the margins to make more room for the folios.
I added an entry for A4 size paper.
* Started adding display ad dummying.
ClassPag remembers the page ranges for each classification after each run.
Before the next run, it places the display ads for each class within the
pages that the class used during the previous run.
The configuration screen has options to specify pyramid left and right styles
on left and right pages, to place larger ads in the back, and to favor left or
right pages. There is also a pyramid overhang value to allow ads to stick up
a little in the wrong direction. The display ad look ahead value is now used
while searching for display ads to fill pages.
* Added a placement reason field.
The "Box Information" window now shows why ClassPag placed that
ad in its position. The reasons are "No" if the ad isn't positioned,
"Auto" if the ad was placed while flowing liners,
"Page Request" if the ad was placed to satisfy a page request,
"Page Name" if the ad was placed to satisfy a page name request,
"Dummied if the ad was dummied according to a pyramid style, and
"Manual" if the ad was positioned with the mouse.
* Created a printer database.
This database converts a printer name and a node name into a print command line.
It allows ClassPag to handle printers that have different names on different
* Started changing the colors on some screens.
This will make some windows easier to find.
* Improved some of the screen files.
I removed a key from the adcls2 and adtext interface databases
because it was no longer needed. I increased the number of records
in several databases from 500 to 5000. This should make the
interface step slightly faster.
* Made a new directory structure.
I wrote a script to move the files from the main directory into
a data directory and into subdirectories of src and exe.
I had to change a number of shell scripts and a few formulas
for the new directories.
* Worked on the new page requests for special pages.
ClassPag uses the page estimate to position the special pages.
When cpag is positioning ads on a special page, it sets both the
pyramid left and pyramid right flags to allow more ad
combinations. For each special page, cpag gathers all of the ads from
each classification that requested the page and sorts them by size.
The new classification scheme allows ads from different classifications
to request the same page. Since the ads in each classification are sorted,
the previous version did not require an extra sort pass.
I noticed that some ads requested being placed on top of themselves.
I added debug warnings to flag these ads.
* Replaced more string literals with constants in the formulas.
I took another pass over the formulas and pulled out some more strings.
This should make them easier to translate.
* Handles the new classification structure.
The interface procedures and the pagination program now handle
the new 98## classifications.
* Captures new position information.
The interface procedures now capture the new position information.
This includes the CABEZA, PIE, CABEZA, CABDER, CABIZQ, PIEDER, PIEIZQ,
ARRIBA, ABAJO and FRENTE values in the NUMTARJETA field and the new
CAB### value in the ORDEN field.
* Started adding page request code.
The pagination program tries to place ads with P/### numeric page
requests on the page that they request. The pagination program also
handles special pages like "Consulte a los especialistas" by placing
the ads that request that page together on those pages.
* Revised the installation procedures.
The archives on the distribution tape are now compressed to save space
and they also include data directories
* Improved the Box Information display.
It shows more page request information. I changed the names of the request
fields so they are unique to the number of characters that fit in the window
and eliminated a line with duplicate position information.
* Merged in Bill Eben's changes for Reflection-4.
The change scales the PostScript so a letter size page fits on the screen.
Gene noticed the problem, and I had given him instructions to fix it as a
simple first project, but Bill ended up doing it.
* Created a run statistics history database.
Kurt thought this would be useful for producing reports for El Pais.
* Added fields to the control database.
The section name and page ranges used to come from the config database,
which has one record per product. I moved them to the control database,
which has one record per user. This keeps multiple users in the same product
from interfering with each other. ClassPag still updates the values in the
config database, and uses them to set the values in your control record when
you switch to a new product. I also added a rundate field to the databases.
The statistics history database uses the rundate as a key,
so it can story values from several runs.
The folio code will also be able to use the rundate.
* Added an ad type for leading.
This allows the formulas to capture the leading and save it in the
statistics history file.
* Improved the interface procedures.
It now handles the El Pais 9833 group correctly. This group contains
selected classification at the end of a section. It is the only group that
does not contain a whole section, and I had to change the interface
procedures to handle it specially.
* The makeeps.sh script no longer deletes the work files if it didn't
run so you can now try to re-run it.
* Changed the formulas to show commands that it can not execute.
This helps debug why the command did not run.
* Changed the setup menu.
I put the "return to main menu" option last so it is easier to find.
* Improved the display of page requests.
The Box Information window on the page display shows more page request
* Improved the handling of page number requests.
Ads with P/#P and P/#I requests for the #'th
even or odd page in the main classification should be placed on the
correct page as long as there is enough room.
* Improved handling of page position requests.
Ads with ARRIBA, ABAJO and FRENTE values in the NUMTARJETA field should be
placed over, under or facing the ad that they request as long as there is room.
* Start adding banners for special page requests.
On the banner setup screen, there is a new type of banner called
a "REQUEST HEADER" and a new "Request Name" field.
You can enter a banner for each width.
The banners will be used as needed on special pages.
On the page displays, the banners show as magenta with a green border.
* Added special page names to the "Page Information" window.
The "Page Information" window in the single and multiple page
preview displays now shows if any special groups are assigned to that page.
It also now shows the section name.
* Improved the interface procedure for reading new data.
The mapclass.sh script now has options to run makeall.sh and makeeps.sh.
It also has a new option to check if the SCS Composition Engine is running.
After generating the PCC file, it prints a warning if there were more errors
than expected. The interface procedures use the new CLASDES field in
CLASIER.DBF to assign each classification into the correct Main Classification.
* Improved detection ads with unsatisfied position requests.
Ads with unsatisfied requests now display in red so they stand out.
The "Box Information" window on the single page preview display shows
conflicts with a star in front of position flags that were not satisfied.
It also shows a question mark in front of target ad numbers if the target ad
does not exist, otherwise it shows the page where the target ad was placed.
If the ad requested a page number or a special page, it shows the computed
page number after the request name.
* Re-added a paper type for A4 paper.
This change was lost during an update.
* Improved support for placing an ad over parts of two different ads.
The "span gap" configuration parameter tells how much of a height difference
* Added support for CABEZA requests for the top of a page.
* Added support to log crashes.
Gonzalo has reported that the program sometimes crashes. I added commands
inside the runcpag.sh file to check for crashes and log them.
* Added a call to the index creation formula.
The pagination options menu has a "Create index EPS" option that runs a
procedure to build the EPS image of the index with page numbers matching
the current run.
* Added support for display ads that request the first position in a class.
I created a new type of display ad that is placed under the classification
header. They show as green with cyan borders on the screen.
This ad type handles ads with the CAB### request.
* Added support for floating multi-floating ads.
ClassPag can now float multi-columns ads,
can now float any ads under classification banners, and
can now adjust the leading around ads that it can not float.
These changes produce better looking pages by reducing the number
large gaps at the top of columns.
* Allow letters in ad numbers in the El Pais interface.
* Added support for creating, changing and deleting ads.
The command key menu on the sorted ads window in the
spread menu has new choices to create, edit or delete ads.
These options will help work around entry errors in the enviar.dbf file.
* Added support for the graphic logos at the top of the 8 main
classifications of the El Pais interface.
* Added support for folios using a procedure by Bob Cole.
The pagination options menu has an option to create the folio images.
After you create the folios for an edition, the PostScript page
output routine automatically places them on the pages.
added a check to folioeps.frm if the exec fails.
added a max display ad fill percentage configuration parameter.
added a print option for full size with no display ad eps images
improved the page area estimation to account for classification headings.
added automatic banner placement after moving banner ads with a mouse.
added a print variable that returns the number of missing eps images.
added a support for automatic placement of multi-column fillers.
added support for double truck placement requests.
eliminated the boxes on the right part of double truck ads.
treat display ads with image of NONE like the right half of double truck ads.
changed the single page display to show the parent classification.
reduce the saved page range of a banner section if empty pages.
added support to create a report of ads with missing eps.
entered CooperBlack into the gs Fontmap so the banners look correct.
added a SELCONF ad context to indicate when the selected ad has a conflict.
changed the single page preview so the delete key unpositions the current ad.
changed the single page preview so the insert key opens the paste window.
merged in Jose's Spanish den screens.
changed the distribution script to include the directory of Spanish screens.
changed the page information window to show the ad restriction flags.
fixed the manual positioning so you can not select an agate ad.
added support to create a report of ads with position conflicts.
changed the ad paste list to sort by size.
created a new color for display fillers.
added support to create a report of eps images with incorrect image sizes.
added a pyramid angle configuration parameter.
added a per-classification flag to place display ads first, last or mixed.
made a /u/logos directory for the logo eps images.
made a /u/banners directory for the banner eps images.
added the dummying style flags to the page information window.
fixed a bug that would not keep a list of pages sorted by available area.
changed the page output to ignore obviously bad eps files.
fixed a bug that miscalculated ad numbers and broke the ad preview option.
reduced the agate leading configuration parameter to match their output.
increased the header leading configuration parameter.
remove the "done" option from the pagination menu.
downloaded a new version of makerecs that I forgot to put on the tape.
fixed a bug that would let the first position command select a filler.
added ps code to disable showpage when previewing an ad image.
added extra closefile calls in mapclass before makerecs.
added an active flag to configuration records so old ones do not show.
added an ad restriction flag to prevent placing fillers on a page.
removed banners and headers from the house ad totals in the pagination summary.
changed the page information window to show the first and last class.
added an option to lock all display ads.
added support for pasting in house ads.
changed a pagform button from "Edit" to "View".
decreased the margin so odd pages can print on legal size paper.
reduced the agate ad leading parameter again.
decreased the Unix MAXUMEM kernel parameter from 8192 to 6144.
added the banner page name to the ad conflict report.
fixed the edit option in the ad conflict report.
added leading between display ads.
added a print option to the single page "paGe" button.
read the NewGen printer manual and discovered that it supported remote printing.
ran "mkdev rlp" to add support for the remote printer protocol.
configured the /etc/printcap remote printer file to support the NewGen.
added support for saving the current display ad positions to disk.
changed the column filling to steal agates from the previous column.
changed the ps output to set a job number to the %%Title DSC.
changed the ps output to include a %%XPageSetup line for Xitron.
changed the ps output to load the statusdict jobname variable for Xitron.
fixed the ps output to include the correct size in the statusdict setpage var.
improved the value in the %%DocumentPaperSize DSC.
fixed control.ifm to create a new record the first time on a new terminal.
changed the ps output to limit the font size in ad boxes with missing images.
fixed the ps output to avoid creating an empty %%XPageSetup line.
undid a change to shrink ad boxes for missing images.
changed the banner clone routine to reset the classification number.
added support to make a 1 pt rule 2 mm above the page.
removed extra calls to a routine to find the model of cloned ads.
changed the option to restore position requests to make the default yes.
fixed the position storing routine to set the ad depth.
changed the ps output for ad boxes to show the size in cm instead of points.
added a parameter to float display ads at the top of a page.
changed the ps output for ad boxes to draw the box with a hairline.
changed the display house ad picklist to sort by ad name.
added support for a Clipper P/C page request for centered (double truck) ads.
added support for a Clipper P/B page request for the back page.
changed the ps output to place vertical cut rules by in column display ads.
fixed the ps to use pre-scaled translation values for mis-sized display ads.
removed code to map class names of banner ads to a rubro.
changed the position routine to recognize when all banners ads are removed.
added a print option to place each page in a separate file.
added a time delay to the print option to avoid filling up the disk.
* Added front to back pagination.
This should make the front page look better.
You can set the pagination direction from the configuration database
or from the "Set the pag direction" pagination menu entry.
* Added a way to change the leading between pagination passes.
The "Change the leading" pagination menu entry lets you change the
leading from 0% to 999% of the current value. It shows a window that
calculates about how much of a page a 1% leading change will use.
You can adjust the leading to make the edition slightly smaller or larger
if it comes out close to a page boundary. It affects all ads if you
shrink the leading, but only liners if you increase the leading so
banner pages still fit.
* Allow other ads on pages with small banner sections.
This makes the edition tighter.
* Added detection of moved banner sections.
When you remove all of the ads from a banner page and then place one of
the ads on a different page, ClassPag updates the location of the
banner section. Also, when you save the ad positions and then restore,
ClassPag also restores the location of the banner pages.
* Banner sections now overflow towards the back instead of the front.
* Improved banner section positioning.
Banner sections now take the first available page.
I added a configuration parameter to specify whether ClassPag should
place banner pages towards the front or back of the section.
* Added a way to view the location assigned to banner pages and other requests.
The "View named pages" menu option shows a list of all banner pages
and special page requests sorted by page number. You can hit RETURN
to jump to a single page preview of the page.
* Improved position degrading.
If a page is over-sold, ClassPag attempts to place the extra ads as close
as possible to their requested page.
* Reduced the number of one column holes.
ClassPag now tries to avoid creating one column holes, and when it does
make them, it tries to fill them with one column ads.
* Improved the sorted ad list window.
When you find an ad, the command key menu now has an option to go to the
single page preview for the page containing the ad.
* Improved feedback when saving and restoring ad positions.
The save and restore steps now show how many ads they found.
* Added a separate database for liner ads with no special requests.
Line ads need only about one third of the fields of display ads.
Putting them in a separate database makes the ClassPag "Import Ads" step and
the initial Paginate step to read the ads run about twice as fast. The spread
window now has separate options to view Display Ads and Agate Ads.
* Added support for CorelDRAW ads.
CorelDRAW has an option to add a header and a trailer when it writes an ad as
PostScript. ClassPag now automatically recognizes CorelDRAW ads and strips
the header and trailer.
* Single column ads.
I made some more changes to reduce the number of single column ads placed
on 8 column ads.
* Banner page filling.
I started working on changing the page filling logic.
I am working on doing it completely differently, and I saw a change I could
put in the current version, but I'm not sure if the changes helped.
* Started working on a better page filling algorithm.
* Added a new page filling procedure.
The box filling code is in a stand-alone module, so other programs could
use it, if we ever have another program that needs it.
I have routines for one dimensional and two dimensional fits.
The two dimensional fit works by taking the largest box and using a
recursive rectangle packing algorithm to pack a strip of that size.
It then uses the one dimensional fit to pack the strips onto pages.
When building a page, it uses the strips in order by their widest ad,
and places strips reversed to avoid building up one side of the page
higher than the other.
After it builds a page, it lets the ads drop to the bottom, and then
checks if any strips can fit in the space at the top.
Since the packing has some first-fit steps, it is sensitive to the calculation
of ad sizes. ClassPag calculates a fit using a depth first size
function, the hyperbolic size function that I use in Layout, and an
area size function.
ClassPag does the calculations only once during the first pagination pass.
Later passes just place the ads from the saved positions.
Using the precalculation makes later pagination runs faster and eliminates
problems allocating unexpected overflow pages.
* Banner page filling.
I added a new backtracking procedure to fill banner pages.
It should pack the banner pages much more tightly than before.
The procedure runs once for each banner section before placing any ads,
so the pagination process knows how many pages each banner section will need.
This eliminates problems when banner sections would require more overflow
* Banner placement.
If the space over a banner is less than the "banner gap" parameter, the ads
under the banner are floated to move the banner to the top of the page.
* Improved the estimation pass.
It now knows which classifications are first and last in the section
and makes sure that they come out correctly. For example, the ads
requesting the front page should be placed there even on the first run.
* Changed the pyramid ad stacking.
I made a few small changes in the way it decides how to stack ads.
It should be more sensitive to the setting of the "pyramid angle"
parameter, and it should make better looking pyramids now.
* Improved display ad placement in classifications.
It keeps better track of where each classification starts and ends and
tries to keep display ads in their classification.
Ads out of classification now show as conflicts.
The conflict window and the ad image window from the main pagination menu
now have options to show the page of the current ad and to go to that page.
* Tuned banner page filling.
It does the calculations without leading, and then adds leading by floating
the ads after building the page. This allows it to pack two 5 cm ads
next to a 10 cm ad.
When it places multi-column ads, it checks if they can sink below other
ads in the column. This makes the packing better and eliminates some
instances of wide ads on skinny ads, which El Pais does not like.
* Changed some den fields from "IIIII..." to "NNNNN.....".
* Added a flag whether house ads have been changed.
ClassPag needs to build the list of house ads before each pagination run.
The pagination formula now tracks whether the house ads have been changed,
so cpag knows whether it has to re-read them. This makes the pagination
run slightly faster because it eliminates about 100 database accesses.
* Changed the page filling logic.
After it is finished, it tries to take ads from the top right of the
last page and squeeze them on to earlier pages.
* Wrote up the interfacing format.
automatically place banners on the front of the second book
banners can make requests for a page from the front of the paper or
from the front or back of the current section
correctly calculate the center page number for the second book
do not place a horizontal rule over banners
added page requests for the pages before and after the center
the internals can handle requests for the Nth page before or after
the center or the beginning or the end of the current book, but there is
currently no way to pass these requests in the sort file
do not print a folio on the first page of the second book
the formula that returns the eps for the folio now has additional
parameters for the first and last page number of the book, so it can
handle these pages specially
added display only descriptive height fields to the realad and realag files
this makes it easier to correct ad entry errors
shift the remates logo to the left
I made the remates (legal services) section a service directory without
a banner. it is a limiting case of flowing ads, because the only flowable
ad is the logo. the ads flow back to front, so the logo could end up on
the rightmost column where it fit. I added a special test to pick a better
position if there is only one flowable ad.
improved the banner page combining code when an entry is unused
copied X and Y offset changes BC made to the folio parameters
added the center page requests to the "View named page output"
if the ads in the banner section form an "L", place a smaller banner
they do this sometimes. it makes the banner section more compact
and can eliminate the need for fillers
place a full width banner on interior banner pages
if the page only allows ads from the banner section, it should have a full
clearing a number on the page name screen clears the value in cpag
cpag must usually remember the page ranges of each banner section.
it now has an interface variable that tells it that it can recalculate
the pages for a given section
improved the conflict test for bumped pages
if a page request is bumped, and then if you use the mouse to move the
ad to its originally requested page, the ad no longer shows as a conflict
improved the conflict test for ads under liners
cpag now shows a conflict if all of the liners above an ad belong to
another classification. this test is in addition to the other test
for the classifications on the page, and only works until you unflow
made it easier to assign pages to banner sections
the starting and ending pages on the den screen no longer default to each
other, so you can leave one empty, and you don't have to worry about
calculating page numbers
added a mirror command to flip a page as in layout
they sometimes needed to do this if ads had bad requests and doing it by
hand is time consuming. also, it helped me test things
changed the NewGen printer command to stop sending fonts
Bill downloaded the fonts to memory on the NewGen. the standard Mac
font downloader can not access the NewGen disk, but Bill thinks that
he can find a special download program from NewGen.
added empty banners
they leave a gap between the banner on the front page and the ads.
I made an empty file in the house ad directory and linked a banner
record to it
changed the unflow code to leave banners
this makes it easier to work with the front page
improved the ad positioning logic
two ads wanted to be together on a page, but due to an entry error, the
bottom ad requested being below the top ad instead of on the bottom of
the page. cpag now detects this as a special case and places the
bottom ad first
fixed a problem that created extra banners
if a banner had a page request, and if you positioned a second copy of the
banner with the mouse, cpag would sometimes forget that the two copies
of the banner were instances of the original, and the next pagination
run would create a new copy
sort the house ad filler list by size instead of ad number
started adding a max liner flow depth parameter
added a maximum partial banner width parameter
they do not like single columns of liners, and they rebuilt banner pages
that had seven column banners. cpag can now automatically widen the banner
and add fillers under it. note that the actual paper usually has several
instances of single columns of liners...
removed some incorrect comments in the postscript prolog
Bill corrected the cabe03 format
it used helv instead of sans and had the wrong size and leading.
Bill did this without the composition manual
added Bill's displist report that prints all of the display ads
added a look-ahead to the look-ahead
when paginating front to back, cpag now starts the look-ahead if the current
ad plus the next ad do not fit, instead of waiting until the current ad
does not fit. this should pack the ads better, especially when there are
lots of large ads
added an ad count to the commands that save ad positions
the cpag routine to save ad positions to a file now sets a variable that
the pagination formula can display in a window. this provides more
feedback that the work was saved
* Added a check for old replacement images.
ClassPag has to read all of the records in this database before each
pagination run. I added a check in the formula to open a window with old
records before the first run.
* Cleaned up the banner database.
I removed a secondary key in the bannerad database that was
no longer used.
I added the banner number to the second key of the banner database to
make banners easier to find. I added more fields in the detail window on
the banner setup screen to show more information about the banner.
* Improved the test for banner page names.
It now recognizes that "Agro" is a banner page but "AA..." is a
request for the top position in a classification.
* Support for squeezed pages.
If the ads in a banner section have irregular sizes, they may be packed with
less than the usual amount of leading. If an ad positioned by the mouse does
not fit with leading, it will try again without leading.
Pages with squeezed leading show "SQ" in the "Pyramid" line
of the "Page Information" window.
* Improved the page output process.
It checks for interrupts (generated by the CANCEL key, which is often
CONTROL-C. It now stops after the first error, and it checks for running
out of disk room.
* Improved the conflict report.
It now shows page number of positioned ads.
It now reports an error when an ad requests a position relative to another
ad that does not exist.
* Improved the page previews.
The ad boxes now show the ad dimensions if there is room.
* Improved the "View class results" window.
This window shows the page ranges of each classification.
The window is now larger, and if you press <ENTER>, you jump to a
preview of the first page of the class.
* Improved classification tracking.
It now keeps better track of pages with no agate ads.
* Improved the ad sizes in some windows.
I added a rounding factor so ads show as "4.00" instead of "3.99".
This is only for display purposes. The internal values are still accurate to
hundredths of points.
* Added the "Printer Name" menu to the main pagination menu.
This allows you to check the printer command line without leaving the
* Implemented the flag to start a classification on a new page.
This option only works when paginating from front to back.
It might aid in starting classifications at the correct place.
* Cleaned up the initial window.
I removed the "Export Pages" and "View Pages" options.
The "Export Pages" option is not used, and the "View Pages" option
should be run from the pagination menu.
* Improved the "View named page output" window
The page numbers are now formatted blank filled instead of zero filled.
The EDIT key lets you change the starting page request.
* Started work on placing liner ads under banners.
The "Interior del pais" section needs this.
* Added support for placing liners under banners.
Banner records and page name records now have a field to specify including
all of the liners contained under the banner classification.
There is also a flag to include all of the display ads, which can be
used as an alternative to placing the banner name request in the display
ad record in enviar.dbf.
There are also option to specify whether the overflow page is in the
front or back, and whether the liners on the overflow page should be
stacked horizontally or vertically.
These options allow cpag to handle the "Interior del pais" pages.
The unflow procedure does not touch liners under banners so you can
move them with the mouse.
* Added support for linking banner sections together.
These options allow cpag to place the Remates pages immediately
before the Interior del pais pages.
When you position an ad in a banner section, the banner sections tied to
it are also locked.
* Improved page filling.
The banner page filling routine now avoids filling pages with all small ads.
When the ad positioning routine for normal pages gets close to filling a
page, it tries to fill the page completely.
The program will no longer place liners on the interior pages of
* Reduced the amount of memory the program uses.
I reorganized the data structures for representing ads and reduced the
memory requirements by about 15 percent. This will help if we need to
do both sections at once on the same computer.
* Made the banner placement logic smarter.
It can now skip over columns filled to the top, like the right half of
the last Interior del pais page with a full height display ad.
It now allows a larger gap between the banner and liners than it usually
allows between banners and display ads in order to make sure that all of
the liners under the "Interior del pais" first page are covered.
* Improved the folio specification screen.
It now goes to the first field on the screen instead of the menu bar at
the top. It now creates an initial record if the default record is
* Improved the view named pages window.
It now also contains the starting pages of the top level classifications
to help determine that the banner pages are in the correct classification.
You can now only open the edit window on lines for banner pages.
I changed the order of some items in the main pagination menu to make
this option appear on the first page of choices.
* Improved mouse positioning.
When cpag repaginates after you have positioned ads with the mouse, it does a
better job of floating the ads that you have moved.
* Added more text in the page information window.
It now shows if the page is in the right or left double truck position.
* Added a Dated Text database for placing custom text on banners.
Each item has an id number, a date, and a short text string.
Composition code can embed the string for the current date by its id using
<sv 10,"#"><Call_Formula gettext>
or you can create a gettext format with
<sv 10,!f1><Call_Formula gettext>
and then embed strings using
where # is the id number of the string that you want to embed.
* More conflict testing.
The "page in style" test checks for positioning conflicts.
This makes it easier to find if an ad that requested the top was placed
on the bottom.
* New version of spice.
It has a number of new features and an updated composition module.
* New version of the form entry module.
The error messages are now in Spanish.
* Agate filler positioning.
EPS images for agate fillers are placed using the display ad offset and
not the liner ad offset. This should center them in their space better.
* Better tracking of color ads.
Fixed the color name displays in the single page preview box and page
* Option to rebuild symbolic links.
Added a "Link /u1 to /u"/"Enlazar /u1 a /u" option to the Import menu.
It runs a script called "relink.sh" to rebuild the symbolic links from
/u1 to /u. You can use this if you accidentally remove some of the link
files in /u.
* Changed the import procedure to handle composition codes.
This allows ads to use all of the features of SCS Composition.
* New unmap program.
Wrote an unmap program used by the import procedure to convert printable
7-bit sequences into special SCS characters. The command "unmap -p | more"
displays the mapping to the screen.
* Changed the import procedure to accept suffixes after style names.
You can now create formats like "linea1" for testing.
Each style, like linea, is now a family of styles.
For example, the import handles lines starting @NEGRITAX10: the same
as lines starting @NEGRITA:, except that it calls the format negritaX10.
* Ad statistics report.
Wrote a report that shows the count and area of each type of ad
contained in each class. The report is on the pagination menu as
"View statistics"/"Vis.estadisticas". To create the report, press
<enter> from the window. To help identify fillers, cpag assigns fillers
to the class of the ads near the filler. The special class with all spaces
shows fillers that were not assigned to a class, and the special class
"******" shows the totals for all of the other classes.
* Option to display users.
Added a "Visualizar usuarios"/"View current users" option to the pagination
menu to display all of the current users.
* Changed the scanps.sh script to handle overflow errors in the "grep" program.
This should fix the problem that caused ad L06871 to be rejected.
* Each pagination run now reinitializes the filler sequence numbers.
This should make pagination runs more repeatable.
* Improved ad purging.
Fixed the cleanads.sh script used by the ad image purge procedure so it
can handle multiple copies of ads. The script could delete an ad from
the display ads directory if the ad was in the directory twice with
* New install procedure.
Changed the install procedure to preserve the data in the configuration files.
This will prevent updates from changing the setup.
* Single page preview print option.
Added an option to print an ad on the command window of the single page
preview. This lets you check an ad without leaving the preview window.
* Spread menu print option.
Added an option to print an ad without a box in the "Display Ad" and
"Agate Ad" command windows in the Spread menu.
* Added dates to the image replacement database.
Added the import date and the change date to the image replacement database.
This makes it easier to tell when an image record is old.
* Help placing fillers on even pages.
Changed the requested page number for display fillers, agate fillers, corner
ads, policy ads and banner ads. In addition to a page number, you can now
enter PAR or IMPA to request an even or odd page. If you give
full page fillers a page request of PAR, those fillers will show as
conflicts if you place them on an odd page. This should help enforce a
policy of placing fillers on even pages.
* Help placing full page fillers away from banner page sequences.
Full page ads show a "WITHIN_RANGE" conflict if you position them in the
middle of multi-page banner section. This should help prevent accidentally
placing fillers inside banner sections.
* Improved the page preview display.
The page information box does not show items with empty values.
The page display now shows a third line with an ad description in the status
area at the upper left. The ad description for display ads comes from the
interface sort file. If the sort file does not have a description for an ad,
the program will extract the Title comment line from its EPS file.
* Improved page number entry.
The initial screen for entering page numbers prints a warning if another
station has a book for the same day and the page numbers do not match.
The configuration database has an option to specify whether the first page
or the last page must be on a page appropriate for a tab or broadsheet section.
* Improved run date entry.
The initial screen for entering dates now has start and end dates.
The configuration database has options to specify whether the start date
must be a specific day of the week and a default increment for the end date.
The program displays a warning if you enter a date on the wrong weekday,
but it still accepts the date in case you must publish on a different
day due to a holiday.
* Added editions.
You can now specify an edition number when you enter the first pagination
screen, and there is a setup option to enter names for each edition number.
Banners now have an edition field. If you specify an edition on the
pagination screen, the program will only paginate banners with that edition
or with an empty edition. This makes it easier to maintain multiple sets
of banners. A new folio generation system can access the edition name.
* Improved product identification.
The window on the upper left shows the edition name and the window on the
upper right shows the user name and terminal name. This can help if you
have several sessions running on the same console.
* New folio generation system.
There is a configuration option to use a new folio generation system.
The system lets you assign a string for the right and left pages for each
edition. The program can process the string with the expression interpreter
before sending it to the composition engine. The expression interpreter
has access to the variables PageNumber, EditionId, EditionName, RunDate,
EndingDate from the initial pagination screen, and to the string variables
StartDate and EndDate from the folio creation screen.
* Improved the dummy page option.
If an ad has a request that prevents changes to the page, the program
shows the ad number.
* Improved the PostScript scan.
When the scanps.sh script finds a good ad, it removes old versions in
missingads and badads.
* Converted more text to Spanish.
We corrected existing Spanish text and translated additional English text
* Improved maintenance procedures.
In addition to the insert, enter, edit and delete hot keys, most windows now
have a command hot key and a copy hot key. The command key shows a list of
all of the hot keys available in the window. The copy key, usually bound
to the "F1" key, copies the current item.
* Improved data checking.
The load step checks that ads have a height greater than zero.
* Added checks on banners.
The program creates ad numbers from banners by using the banner name,
a dash, and then the banner image name. The program now displays a
warning if you enter banner names that create non-unique ad numbers.
The program does not let you enter a dash in a banner name to help it
separate the banner and image parts of the ad number.
For banners images that contain text segments, the program now displays
a warning if the banner image file has the same name as another image or
a text segment.
When you enter a banner, the program checks if you do not enter a
classification or a page request on a banner that needs one.
* Added more banner positioning options.
A banner can specify type "B" for a position on the bottom of a page instead
of at the top.
* Improved support for position requests.
If one ad requests a position over a second ad, and only the first ad has
a request for a specific page, the program will try to place the second
ad on the page requested by the first ad.
* Better handling of requests for the first page.
The program treats requests for page one specially and is more careful
about shifting them to a different page.
* Added more page request types.
Page requests now have the format: an optional minus, a page number, an
optional slash, an optional A, G or L, and an optional P or I. The minus
sign requests a page from the back or end of the classification. A means an
absolute page number from the front, G means a page number relative to a top
level classification, and L means a page number relative to a liner
classification. P and I mean even and odd pages as before.
* Improved flowing of ads.
When balancing line ads between two columns, the program will no longer shift
the last liner ad under a classification heading.
The program now has a configuration option for the minimum flow depth.
If the program is ready to start a new classification and less than
this amount of space remains at the end of a column, it will put the
classification on a new column.
The program now has a minimum widow depth configuration parameter for
the smallest sized line ad that should not be placed on a column
The program is smarter about adjusting the extra space between ads.
* ClassPag now has an option to write an outext file.
The outext file contains the size and position of each paginated item plus
all unplaced ads. AdMax and some other ad order entry and accounting systems
can use the outext for building discrepancy reports.
* Fixed tab key handling in data entry screens.
In some places, pressing the tab key could make the form entry system loop.
* More options for handling missing ads.
The window for printing spreads has a new option to control the display
of ads without EPS images. You can specify TEXT for the current behavior
with a black border and text around a white box, WHITE for a white block,
and BLACK for a black block. The program has a new configuration parameter
with the margin to indent when drawing TEXT boxes so the box will not show
when you paste in the ad.
* Improved the scanning commands for new EPS files.
The scan procedures handle errors and strange file names better.
There is now a configuration option to reject EPS files with binary data.
* Alternate option for deleting old EPS files.
The "View Ad Directories"/"Ver Avisos" option on the Import menu has an
option to specify a directory and to remove any files not listed in any
work area sort file.
This option will work with any interface, while the
"Remove Old Ads"/"Borrar Avisos Viejos" option
on the Import menu only works with the interface currently used at El Pais.
In addition, this option recognizes banners and fillers, so you can run it
on the banner or filler directory.
* Added more options for duplicating classification headers.
At most one classification header per classification can specify the
page "COPY". When the program starts a classification, it will use
the normal headers, and if it needs to duplicate a header at the top of
a column, it will use the COPY header. This allows you to make the duplicated
headers different from normal headers. If you place headers at the top of
each column, you can save newsprint by making the duplicated headers smaller.
If you do not specify a COPY header for a classification, the program will
copy the last header in sort order.
* Improved the classification selection window.
The window now has options to display and view the ads in each classification,
a hot key to calculate the area of the selected classifications,
hot keys to recalculate the classification areas in case the interface
did not calculate them correctly, and hot keys to save and restore
configurations of selected classifications.
* Added an option to paginate the line ads in a classification in random order.
You can set this option from the classification selection window.
* Simplified entry for banners and fillers.
In the configuration screen, you can enter default directories for banners
and display ads. When you enter an image name for a banner, the program
displays a warning if the image is not in the banner directory.
When you enter an image file name for a banner or filler, the program displays
a warning if the file does not exists. If the file does exists, the
program scans for the bounding box and can update the size you entered.
The "View Ad Directories"/"Ver Avisos" option on the Import menu has an
option to load
a file or all of the files in a directory as fillers. It only loads files
that do not already have an entry, so you can run this option after adding
more files to your house ad directory without creating duplicates.
It reads size and title information from the EPS files to produce
filler records with correct sizes and good descriptions.
There is also an option to add a file as a banner image.
The display and agate filler setup screens have options to delete all of
the filler records. If you delete all of the records and then reload the
database from the directory, the filler databases will match the EPS filler
images in your filler directory.
* Alternate line filler entry.
You can now specify additional line fillers in the interface sort file
using the "F" ad type as specified in the SCS Interfacing Guide.
* Improved text entry.
When you enter text for composition in the SCS editor, you can now exit
with the F9 key.
* Improved printing options.
If you try to print with a spread option where the page image is smaller than
the paper but the page image plus the margins are larger than the paper,
the program will center the image on the paper. If the page image is larger
than the paper, the program will display a message. In both cases, the
program used to display only that it produced 0 pages.
* Improved error handling while importing ads.
Duplicate ads show a more descriptive message.
The program now displays a count of the number of errors, and only displays
a popup message for the first few ads with errors.
* Added a report from the pagination status screen.
The long pagination menu now has a "Print pag. stats"/"Imp. páginas estados"
option to print the information on the pagination status screen.
* Removed a warning message.
The new version fixes a bug that could cause a warning message
when you paginated.
* Entered font names into the configuration file.
You can now enter a list of font names in the configuration file.
When cpag generates PostScript, it will add extra commands to load these
fonts at the start of the page. To keep ads from interfering with each other,
after cpag emits the PostScript for an ad, it must generate additional
commands to clear any PostScript elements created by the ad, including fonts.
If you enter the fonts used by line ads in the new configuration area,
cpag will generate extra PostScript commands so the printer will only
need to load the fonts once per page instead of once per ad.
This should make pages print faster on some printers.
* Added a quarter fold page numbering check option.
This is for papers with a quarter fold editions.
* Ad scan ad removal.
When the scan finds a bad ad, it now also removes good copies.
If a new ad has the same ad number as an old ad, and the new ad is bad,
this change prevents the program from using the old ad.
* Ad scan binary check.
Improved the bad ad scan to check for ads that say they are "7-bit clean" in
their headers but still contain embedded scanned EPS segments with binary data.
* Added an option to view the information in the saved class selection database.
You can now view and edit the saved classifications to correct entries if
* Fixed banner calculations.
I had added a routine to load common parts of house ads, and added the call
without removing the original code from the banner loading routine.
This messed up the area count and placed some house ads like banners.
* Added ad movement to the multi-page preview display.
You can now move ads between pages while on the multi-page display.
Click on the ad on the first page to select the ad, and then click on
the second page where you want the ad to go.
The "Old Preview" entry near the bottom of the long menu on the pagination
status screen runs the old multi-page display.
* Added different page counts to the multi-page display.
You can display more than just 8 pages at a time.
The digits 2, 4, 6, 8, and 0 generate page displays with that many pages across
(except 0 is 10).
The digits 3, 5, 7, and 9 generate page displays like the next smaller
number but with more rows. The digit 1 generates a single page display.
You can select the "Set pages to show" command to display up to 96 pages
* Added a repaginate command to the page display.
Clicking on the "floW" button or pressing "w" reflows the line ads from
within the page display. You no longer have to exit to the status screen.
* Added other short cut keystrokes to the page display.
"!" locks the current page, and "@" unlocks it.
"a" goes to the first page, and "z" goes to the last page.
"i" changes the leading. "," and "." move left and right between pages.
The arrow keys move between ads on the current page.
The "h" and "?" keys display a list of all of the possible keystrokes.
* Added automatic ad shrinking to restore leading.
Sometimes it is necessary to squeeze ads with no leading, for example,
in order to place two half-page ads on the same page.
If you enable the "Shrink depth if larger than order" configuration option,
the program will shrink the ads by a small amount to restore the leading.
The program currently looks at just the left-most column of the ad.
We can make it smarter or add a separate configuration parameter if needed.
* Added support for running under X Windows.
This option allows you to run in a graphic mode on a SCO graphic desktop
and on PC's running an X server. Under X, you can scroll and zoom in the
ghostscript preview window, and you can see both the cpag page display and
the ghostscript preview at once. To run under X, you might need new versions
of spice, xwindow.xcm, xwindow.xkm, ghostscript and ghostview, and you should
use a video mode of at least 1024x768 pixels and 256 colors. Call me for
instructions if you want to try it.
* Added support for multiple column classification headers.
You can now create multiple column classification headers.
This option currently requires paginating from back to front.
For each classification, create a banner of type "W" (wide) and assign it
to the proper classification. Enter a unique page request name (you can use
the classification), "N" for include liners or displays, a default count of
"1", and the default values for all of the other fields.
Then enter image records for the column widths that you will use.
Set the default image to the width that you usually use.
When the program paginates the liners for the classification, it will
select a banner and square off the first few columns of the classification
* Added support for color separations.
You can now load ads with color separations. The EPS file must have
a comment with the format "%%PlateFile: (Black) EPS #24848 31777".
The syntax is "%%PlateFile: (color name) filetype #offset size".
Multi-Ad Creator(R)3.8.1 can save files this way. When you import the
ads, cpag will detect ads that have colors. When you paginate, the
page list window will show the colors on each page.
When you print a page, cpag will create a plate for each color on the page.
There are two new configuration parameters.
Set "Check Color Requests" to "Y" if you want to force color ads on
preassigned color pages. If you set it to "N", cpag will place color
ads like normal ads.
Set "Show Color Conflicts" to "Y" if you want color ads to show as
conflicts on pages where you did not preassign colors.
* Added support for registration marks.
There is now a configuration screen to specify margins for registration marks.
This screen will change in the next release, but you can enter values for
* Improved the page count estimate.
On the classification selection screen when you first select paginate
from the initial menu, the F4 key shows a third line with an estimated
page count that includes banners with page requests and leading.
There is a new "Extra Percentage for Area Estimates" configuration
parameter to tune the estimate. A good value is 5 percent.
Also, shift F2 toggles the selected classifications from the current
classification to the end, and shift F3 unselects classifications from
the current classification to the end.
* Improved the multi-page preview.
If there is only one ad on a page, when you move the mouse or hit an
arrow key, cpag replaces the page information on the upper right hand
corner of the screen with information for the ad.
* Added a table to set display colors for ads by classification.
In the setup menu, there is a new option "Set Class Colors".
For each classification, you can override the border color, box color and
text color used to display ads of that class on the screen.
* Improved ad positioning.
Overflow pages now keep their correct dummying style.
When an ad does not fit well on any page, which can happen due to color
restrictions, cpag will attempt to rebuild the page.
* Added new options on the page preview command window.
You can now remove all ads in or under a given classification from the
current page, from the current page to the end, or from all pages.
There is a new "Find an ad" option to find the page with a given ad.
* Improved the cleanads.sh script.
It can now handle ads names with fewer than 6 characters.
* Changed the installation.
The "loadtape.sh" install script now recognizes encrypted files with the
extension ".tar.gz.cr". The install will run the same as before, except
that it will ask for a key. This release includes the new install script
and decryption program. Later releases will be encrypted to make it safer
to continue posting them on our ftp server.
* Increased the edition name length.
I increased the edition name length from 30 characters to 50.
This will help papers that generate page folios from the edition name.
* Added an "Edit the ad position" command to the preview display screen.
You can use this command to view or modify the position of an ad on the page
without using the mouse.
* Added an "expand banners" configuration parameter.
If the banner library does not have banner of the needed width,
"expand banners" requests using a larger banner instead of a smaller banner.
* Added a "warn if folios not made" configuration parameter.
This option can disable folio warnings for sites that generate folios
* Added a "warn if unused banners" configuration parameter.
If this option is enabled, cpag writes warnings to its log file when it
does not use a banner for a square off because no ads request the square
off classification. This option can help find mismatched request names
when setting up a new product.
* The installation and update procedure is more careful about saving previous
versions of configuration files.
* Improved logic to handle large square offs.
* Improved the calculations for some of the pagination statistics.
* Segmentation of legal ads on the first page.
Composition did not segment all of the legal ads. I tested it here, and
it seems to be an incorrect setting in the composition photodef database.
I reduced the "Ad Dump Column Depth" parameter for the "view" device from
30 points to 5 points.
* Lining up agate ads over multi-column ads.
Agate ads now line up over multi-column ads. ClassPag used to float each
column of ads on its own so the float space could be different in each column.
ClassPag now floats the agate ads over each multi-column ad as a group so
the agate ads on the bottom of the stack will all have the same height.
* Remapping fonts.
ClassPag can produce a list of fonts in ads that are not on the RIP,
but there is no easy way to remap fonts inside an ad.
* Display ad dump format.
The interface routines should handle minor changes in the dump format.
* Cut rule spacing on class headers.
I changed the headers to maintain the same space between both pairs of cut
rules on the top and bottom. My original configuration generated the inner
set of rules with composition and the outer set of rules with ClassPag.
ClassPag centers the rules in the space between ads, so every header
had a different amount of space between its rules. I changed the configuration
to generate both pairs of rules in composition.
* Automatic fillers.
You can eliminate automatic fillers by deleting all of the entries in the
agate filler database. You can enter manually placed fillers in the
display filler database or the banner database.
* Fast ad deletion.
ClassPag now has a fast way to delete ads from the page preview.
When you select the "Remove an ad" option from the page preview command window,
ClassPag deletes the ad from the ad database on the disk and sets the run
count of the copy of the ad in memory to 0. It then removes the ad from the
page, and repaginates if the liners were flowed.
* New KILL page request.
I added a new page request value of "KILL". When ClassPag reads an ad with
this request, it sets the run count to 0 to prevent the ad from flowing on a
page. When you delete an ad, if the product does not have zones,
ClassPag will change the ad request to "KILL" instead of deleting the record
from the ad file to leave a better record of what happened.
* Fast ad entry and editing.
In the page preview menu, I also added options to create and copy ads,
and the new create and copy commands, along with the existing edit command,
now ask if you want to reload the ads. If you select "yes", ClassPag
reloads the ad database and repaginates. You no longer have to exit several
levels of screens.
* Expanded options on the ad search menu.
The "Search for an ad" command on the page preview command menu now
has options to switch between the line ad and the display ad database,
to insert, delete, edit and copy ads, and the view option now works on line ads.
In addition, when you leave the search window, if you changed any ads,
you have an option to reload the ad databases the same as described above.
* Automatic class header placement.
ClassPag now automatically places class headers between display ads when
you position display ads with the mouse (and you have the configuration option
set to place class headers over display ads). This might need some testing to
work the best way. ClassPag adds class headers while handling mouse
placement requests. When you place (or remove) an ad, ClassPag removes
class headers above and below the original position of the ad that look like
they are no longer needed, and then checks to place class headers below the
new position of the ad. This way, you can delete class headers under an
ad manually, and the headers will stay deleted until you move the ad.
* Line ad reordering.
The command window of the ClassPag preview screen now has a "Position after"
option. To place a line ad or one-column display ad after a second ad,
click on the first ad, click on the command button, click on "Position after",
and then click on the second ad. ClassPag will set the sort key of the first
ad to the sort key of the second ad. If the first ad is a display ad,
ClassPag will change its type to a line ad. ClassPag will then ask if you
want to reload the ads. If you select "yes", it will reload the ad database
and repaginate. Since the ads have the same sort key, the second ad might
flow before the first ad.
* Expanded font download lists.
ClassPag can now download more fonts. The configuration screen now has
a fifth line for entering fonts. In addition, ClassPag now has a font
database that you can access from the command key from the printer database.
The font database can hold as many font names as needed and has a default
download flag so you can enter fonts that you do not always download.
Once you have the fonts entered in the fonts database, you must still
select the command to download them.
* Font download information.
ClassPag creates global references to all of the fonts listed in the
On Level 1 (but not Level 2) PostScript interpreters, the PostScript that
ClassPag generates to protect ads from each other hides fonts loaded by the
ads. For example, if line ads use FuturaBold, and a page has 500 line ads,
if you have FuturaBold in the configuration database font list,
ClassPag will generate PostScript to load the font in a global area once
instead of loading it in a local area 500 times. This makes pages preview
and print faster. It also uses more resources, so you should only enter fonts
in the configuration database font list that will appear at least 5 or 10
times on each page.
* Instructions for rebuilding the folios:
From the pagination statistics screen with the
Spread/Pages/Paginate/Restart/Quit menu at the bottom,
select Pages then
press <Enter> from any page in the page list then
from the "Options" menu, select "Create Folios"
(you can do this by pressing "c" four times and then <Enter>) then
from the "Creating Folios" dialog,
run the option "Rebuild".
It should work for a few seconds and then return to the "Options" menu.