mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
1815 lines
73 KiB
Text
1815 lines
73 KiB
Text
<chapter id="documentation">
|
|
<title>Documenting Wine</title>
|
|
|
|
<para>
|
|
Written by &name-jon-griffiths; <email>&email-jon-griffiths;</email>
|
|
</para>
|
|
|
|
<para>
|
|
This chapter describes how you can help improve Wines documentation.
|
|
</para>
|
|
|
|
<para>
|
|
Like most large scale volunteer projects, Wine is strongest in areas that are rewarding
|
|
for its volunteers to work in. The majority of contributors send code patches either
|
|
fixing bugs, adding new functionality or otherwise improving the software components of
|
|
the distribution. A lesser number contribute in other ways, such as reporting bugs and
|
|
regressions, creating tests, providing organizational assistance, or helping to document
|
|
Wine.
|
|
</para>
|
|
|
|
<para>
|
|
Documentation is important for many reasons, and is often the key to the end user having
|
|
a successful experience in installing, setting up and using software. Because Wine is a
|
|
complicated, evolving entity, providing quality up to date documentation is vital to
|
|
encourage more people to persevere with using and contributing to the project.
|
|
The following sections describe in detail how to go about adding to or updating Wines
|
|
existing documentation.
|
|
</para>
|
|
|
|
<sect1 id="doc-overview">
|
|
<title>An Overview Of Wine Documentation</title>
|
|
|
|
<para>
|
|
The Wine source code tree comes with a large amount of documentation in the
|
|
<filename>documentation/</filename> subdirectory. This used to be a collection
|
|
of text files culled from various places such as the Wine Weekly News and the wine-devel
|
|
mailing list, but was reorganized some time ago into a number of books, each of which is
|
|
marked up using SGML. You are reading one of these books (the
|
|
<emphasis>Wine Developer's Guide</emphasis>) right now.
|
|
</para>
|
|
|
|
<para>
|
|
Since being reorganized, the books have been updated and extended regularly. In their
|
|
current state they provide a good framework which over time can be expanded and kept
|
|
up to date. This means that most of the time when further documentation is added, it is
|
|
a simple matter of updating the content of an already existing file. The books
|
|
available at the time of writing are:
|
|
|
|
<itemizedlist>
|
|
|
|
<listItem><para>
|
|
The <emphasis>Wine User Guide</emphasis>. This book contains information for end users
|
|
on installing, configuring and running Wine.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
The <emphasis>Wine Developer's Guide</emphasis>. This book contains information and
|
|
guidelines for developers and contributors to the Wine project.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
The <emphasis>Winelib User's Guide</emphasis>. This book contains information for
|
|
developers using Winelib to port Win32 applications to Unix.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
The <emphasis>Wine Packagers Guide</emphasis>. This book contains information for
|
|
anyone who will be distributing Wine to end users in a prepackaged format.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
The <emphasis>Wine FAQ</emphasis>. This book contains frequently asked questions
|
|
about Wine with their answers.
|
|
</para></listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>
|
|
Another source of documentation is the <emphasis>Wine API Guide</emphasis>. This is
|
|
generated information taken from special comments placed in the Wine source code.
|
|
When you update or add new API calls to Wine you should consider documenting them so
|
|
that developers can determine what the API does and how it should be used.
|
|
</para>
|
|
|
|
<para>
|
|
The next sections describe how to create Wine API documentation and how to work with
|
|
SGML so you can add to the existing books.
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="api-docs">
|
|
<title>Writing Wine API Documentation</title>
|
|
|
|
<para>
|
|
Written by &name-jon-griffiths; <email>&email-jon-griffiths;</email>
|
|
</para>
|
|
|
|
<sect2 id="api-docs-intro">
|
|
<title>Introduction to API Documentation</title>
|
|
<para>
|
|
Wine includes a large amount of documentation on the API functions
|
|
it implements. There are several reasons to want to document the Win32
|
|
API:
|
|
<itemizedlist>
|
|
|
|
<listItem><para>
|
|
To allow Wine developers to know what each function should do, should
|
|
they need to update or fix it.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
To allow Winelib users to understand the functions that are available
|
|
to their applications.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
To provide an alternative source of free documentation on the Win32 API.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
To provide more accurate documentation where the existing documentation
|
|
is accidentally or deliberately vague or misleading.
|
|
</para></listitem>
|
|
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>
|
|
To this end, a semi formalized way of producing documentation from the Wine
|
|
source code has evolved. Since the primary users of API documentation are Wine
|
|
developers themselves, documentation is usually inserted into the source code
|
|
in the form of comments and notes. Good things to include in the documentation
|
|
of a function include:
|
|
<itemizedlist>
|
|
|
|
<listItem><para>
|
|
The purpose of the function.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
The parameters of the function and their purpose.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
The return value of the function, in success as well as failure cases.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
Additional notes such as interaction with other parts of the system, differences
|
|
between Wines implementation and Win32s, errors in MSDN documentation,
|
|
undocumented cases and bugs that Wine corrects or is compatible with.
|
|
</para></listitem>
|
|
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>
|
|
Good documentation helps developers be aware of the effects of making changes. It
|
|
also allows good tests to be written which cover all of the documented cases.
|
|
</para>
|
|
|
|
<para>
|
|
Note that you do not need to be a programmer to update the documentation in Wine.
|
|
If you would like to contribute to the project, patches that improve the API
|
|
documentation are welcome. The following describes how to format any documentation
|
|
that you write so that the Wine documentation generator can extract it and make it
|
|
available to other developers and users.
|
|
</para>
|
|
|
|
<para>
|
|
In general, if you did not write the function in question, you should be wary of
|
|
adding comments to other peoples code. It is quite possible you may misunderstand
|
|
or misrepresent what the original author intended! Adding API documentation on
|
|
the other hand can be done by anybody, since in most cases there is plenty of
|
|
information about what a function is supposed to do (if it isn't obvious)
|
|
available in books and articles on the internet.
|
|
</para>
|
|
|
|
<para>
|
|
A final warning concerns copyright and must be noted. If you read MSDN or any
|
|
publication in order to find out what an API call does, you must be aware that
|
|
the text you are reading is copyrighted and in most cases cannot legally be
|
|
reproduced without the authors permission. If you copy verbatim any information
|
|
from such sources and submit it for inclusion into Wine, you open yourself up
|
|
to potential legal liability. You must ensure that anything you submit is
|
|
your own work, although it can be based on your understanding gleaned from
|
|
reading other peoples work.
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="api-docs-basics">
|
|
<title>Basic API Documentation</title>
|
|
|
|
<para>
|
|
The general form of an API comment in Wine is a block comment immediately before a
|
|
function is implemented in the source code. General comments within a function body or
|
|
at the top of an implementation file are ignored by the API documentation generator.
|
|
Such comments are for the benefit of developers only, for example to explain what the
|
|
source code is doing or to describe something that may not be obvious to the person
|
|
reading the source code.
|
|
</para>
|
|
|
|
<para>
|
|
The following text uses the function <emphasis>PathRelativePathToA()</emphasis> from
|
|
<filename>SHLWAPI.DLL</filename> as an example. You can find this function in the Wine
|
|
source code tree in the file <filename>dlls/shlwapi/path.c</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
The first line of the comment gives the name of the function, the DLL that the
|
|
function is exported from, and its export ordinal number. This is the simplest
|
|
(and most common type of) comment:
|
|
</para>
|
|
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToA [SHLWAPI.@]
|
|
*/
|
|
</screen>
|
|
|
|
<para>
|
|
The functions name and the DLL name are obvious. The ordinal number takes one of
|
|
two forms: Either <command>@</command> as in the above, or a number if the export
|
|
is exported by ordinal. You can see which to use by looking at the DLL's
|
|
<filename>.spec</filename> file. If the line on which the function is listed begins
|
|
with a number, use it, otherwise use the <command>@</command> symbol, which indicates
|
|
that this function is imported only by name.
|
|
</para>
|
|
|
|
<para>
|
|
Note also that round or square brackets can be used, and whitespace between the name
|
|
and the DLL/ordinal is free form. Thus the following is equally valid:
|
|
</para>
|
|
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToA (SHLWAPI.@)
|
|
*/
|
|
</screen>
|
|
|
|
<para>
|
|
This basic comment will not get processed into documentation, since it
|
|
contains no information. In order to produce documentation for the function,
|
|
We must add some of the information listed above.
|
|
</para>
|
|
|
|
<para>
|
|
First we add a description of the function. This can be as long as you like, but
|
|
typically contains only a brief description of what the function is meant to do
|
|
in general terms. It is free form text:
|
|
</para>
|
|
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToA [SHLWAPI.@]
|
|
*
|
|
* Create a relative path from one path to another.
|
|
*/
|
|
</screen>
|
|
|
|
<para>
|
|
To be truly useful however we must document the parameters to the function.
|
|
There are two methods for doing this: In the comment, or in the function
|
|
prototype.
|
|
</para>
|
|
|
|
<para>
|
|
Parameters documented in the comment should be formatted as follows:
|
|
</para>
|
|
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToA [SHLWAPI.@]
|
|
*
|
|
* Create a relative path from one path to another.
|
|
*
|
|
* PARAMS
|
|
* lpszPath [O] Destination for relative path
|
|
* lpszFrom [I] Source path
|
|
* dwAttrFrom [I] File attribute of source path
|
|
* lpszTo [I] Destination path
|
|
* dwAttrTo [I] File attributes of destination path
|
|
*
|
|
*/
|
|
</screen>
|
|
|
|
<para>
|
|
The parameters section starts with <command>PARAMS</command> on its own line.
|
|
Each parameter is listed in the order they appear in the functions prototype,
|
|
first with the parameters name, followed by its input/output status, followed
|
|
by a free form text description of the comment.
|
|
</para>
|
|
|
|
<para>
|
|
The input/output status tells the programmer whether the value will be modified
|
|
by the function (an output parameter), or only read (an input parameter). The
|
|
status must be enclosed in square brackets to be recognized, otherwise, or if it
|
|
is absent, anything following the parameter name is treated as the parameter
|
|
description. This field is case insensitive and can be any of the following:
|
|
<command>[I]</command>, <command>[In]</command>, <command>[O]</command>,
|
|
<command>[Out]</command>, <command>[I/O]</command>, <command>[In/Out]</command>.
|
|
</para>
|
|
|
|
<para>
|
|
Parameters documented in the prototype should be formatted as follows:
|
|
</para>
|
|
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToA [SHLWAPI.@]
|
|
*
|
|
* Create a relative path from one path to another.
|
|
*
|
|
*/
|
|
BOOL WINAPI PathRelativePathToA(
|
|
LPSTR lpszPath, /* [O] Destination for relative path */
|
|
LPCSTR lpszFrom, /* [I] Source path */
|
|
DWORD dwAttrFrom, /* [I] File attribute of source path */
|
|
LPCSTR lpszTo, /* [I] Destination path */
|
|
DWORD dwAttrTo) /* [I] File attributes of destination path */
|
|
</screen>
|
|
|
|
<para>
|
|
The choice of which style to use is up to you, although for readability it
|
|
is suggested you stick with the same style within a single source file.
|
|
</para>
|
|
|
|
<para>
|
|
Following the description and parameters come a number of optional sections, all
|
|
in the same format. A section is defined as the section name, which is an all upper
|
|
case section name on its own line, followed by free form text. You can create any
|
|
sections you like, however for consistency it is recommended you use the following
|
|
section names:
|
|
<orderedlist>
|
|
|
|
<listItem><para>
|
|
<command>NOTES</command>. Anything that needs to be noted about the function
|
|
such as special cases and the effects of input arguments.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
<command>BUGS</command>. Any bugs in the function that exist 'by design', i.e.
|
|
those that will not be fixed or exist for compatibility with Windows.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
<command>TODO</command>. Any unhandled cases or missing functionality in the Wine
|
|
implementation of the function.
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
<command>FIXME</command>. Things that should be updated or addressed in the implementation
|
|
of the function at some future date (perhaps dependent on other parts of Wine). Note
|
|
that if this information is only relevant to Wine developers then it should probably
|
|
be placed in the relevant code section instead.
|
|
</para></listitem>
|
|
</orderedlist>
|
|
</para>
|
|
|
|
<para>
|
|
Following or before the optional sections comes the <command>RETURNS</command> section
|
|
which describes the return value of the function. This is free form text but should include
|
|
what is returned on success as well as possible error return codes. Note that this
|
|
section must be present for documentation to be generated for your comment.
|
|
</para>
|
|
|
|
<para>
|
|
Our final documentation looks like the following:
|
|
</para>
|
|
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToA [SHLWAPI.@]
|
|
*
|
|
* Create a relative path from one path to another.
|
|
*
|
|
* PARAMS
|
|
* lpszPath [O] Destination for relative path
|
|
* lpszFrom [I] Source path
|
|
* dwAttrFrom [I] File attribute of source path
|
|
* lpszTo [I] Destination path
|
|
* dwAttrTo [I] File attributes of destination path
|
|
*
|
|
* RETURNS
|
|
* TRUE If a relative path can be formed. lpszPath contains the new path
|
|
* FALSE If the paths are not relative or any parameters are invalid
|
|
*
|
|
* NOTES
|
|
* lpszTo should be at least MAX_PATH in length.
|
|
* Calling this function with relative paths for lpszFrom or lpszTo may
|
|
* give erroneous results.
|
|
*
|
|
* The Win32 version of this function contains a bug where the lpszTo string
|
|
* may be referenced 1 byte beyond the end of the string. As a result random
|
|
* garbage may be written to the output path, depending on what lies beyond
|
|
* the last byte of the string. This bug occurs because of the behaviour of
|
|
* PathCommonPrefix() (see notes for that function), and no workaround seems
|
|
* possible with Win32.
|
|
* This bug has been fixed here, so for example the relative path from "\\"
|
|
* to "\\" is correctly determined as "." in this implementation.
|
|
*/
|
|
</screen>
|
|
</sect2>
|
|
|
|
<sect2 id="api-docs-advanced">
|
|
<title>Advanced API Documentation</title>
|
|
|
|
<para>
|
|
There is no markup language for formatting API comments, since they should
|
|
be easily readable by any developer working on the source file. A number of
|
|
constructs are treated specially however, and are noted here. You can use these
|
|
constructs to enhance the usefulness of the generated documentation by making it
|
|
easier to read and referencing related documents.
|
|
</para>
|
|
|
|
<para>
|
|
Any valid c identifier that ends with <command>()</command> is taken to
|
|
be an API function and is formatted accordingly. When generating documentation,
|
|
this text will become a link to that API call, if the output type supports
|
|
hyperlinks or their equivalent.
|
|
</para>
|
|
|
|
<para>
|
|
Similarly, any interface name starting with a capital I and followed by the
|
|
words "reference" or "object" become a link to that objects documentation.
|
|
</para>
|
|
|
|
<para>
|
|
Where an Ascii and Unicode version of a function are available, it is
|
|
recommended that you document only the Ascii version and have the Unicode
|
|
version refer to the Ascii one, as follows:
|
|
</para>
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToW [SHLWAPI.@]
|
|
*
|
|
* See PathRelativePathToA.
|
|
*/
|
|
</screen>
|
|
<para>
|
|
Alternately you may use the following form:
|
|
</para>
|
|
<screen>
|
|
/*************************************************************************
|
|
* PathRelativePathToW [SHLWAPI.@]
|
|
*
|
|
* Unicode version of PathRelativePathToA.
|
|
*/
|
|
</screen>
|
|
|
|
<para>
|
|
You may also use this construct in any other section, such as <command>NOTES</command>.
|
|
</para>
|
|
|
|
<para>
|
|
Any numbers and text in quotes (<command>""</command>) are highlighted.
|
|
</para>
|
|
|
|
<para>
|
|
Words in all uppercase are assumed to be API constants and are highlighted. If
|
|
you want to emphasize something in the documentation, put it in a section by itself
|
|
rather than making it upper case.
|
|
</para>
|
|
|
|
<para>
|
|
Blank lines in a section cause a new paragraph to be started. Blank lines
|
|
at the start and end of sections are ignored.
|
|
</para>
|
|
|
|
<para>
|
|
Any comment line starting with (<command>"*|"</command>) is treated as raw text and
|
|
is not pre-processed before being output. This should be used for code listings,
|
|
tables and any text that should remain unformatted.
|
|
</para>
|
|
|
|
<para>
|
|
Any line starting with a single word followed by a colon (<command>:</command>)
|
|
is assumed to be case listing and is emphasized and put in its own paragraph. This
|
|
is most often used for return values, as in the example section below.
|
|
</para>
|
|
<screen>
|
|
* RETURNS
|
|
* Success: TRUE. Something happens that is documented here.
|
|
* Failure: FALSE. The reasons why this call can fail are listed here.
|
|
</screen>
|
|
|
|
<para>
|
|
Any line starting with a (<command>-</command>) is put into a paragraph by itself.
|
|
this allows lists to avoid being run together.
|
|
</para>
|
|
|
|
<para>
|
|
If you are in doubt as to how your comment will look, try generating the API
|
|
documentation and checking the output.
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="api-docs-extra">
|
|
<title>Extra API Documentation</title>
|
|
|
|
<para>
|
|
Simply documenting the API calls available provides a great deal of information to
|
|
developers working with the Win32 API. However additional documentation is needed
|
|
before the API Guide can be considered truly useful or comprehensive. For example,
|
|
COM objects that are available for developers use should be documented, along with
|
|
the interface(s) that those objects export. Also, it would be helpful to document
|
|
each dll, to provide some structure to the documentation.
|
|
</para>
|
|
|
|
<para>
|
|
To facilitate providing extra documentation, you can create comments that provide
|
|
extra documentation on functions, or on keywords such as the name of a COM interface
|
|
or a type definition.
|
|
</para>
|
|
|
|
<para>
|
|
These items are generated using the same formatting rules as described earlier. The
|
|
only difference is the first line of the comment, which indicates to the generator
|
|
that the documentation is supplemental and does not describe an export from the dll
|
|
being processed.
|
|
</para>
|
|
|
|
<para>
|
|
Lets assume you have implemented a COM interface that you want to document; we'll
|
|
use the name <command>IExample</command> as an example here. Your comment would
|
|
look like the following (assuming you are exporting this object from
|
|
<filename>EXAMPLE.DLL</filename>):
|
|
<screen>
|
|
/*************************************************************************
|
|
* IExample {EXAMPLE}
|
|
*
|
|
* The IExample object provides lots of interesting functionality.
|
|
* ...
|
|
*/
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
Format this documentation exactly as you would a standard export. The only
|
|
difference is the use of curly brackets to mark this documentation as supplemental.
|
|
The generator will output this documentation using the name given before the
|
|
DLL name, and will link to it from the main DLL page. In addition, if you have
|
|
referred to the comment name in other documentation using "IExample interface",
|
|
"IExample object", or "IExample()", those references will point to this documentation.
|
|
</para>
|
|
|
|
<para>
|
|
If you document you COM interfaces this way then all following extra comments that
|
|
follow in the same source file that begin with the same document title will be added
|
|
as references to this comment before it is output. For an example of this see
|
|
<filename>dlls/oleaut32/safearray.c</filename>. This uses an extra comment to document
|
|
The SafeArray functions and link them together under one heading.
|
|
</para>
|
|
|
|
<para>
|
|
As a special case, if you use the DLL name as the comment name, the comment will
|
|
be treated as documentation on the DLL itself. When the documentation for the DLL
|
|
is processed, the contents of the comment will be placed before the generated
|
|
statistics, exports and other information that makes up a DLL's documentation page.
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="api-docs-generating">
|
|
<title>Generating API Documentation</title>
|
|
|
|
<para>
|
|
Having edited or added new API documentation to a source code file, you
|
|
should generate the documentation to ensure that the result is what you
|
|
expected. Wine includes a tool (slightly misleadingly) called
|
|
<command>c2man.pl</command> in the <filename>tools/</filename> directory
|
|
which is used to generate the documentation from the source code.
|
|
</para>
|
|
|
|
<para>
|
|
You can run <command>c2man.pl</command> manually for testing purposes; it is
|
|
a fairly simple perl script which parses <filename>.c</filename> files
|
|
to create output in several formats. If you wish to try this you may want
|
|
to run it with no arguments, which will cause it to print usage information.
|
|
</para>
|
|
|
|
<para>
|
|
An easier way is to use Wines build system. To create man pages for a given
|
|
dll, just type <command>make man</command> from within the dlls directory
|
|
or type <command>make manpages</command> in the root directory of the Wine
|
|
source tree. You can then check that a man page was generated for your function,
|
|
it should be present in the <filename>documentation/man3w</filename> directory
|
|
with the same name as the function.
|
|
</para>
|
|
|
|
<para>
|
|
Once you have generated the man pages from the source code, running
|
|
<command>make install</command> will install them for you. By default they are
|
|
installed in section 3w of the manual, so they don't conflict with any existing
|
|
man page names. So, to read the man page you should use
|
|
<command>man -S 3w {name}</command>. Alternately you can edit
|
|
<filename>/etc/man.config</filename> and add 3w to the list of search paths
|
|
given in the variable <emphasis>MANSECT</emphasis>.
|
|
</para>
|
|
|
|
<para>
|
|
You can also generate HTML output for the API documentation, in this case the
|
|
make command is <command>make doc-html</command> in the dll directory,
|
|
or <command>make htmlpages</command> from the root. The output will be
|
|
placed by default under <filename>documentation/html</filename>. Similarly
|
|
you can create SGML source code to produce the <emphasis>Wine Api Guide</emphasis>
|
|
with the command <command>make sgmlpages</command>.
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="wine-docbook">
|
|
<title>The Wine DocBook System</title>
|
|
|
|
<para>
|
|
Written by &name-john-sheets; <email>&email-john-sheets;</email>
|
|
</para>
|
|
<para>
|
|
Modified by &name-tony-lambregts; <email>&email-tony-lambregts;</email> Nov. 2002
|
|
</para>
|
|
|
|
<sect2 id="writing-docbook">
|
|
<title>Writing Documentation with DocBook</title>
|
|
|
|
<para>
|
|
DocBook is a flavour of <acronym>SGML</acronym>
|
|
(<firstterm>Standard Generalized Markup
|
|
Language</firstterm>), a syntax for marking up the contents
|
|
of documents. HTML is another very common flavour of SGML;
|
|
DocBook markup looks very similar to HTML markup, although
|
|
the names of the markup tags differ.
|
|
</para>
|
|
<sect3>
|
|
<title>Getting Started</title>
|
|
<note>
|
|
<title>Why SGML?</title>
|
|
<para>
|
|
The simple answer to that is that SGML allows you
|
|
to create multiple formats of a given document from a single
|
|
source. Currently it is used to create HTML, PDF and PS
|
|
(PostScript) versions of the Wine books.
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<title>What do I need?</title>
|
|
<para>
|
|
You need the SGML tools. There are various places where you
|
|
can get them. The most generic way of getting them is from their
|
|
source as discussed below.
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<title>Quick instructions</title>
|
|
<para>
|
|
These are the basic steps to create the Wine books from the SGML source.
|
|
</para>
|
|
</note>
|
|
|
|
<orderedlist>
|
|
|
|
<listItem><para>
|
|
Go to <ulink url="http://www.sgmltools.org">http://www.sgmltools.org</ulink>
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
Download all of the sgmltools packages
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
Install them all and build them (<command>./configure; make; make install</command>)
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
Switch to your toplevel Wine directory
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
Run <command>./configure</command> (or <command>make distclean && ./configure</command>)
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
Switch to the <filename>documentation/</filename> directory
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
run <command>./make_winehq</command>
|
|
</para></listitem>
|
|
|
|
<listItem><para>
|
|
View <filename>wine-doc/index.html</filename> in your favorite browser
|
|
</para></listitem>
|
|
|
|
</orderedlist>
|
|
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Getting SGML for various distributions</title>
|
|
<para>
|
|
Most Linux distributions have everything you need already
|
|
bundled up in package form. Unfortunately, each
|
|
distribution seems to handle its SGML environment
|
|
differently, installing it into different paths, and
|
|
naming its packages according to its own whims.
|
|
</para>
|
|
|
|
<sect4>
|
|
<title>SGML on Red Hat</title>
|
|
<para>
|
|
The following packages seem to be sufficient for Red Hat 7.1. You
|
|
will want to be careful about the order in which you install the
|
|
RPMs.
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
sgml-common-*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
openjade-*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
perl-SGMLSpm-*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-dtd*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-style-dsssl-*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
tetex-*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
jadetex-*.rpm
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-utils-*.rpm
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
You can also use ghostscript to view the ps format output and
|
|
Adobe Acrobat 4 to view the pdf file.
|
|
</para>
|
|
</sect4>
|
|
|
|
<sect4>
|
|
<title>SGML on Debian</title>
|
|
<para>
|
|
This is not a definitive listing yet, but it seems
|
|
you might need the following packages:
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
docbook
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-dsssl
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-utils
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-xml
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
docbook-xsl
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
sgml-base
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
sgml-data
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
tetex-base
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
tetex-bin
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
jade
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
jadetex
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
</sect4>
|
|
|
|
<sect4>
|
|
<title>SGML on Other Distributions</title>
|
|
<note>
|
|
<title>Fix me</title>
|
|
<para>
|
|
List package names and install locations...
|
|
</para>
|
|
</note>
|
|
</sect4>
|
|
</sect3>
|
|
<sect3>
|
|
<title>Terminology</title>
|
|
|
|
<para>
|
|
SGML markup contains a number of syntactical elements that
|
|
serve different purposes in the markup. We'll run through
|
|
the basics here to make sure we're on the same page when
|
|
we refer to SGML semantics.
|
|
</para>
|
|
<para>
|
|
The basic currency of SGML is the
|
|
<firstterm>tag</firstterm>. A simple tag consists of a
|
|
pair of angle brackets and the name of the tag. For
|
|
example, the <sgmltag>para</sgmltag> tag would appear in
|
|
an SGML document as <sgmltag
|
|
class="starttag">para</sgmltag>. This start tag indicates
|
|
that the immediately following text should be classified
|
|
according to the tag. In regular SGML, each opening tag
|
|
must have a matching end tag to show where the start tag's
|
|
contents end. End tags begin with
|
|
<quote><literal></</literal></quote> markup, e.g.,
|
|
<sgmltag class="endtag">para</sgmltag>.
|
|
</para>
|
|
<para>
|
|
The combination of a start tag, contents, and an end tag
|
|
is called an <firstterm>element</firstterm>. SGML
|
|
elements can be nested inside of each other, or contain
|
|
only text, or may be a combination of both text and other
|
|
elements, although in most cases it is better to limit
|
|
your elements to one or the other.
|
|
</para>
|
|
<para>
|
|
The <acronym>XML</acronym> (<firstterm>eXtensible Markup
|
|
Language</firstterm>) specification, a modern subset of
|
|
the SGML specification, adds a so-called <firstterm>empty
|
|
tag</firstterm>, for elements that contain no text
|
|
content. The entire element is a single tag, ending with
|
|
<quote><literal>/></literal></quote>, e.g.,
|
|
<sgmltag><xref/></sgmltag>. However, use of this
|
|
tag style restricts you to XML DocBook processing, and
|
|
your document may no longer compile with SGML-only
|
|
processing systems.
|
|
</para>
|
|
<!-- *** Note: We could normally use the "emptytag"
|
|
attribute for XML empty tags, but that's only a recent
|
|
addition, and we don't want to screw up documents
|
|
generated against older stylesheets.
|
|
*** -->
|
|
<para>
|
|
Often a processing system will need more information about
|
|
an element than you can provide with just tags. SGML
|
|
allows you to add extra <quote>hints</quote> in the form
|
|
of SGML <firstterm>attributes</firstterm> to pass along
|
|
this information. The most common use of attributes in
|
|
DocBook is giving specific elements a name, or an ID, so
|
|
you can refer to it from elsewhere. This ID can be used
|
|
for many things, including file-naming for HTML output,
|
|
hyper-linking to specific parts of the document, and even
|
|
pulling text from that element (see the <sgmltag
|
|
class="starttag">xref</sgmltag> tag).
|
|
</para>
|
|
<para>
|
|
An SGML attribute appears inside the start tag, between
|
|
the < and > brackets. For example, if you wanted to
|
|
set the <sgmltag class="attribute">id</sgmltag> attribute
|
|
of the <sgmltag class="starttag">book</sgmltag> element to
|
|
<quote>mybook</quote>, you would create a start tag like
|
|
this: <programlisting><book id="mybook"></programlisting>
|
|
</para>
|
|
<para>
|
|
Notice that the contents of the attribute are enclosed in
|
|
quote marks. These quotes are optional in SGML, but
|
|
mandatory in XML. It's a good habit to use quotes, as it
|
|
will make it much easier to migrate your documents to an
|
|
XML processing system later on.
|
|
</para>
|
|
<para>
|
|
You can also specify more than one attribute in a single
|
|
tag: <programlisting><book id="mybook" status="draft"></programlisting>
|
|
</para>
|
|
<para>
|
|
Another commonly used type of SGML markup is the
|
|
<firstterm>entity</firstterm>. An entity lets you
|
|
associate a block of text with a name. You declare the
|
|
entity once, at the beginning of your document, and can
|
|
invoke it as many times as you like throughout the
|
|
document. You can use entities as shorthand, or to make
|
|
it easier to maintain certain phrases in a central
|
|
location, or even to insert the contents of an entire file
|
|
into your document.
|
|
</para>
|
|
<para>
|
|
An entity in your document is always surrounded by the
|
|
<quote>&</quote> and <quote>;</quote> characters. One
|
|
entity you'll need sooner or later is the one for the
|
|
<quote><</quote> character. Since SGML expects all
|
|
tags to begin with a <quote><</quote>, the
|
|
<quote><</quote> is a reserved character. To use it in
|
|
your document (as I am doing here), you must insert it
|
|
with the <literal>&lt;</literal> entity. Each time
|
|
the SGML processor encounters <literal>&lt;</literal>,
|
|
it will place a literal <quote><</quote> in the output
|
|
document. Similarly you must use the <literal>&gt;</literal>
|
|
and <literal>&amp;</literal> entities for the
|
|
<quote>></quote> and <quote>&</quote> characters.
|
|
</para>
|
|
<para>
|
|
The final term you'll need to know when writing simple
|
|
DocBook documents is the <acronym>DTD</acronym>
|
|
(<firstterm>Document Type Declaration</firstterm>). The
|
|
DTD defines the flavour of SGML a given document is written
|
|
in. It lists all the legal tag names, like <sgmltag
|
|
class="starttag">book</sgmltag>, <sgmltag
|
|
class="starttag">para</sgmltag>, and so on, and declares
|
|
how those tags are allowed to be used together. For
|
|
example, it doesn't make sense to put a <sgmltag
|
|
class="starttag">book</sgmltag> element inside a <sgmltag
|
|
class="starttag">para</sgmltag> paragraph element -- only
|
|
the reverse.
|
|
</para>
|
|
<para>
|
|
The DTD thus defines the legal structure of the document.
|
|
It also declares which attributes can be used with which
|
|
tags. The SGML processing system can use the DTD to make
|
|
sure the document is laid out properly before attempting
|
|
to process it. SGML-aware text editors like <link
|
|
linkend="emacs-psgml">Emacs</link> can also use the DTD to
|
|
guide you while you write, offering you choices about
|
|
which tags you can add in different places in the
|
|
document, and beeping at you when you try to add a tag
|
|
where it doesn't belong.
|
|
</para>
|
|
<para>
|
|
Generally, you will declare which DTD you want to use as
|
|
the first line of your SGML document. In the case of
|
|
DocBook, you will use something like this:
|
|
<programlisting><!doctype book PUBLIC "-//OASIS//DTD
|
|
DocBook V3.1//EN" []> <book> ...
|
|
</book></programlisting>
|
|
</para>
|
|
<para>
|
|
Note that you must specify your toplevel element inside
|
|
the doctype declaration. If you were writing an article
|
|
rather than a book, you might use this declaration instead:
|
|
<programlisting><!doctype article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" []>
|
|
<article>
|
|
...
|
|
</article></programlisting>
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="sgml-document">
|
|
<title>The Document</title>
|
|
<para>
|
|
Once you're comfortable with SGML, creating a DocBook
|
|
document is quite simple and straightforward. Even
|
|
though DocBook contains over 300 different tags, you can
|
|
usually get by with only a small subset of those tags.
|
|
Most of them are for inline formatting, rather than for
|
|
document structuring. Furthermore, the common tags have
|
|
short, intuitive names.
|
|
</para>
|
|
<para>
|
|
Below is a (completely nonsensical) example to illustrate
|
|
how a simple document might be laid out. Notice that all
|
|
<sgmltag class="starttag">chapter</sgmltag> and <sgmltag
|
|
class="starttag">sect1</sgmltag> elements have <sgmltag
|
|
class="attribute">id</sgmltag> attributes. This is not
|
|
mandatory, but is a good habit to get into, as DocBook is
|
|
commonly converted into HTML, with a separate generated
|
|
file for each <sgmltag class="starttag">book</sgmltag>,
|
|
<sgmltag class="starttag">chapter</sgmltag>, and/or <sgmltag
|
|
class="starttag">sect1</sgmltag> element. If the given
|
|
element has an <sgmltag class="attribute">id</sgmltag>
|
|
attribute, the processor will typically name the file
|
|
accordingly. Thus, the below document might result in
|
|
<filename>index.html</filename>,
|
|
<filename>chapter-one.html</filename>,
|
|
<filename>blobs.html</filename>, and so on.
|
|
</para>
|
|
<para>
|
|
Also notice the text marked off with <quote><!--
|
|
</quote> and <quote> --></quote> characters. These
|
|
denote SGML comments. SGML processors will completely
|
|
ignore anything between these markers, similar to
|
|
<quote>/*</quote> and <quote>*/</quote> comments in C
|
|
source code.
|
|
</para>
|
|
|
|
<!-- Encase the following SGML excerpt inside a CDATA
|
|
block so we don't have to bother converting all
|
|
brackets to entities
|
|
-->
|
|
<programlisting>
|
|
<![CDATA[
|
|
<!doctype book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" []>
|
|
<book id="index">
|
|
<bookinfo>
|
|
<title>A Poet's Guide to Nonsense</title>
|
|
</bookinfo>
|
|
|
|
<chapter id="chapter-one">
|
|
<title>Blobs and Gribbles</title>
|
|
|
|
<!-- This section contains only one major topic -->
|
|
<sect1 id="blobs">
|
|
<title>The Story Behind Blobs</title>
|
|
<para>
|
|
Blobs are often mistaken for ice cubes and rain
|
|
puddles...
|
|
</para>
|
|
</sect1>
|
|
|
|
<!-- This section contains embedded sub-sections -->
|
|
<sect1 id="gribbles">
|
|
<title>Your Friend the Gribble</title>
|
|
<para>
|
|
A Gribble is a cute, unassuming little fellow...
|
|
</para>
|
|
|
|
<sect2 id="gribble-temperament">
|
|
<title>Gribble Temperament</title>
|
|
<para>
|
|
When left without food for several days...
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="gribble-appearance">
|
|
<title>Gribble Appearance</title>
|
|
<para>
|
|
Most Gribbles have a shock of white fur running from...
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
|
|
<chapter id="chapter-two">
|
|
<title>Phantasmagoria</title>
|
|
|
|
<sect1 id="dretch-pools">
|
|
<title>Dretch Pools</title>
|
|
|
|
<para>
|
|
When most poets think of Dretch Pools, they tend to...
|
|
</para>
|
|
</sect>
|
|
</chapter>
|
|
</book>
|
|
]]>
|
|
</programlisting>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Common Elements</title>
|
|
<para>
|
|
Once you get used to the syntax of SGML, the next hurdle
|
|
in writing DocBook documentation is to learn the many
|
|
DocBook-specific tag names, and when to use them. DocBook
|
|
was created for technical documentation, and as such, the
|
|
tag names and document structure are slanted towards the
|
|
needs of such documentation.
|
|
</para>
|
|
<para>
|
|
To cover its target audience, DocBook declares a wide
|
|
variety of specialized tags, including tags for formatting
|
|
source code (with somewhat of a C/C++ bias), computer
|
|
prompts, GUI application features, keystrokes, and so on.
|
|
DocBook also includes tags for universal formatting needs,
|
|
like headers, footnotes, tables, and graphics.
|
|
</para>
|
|
<para>
|
|
We won't cover all of these elements here (over 300
|
|
DocBook tags exist!), but we will cover the basics. To
|
|
learn more about the other tags, check out the official
|
|
DocBook guide, at <ulink
|
|
url="http://docbook.org">http://docbook.org</ulink>. To
|
|
see how they are used in practice, download the SGML
|
|
source for this manual (the Wine Developer Guide) and
|
|
browse through it, comparing it to the generated HTML (or
|
|
PostScript or PDF).
|
|
</para>
|
|
<para>
|
|
There are often many correct ways to mark up a given piece
|
|
of text, and you may have to make guesses about which tag
|
|
to use. Sometimes you'll have to make compromises.
|
|
However, remember that it is possible to further <link
|
|
linkend="docbook-tweaking">customize the output</link> of
|
|
the SGML processors. If you don't like the way a certain
|
|
tag looks in HTML, that doesn't mean you should choose a
|
|
different tag based on its output formatting. The
|
|
processing stylesheets can be altered to fix the
|
|
formatting of that same tag everywhere in the document
|
|
(not just in the place you're working on). For example,
|
|
if you're frustrated that the <sgmltag
|
|
class="starttag">systemitem</sgmltag> tag doesn't produce
|
|
any formatting by default, you should fix the stylesheets,
|
|
not change the valid <sgmltag
|
|
class="starttag">systemitem</sgmltag> tag to, for example,
|
|
an <sgmltag class="starttag">emphasis</sgmltag> tag.
|
|
</para>
|
|
<para>
|
|
Here are the common SGML elements:
|
|
</para>
|
|
|
|
<variablelist>
|
|
<title>Structural Elements</title>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">book</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
The book is the most common toplevel element, and is
|
|
probably the one you should use for your document.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">set</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
If you want to group more than one book into a
|
|
single unit, you can place them all inside a set.
|
|
This is useful when you want to bundle up
|
|
documentation in alternate ways. We do this with
|
|
the Wine documentation, using
|
|
<sgmltag class="starttag">book</sgmltag> to
|
|
put each Wine guide into a separate directory (see
|
|
<filename>documentation/wine-devel.sgml</filename>,
|
|
etc.).
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">chapter</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A <sgmltag class="starttag">chapter</sgmltag>
|
|
element includes a single entire chapter of the
|
|
book.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">part</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
If the chapters in your book fall into major
|
|
categories or groupings (as in the Wine Developer
|
|
Guide), you can place each collection of chapters
|
|
into a <sgmltag class="starttag">part</sgmltag>
|
|
element.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">sect?</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
DocBook has many section elements to divide the
|
|
contents of a chapter into smaller chunks. The
|
|
encouraged approach is to use the numbered section
|
|
tags, <sgmltag class="starttag">sect1</sgmltag>,
|
|
<sgmltag class="starttag">sect2</sgmltag>, <sgmltag
|
|
class="starttag">sect3</sgmltag>, <sgmltag
|
|
class="starttag">sect4</sgmltag>, and <sgmltag
|
|
class="starttag">sect5</sgmltag> (if necessary).
|
|
These tags must be nested in order: you can't place
|
|
a <sgmltag class="starttag">sect3</sgmltag> directly
|
|
inside a <sgmltag class="starttag">sect1</sgmltag>.
|
|
You have to nest the <sgmltag
|
|
class="starttag">sect3</sgmltag> inside a <sgmltag
|
|
class="starttag">sect2</sgmltag>, and so forth.
|
|
Documents with these explicit section groupings are
|
|
easier for SGML processors to deal with, and lead to
|
|
better organized documents. DocBook also supplies a
|
|
<sgmltag class="starttag">section</sgmltag> element
|
|
which you can nest inside itself, but its use is
|
|
discouraged in favor of the numbered section tags.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">title</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
The title of a book, chapter, part, section, etc.
|
|
In most of the major structural elements, like
|
|
<sgmltag class="starttag">chapter</sgmltag>,
|
|
<sgmltag class="starttag">part</sgmltag>, and the
|
|
various section tags, <sgmltag
|
|
class="starttag">title</sgmltag> is mandatory. In
|
|
other elements like <sgmltag
|
|
class="starttag">book</sgmltag> and <sgmltag
|
|
class="starttag">note</sgmltag>, it's optional.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">para</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
The basic unit of text is the paragraph, represented
|
|
by the <sgmltag class="starttag">para</sgmltag> tag.
|
|
This is probably the tag you'll use most often. In
|
|
fact, in a simple document, you can probably get
|
|
away with using only <sgmltag
|
|
class="starttag">book</sgmltag>, <sgmltag
|
|
class="starttag">chapter</sgmltag>, <sgmltag
|
|
class="starttag">title</sgmltag>, and <sgmltag
|
|
class="starttag">para</sgmltag>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">article</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
For shorter, more targeted documents, like topic
|
|
pieces and whitepapers, you can use <sgmltag
|
|
class="starttag">article</sgmltag> as your toplevel
|
|
element.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<variablelist>
|
|
<title>Inline Formatting Elements</title>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">filename</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
The name of a file. You can optionally set the
|
|
<sgmltag class="attribute">class</sgmltag> attribute
|
|
to <literal>Directory</literal>,
|
|
<literal>HeaderFile</literal>, and
|
|
<literal>SymLink</literal> to further classify the
|
|
filename.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">userinput</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Literal text entered by the user.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">computeroutput</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Literal text output by the computer.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">literal</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A catch-all element for literal computer data. Its
|
|
use is somewhat vague; try to use a more specific
|
|
tag if possible, like <sgmltag
|
|
class="starttag">userinput</sgmltag> or <sgmltag
|
|
class="starttag">computeroutput</sgmltag>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">quote</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
An inline quotation. This tag typically inserts
|
|
quotation marks for you, so you would write <sgmltag
|
|
class="starttag">quote</sgmltag>This is a
|
|
quote<sgmltag class="endtag">quote</sgmltag> rather
|
|
than "This is a quote". This usage may be a little
|
|
bulkier, but it does allow for automated formatting
|
|
of all quoted material in the document. Thus, if
|
|
you wanted all quotations to appear in italic, you
|
|
could make the change once in your stylesheet,
|
|
rather than doing a search and replace throughout
|
|
the document. For larger chunks of quoted text, you
|
|
can use <sgmltag
|
|
class="starttag">blockquote</sgmltag>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">note</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Insert a side note for the reader. By default, the
|
|
SGML processor usually prefixes the content with
|
|
"Note:". You can change this text by adding a
|
|
<sgmltag class="starttag">title</sgmltag> element.
|
|
Thus, to add a visible FIXME comment to the
|
|
documentation, you might write:
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
<note>
|
|
<title>FIXME</title>
|
|
<para>This section needs more info about...</para>
|
|
</note>
|
|
]]></programlisting>
|
|
<para>
|
|
The results will look something like this:
|
|
</para>
|
|
<note>
|
|
<title>FIXME</title>
|
|
<para>This section needs more info about...</para>
|
|
</note>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">sgmltag</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Used for inserting SGML tags, etc., into a SGML
|
|
document without resorting to a lot of entity
|
|
quoting, e.g., &lt;. You can change the
|
|
appearance of the text with the <sgmltag
|
|
class="attribute">class</sgmltag> attribute. Some
|
|
common values of this are
|
|
<literal>starttag</literal>,
|
|
<literal>endtag</literal>,
|
|
<literal>attribute</literal>,
|
|
<literal>attvalue</literal>, and even
|
|
<literal>sgmlcomment</literal>. See this SGML file,
|
|
<filename>documentation/documentation.sgml</filename>,
|
|
for examples.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">prompt</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
The text used for a computer prompt, for example a
|
|
shell prompt, or command-line application prompt.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">replaceable</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Meta-text that should be replaced by the user, not
|
|
typed in literally, e.g., in command descriptions
|
|
and <parameter>--help</parameter> outputs.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">constant</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A programming constant, e.g.,
|
|
<constant>MAX_PATH</constant>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">symbol</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A symbolic value replaced, for example, by a
|
|
pre-processor. This applies primarily to C macros,
|
|
but may have other uses. Use the <sgmltag
|
|
class="starttag">constant</sgmltag> tag instead of
|
|
<sgmltag class="starttag">symbol</sgmltag> where
|
|
appropriate.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">function</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A programming function name.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">parameter</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Programming language parameters you pass with a
|
|
function.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">option</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Parameters you pass to a command-line executable.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">varname</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Variable name, typically in a programming language.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">type</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Programming language types, e.g., from a typedef
|
|
definition. May have other uses, too.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">structname</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
The name of a C-language <type>struct</type>
|
|
declaration, e.g., <structname>sockaddr</structname>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">structfield</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A field inside a C <type>struct</type>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">command</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
An executable binary, e.g., <command>wine</command>
|
|
or <command>ls</command>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">envar</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
An environment variable, e.g, <envar>$PATH</envar>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">systemitem</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A generic catch-all for system-related things, like
|
|
OS names, computer names, system resources, etc.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">email</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
An email address. The SGML processor will typically
|
|
add extra formatting characters, and even a
|
|
<literal>mailto:</literal> link for HTML pages.
|
|
Usage: <sgmltag
|
|
class="starttag">email</sgmltag>user@host.com<sgmltag
|
|
class="endtag">email</sgmltag>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">firstterm</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Special emphasis for introducing a new term. Can
|
|
also be linked to a <sgmltag
|
|
class="starttag">glossary</sgmltag> entry, if
|
|
desired.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<variablelist>
|
|
<title>Item Listing Elements</title>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">itemizedlist</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
For bulleted lists, no numbering. You can tweak the
|
|
layout with SGML attributes.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">orderedlist</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A numbered list; the SGML processor will insert the
|
|
numbers for you. You can suggest numbering styles
|
|
with the <sgmltag
|
|
class="attribute">numeration</sgmltag> attribute.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">simplelist</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A very simple list of items, often inlined. Control
|
|
the layout with the <sgmltag
|
|
class="attribute">type</sgmltag> attribute.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">variablelist</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
A list of terms with definitions or descriptions,
|
|
like this very list!
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<variablelist>
|
|
<title>Block Text Quoting Elements</title>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">programlisting</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Quote a block of source code. Typically highlighted
|
|
in the output and set off from normal text.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">screen</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Quote a block of visible computer output, like the
|
|
output of a command or chunks of debug logs.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
<variablelist>
|
|
<title>Hyperlink Elements</title>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">link</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Generic hypertext link, used for pointing to other
|
|
sections within the current document. You supply
|
|
the visible text for the link, plus the name of the <sgmltag
|
|
class="attribute">id</sgmltag> attribute of the
|
|
element that you want to link to. For example:
|
|
<programlisting><link linkend="configuring-wine">the section on configuring wine</link>
|
|
...
|
|
<sect2 id="configuring-wine">
|
|
...</programlisting>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">xref</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
In-document hyperlink that can generate its own
|
|
text. Similar to the <sgmltag
|
|
class="starttag">link</sgmltag> tag, you use the
|
|
<sgmltag class="attribute">linkend</sgmltag>
|
|
attribute to specify which target element you want
|
|
to jump to:
|
|
</para>
|
|
<para>
|
|
<programlisting><xref linkend="configuring-wine">
|
|
...
|
|
<sect2 id="configuring-wine">
|
|
...</programlisting>
|
|
</para>
|
|
<para>
|
|
By default, most SGML processors will auto generate
|
|
some generic text for the <sgmltag
|
|
class="starttag">xref</sgmltag> link, like
|
|
<quote>Section 2.3.1</quote>. You can use the
|
|
<sgmltag class="attribute">endterm</sgmltag>
|
|
attribute to grab the visible text content of the
|
|
hyperlink from another element:
|
|
</para>
|
|
<para>
|
|
<programlisting><xref linkend="configuring-wine" endterm="config-title">
|
|
...
|
|
<sect2 id="configuring-wine">
|
|
<title id="config-title">Configuring Wine</title>
|
|
...</programlisting>
|
|
</para>
|
|
<para>
|
|
This would create a link to the
|
|
<symbol>configuring-wine</symbol> element,
|
|
displaying the text of the
|
|
<symbol>config-title</symbol> element for the
|
|
hyperlink. Most often, you'll add an <sgmltag
|
|
class="attribute">id</sgmltag> attribute to the
|
|
<sgmltag class="starttag">title</sgmltag> of the
|
|
section you're linking to, as above, in which case
|
|
the SGML processor will use the target's title text
|
|
for the link text.
|
|
</para>
|
|
<para>
|
|
Alternatively, you can use an <sgmltag
|
|
class="attribute">xreflabel</sgmltag> attribute in
|
|
the target element tag to specify the link text:
|
|
</para>
|
|
<programlisting><sect1 id="configuring-wine" xreflabel="Configuring Wine"></programlisting>
|
|
<note>
|
|
<para>
|
|
<sgmltag class="starttag">xref</sgmltag> is an
|
|
empty element. You don't need a closing tag for
|
|
it (this is defined in the DTD). In SGML
|
|
documents, you should use the form <sgmltag
|
|
class="starttag">xref</sgmltag>, while in XML
|
|
documents you should use
|
|
<sgmltag><xref/></sgmltag>.
|
|
</para>
|
|
</note>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">anchor</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
An invisible tag, used for inserting <sgmltag
|
|
class="attribute">id</sgmltag> attributes into a
|
|
document to link to arbitrary places (i.e., when
|
|
it's not close enough to link to the top of an
|
|
element).
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">ulink</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Hyperlink in URL form, e.g., <ulink
|
|
url="http://www.winehq.com">http://www.winehq.com</ulink>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><sgmltag class="starttag">olink</sgmltag></term>
|
|
<listitem>
|
|
<para>
|
|
Indirect hyperlink; can be used for linking to
|
|
external documents. Not often used in practice.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Multiple SGML files</title>
|
|
<para>
|
|
How to split an SGML document into multiple files...
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="sgml-environment">
|
|
<title>The SGML Environment</title>
|
|
|
|
<para>
|
|
You can write SGML/DocBook documents in any text editor you
|
|
might find (although as we'll find in <xref
|
|
linkend="emacs-psgml">, some editors are more friendly for
|
|
this task than others). However, if you want to convert
|
|
those documents into a more friendly form for reading, such
|
|
as HTML, PostScript, or PDF, you will need a working SGML
|
|
environment. This section attempts to lay out the various
|
|
SGML rendering systems, and how they are set up on the
|
|
popular Linux distributions.
|
|
</para>
|
|
|
|
<sect3>
|
|
<title>DSSSL Environment</title>
|
|
<para>
|
|
Explain tools and methodologies..
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>XSLT Environment</title>
|
|
<para>
|
|
Explain tools and methodologies...
|
|
</para>
|
|
</sect3>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="emacs-psgml">
|
|
<title>PSGML Mode in Emacs</title>
|
|
<para>
|
|
Although you can write SGML documentation in any simple text
|
|
editor, some editors provide extra support for entering SGML
|
|
tags, and for verifying that the SGML you create is valid.
|
|
SGML has been around for a long time, and many commercial
|
|
editors exist for it; however, until recently open source
|
|
SGML editors have been scarce.
|
|
</para>
|
|
<note>
|
|
<title>FIXME</title>
|
|
<para>
|
|
List the available commercial and open source SGML
|
|
editors.
|
|
</para>
|
|
</note>
|
|
<para>
|
|
The most commonly used open source SGML editor is Emacs,
|
|
with the PSGML <firstterm>mode</firstterm>, or extension.
|
|
Emacs does not supply a GUI or WYSIWYG (What You See Is What
|
|
You Get) interface, but it does provide many helpful
|
|
shortcuts for creating SGML, as well as automatic
|
|
formatting, validity checking, and the ability to create
|
|
your own macros to simplify complex, repetitive actions.
|
|
We'll touch briefly on each of these points.
|
|
</para>
|
|
<para>
|
|
The first thing you need is a working installation of Emacs
|
|
(or XEmacs), with the PSGML package. Most Linux
|
|
distributions provide both as easy-to-install packages.
|
|
</para>
|
|
<para>
|
|
Next, you'll need a working SGML environment. See <xref
|
|
linkend="sgml-environment"> for more info on setting that
|
|
up.
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="docbook-build">
|
|
<title>The DocBook Build System</title>
|
|
|
|
<sect3 id="docbook-infrastructure">
|
|
<title>Basic Infrastructure</title>
|
|
<para>
|
|
FIXME: How the build/make system works (makefiles, db2html,
|
|
jade, stylesheets).
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="docbook-tweaking">
|
|
<title>Tweaking the DSSSL stylesheets</title>
|
|
<para>
|
|
FIXME: Things you can tweak, and how to do it (examples from
|
|
default.dsl and print.dsl).
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="docbook-generating">
|
|
<title>Generating docs for Wine web sites</title>
|
|
<para>
|
|
FIXME: Explain make, rsync, etc.
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-parent-document:("wine-devel.sgml" "set" "book" "part" "chapter" "")
|
|
End:
|
|
-->
|