Whole document tree Chapter 1. Building Variant DTDs Based on DocBookDocBook is "cannibalized" as often as it is used in its original form. It has a modular structure and uses parameter entities to ease the process of using the desired parts of DocBook and modifying them as necessary. This book explains how to create variants of DocBook using its modules and parameter entities. There are two main methods for building DocBook variants: You can start with both of the standard main modules and customize them, or you can reuse one of the modules in building a new DTD. You can also use the two methods in combination, for example, by using just one module and also customizing it. Regardless of the techniques you use, building a variant DTD requires careful planning.
You can make two kinds of changes to DocBook "for free"; they don't fundamentally alter its markup model, and you can make these changes in the main DocBook DTD file, in your own driver file, or in an internal subset without considering your version a variant:
All other changes, no matter how small, should result in the use of a formal public identifier (if you use one) that is different from that of the original module or driver file. You should change both the owner identifier and the description. The original DocBook formal public identifiers use the following syntax (note that the owner identifier has changed from "HaL and O'Reilly" to "Davenport"): -//Davenport//{DTD|ELEMENTS} DocBook description version//EN Your own formal public identifiers should use the following syntax in order to record their DocBook derivation: -//your-owner-ID//{DTD|ELEMENTS} DocBook Vn.n[.n]-Based [Subset|Extension|Variant] your-descrip-and-version//lang For example: "-//DocTools//DTD DocBook V2.3-Based Subset V1.1//EN" If your DTD is a proper subset, you can advertise this status by using the "Subset" keyword in the description. If your DTD contains any markup model extensions, you can advertise this status by using the "Extension" keyword. If you'd rather not characterize your variant specifically as a subset or an extension, you can leave out this field entirely, or, if you prefer, use the "Variant" keyword. Setting Up DocBook for CustomizationTo customize DocBook by starting from the standard version:
The main method for customizing DocBook elements and attributes is the overriding of existing parameter entities, that is, the declaration of a parameter entity with the same name as one that is declared later in the linear flow of the DTD. The redeclarations go in your driver file or internal subset in the appropriate locations to override the original values. With certain redeclarations in place, you might also declare new element types and attribute lists and supply replacement declarations for existing element types and attribute lists. Following are templates for DocBook customizations, starting with the most common and desirable. Example 1-1shows a customization template using a reference to the original driver file from a higher-level driver file (which might be named myvariant.dtd). Example 1-2 shows a customization template using direct references to the original modules from a higher-level driver file. You will need to supply your own notation declarations and references to ISO entity sets in this scenario; leaving out any that DocBook itself supplies will create a subset in this respect. Example 1-3 shows a customization template using a reference to the original driver file from an internal subset. Note that parsers read the declarations in the subset before the declarations in the remote portion (the original DTD), so that the local declarations take precedence over whatever is in the original file. Note also that it is generally considered bad practice (even if supported in your software) to change the markup model of a DTD "on the fly" like this. If you must make any customizations that rely on declarations positioned after the original DTD file (such as new element declarations that contain references to entities defined earlier), you can't use this method. |