FreeBSD Documentation Project Primer for New Contributors
Prev | Chapter 4 XML Markup | Next

# 4.2 DocBook

DocBook was originally developed by HaL Computer Systems and O'Reilly & Associates to be a DTD for writing technical documentation [1]. Since 1998 it is maintained by the DocBook Technical Committee. As such, and unlike LinuxDoc and XHTML, DocBook is very heavily oriented towards markup that describes what something is, rather than describing how it should be presented.

> Formal Versus Informal: Some elements may exist in two forms, formal and informal. Typically, the formal version of the element will consist of a title followed by the informal version of the element. The informal version will not have a title.

The DocBook DTD is available from the Ports Collection in the `textproc/docbook` port. It is automatically installed as part of the `textproc/docproj` port.

## 4.2.1 FreeBSD Extensions

The FreeBSD Documentation Project has extended the DocBook DTD by adding some new elements. These elements serve to make some of the markup more precise.

Where a FreeBSD specific element is listed below it is clearly marked.

Throughout the rest of this document, the term “DocBook” is used to mean the FreeBSD extended DocBook DTD.

> Note: There is nothing about these extensions that is FreeBSD specific, it was just felt that they were useful enhancements for this particular project. Should anyone from any of the other *nix camps (NetBSD, OpenBSD, Linux, …) be interested in collaborating on a standard DocBook extension set, please get in touch with Documentation Engineering Team `<doceng@FreeBSD.org>`.

The FreeBSD extensions are not (currently) in the Ports Collection. They are stored in the FreeBSD Subversion tree, as head/share/xml/freebsd.dtd.

## 4.2.2 Formal Public Identifier (FPI)

In compliance with the DocBook guidelines for writing FPIs for DocBook customizations, the FPI for the FreeBSD extended DocBook DTD is:

    PUBLIC "-//FreeBSD//DTD DocBook V4.2-Based Extension//EN"

## 4.2.3 Document Structure

DocBook allows you to structure your documentation in several ways. In the FreeBSD Documentation Project we are using two primary types of DocBook document: the book and the article.

A book is organized into `<chapter>`s. This is a mandatory requirement. There may be `<part>`s between the book and the chapter to provide another layer of organization. For example, the Handbook is arranged in this way.

A chapter may (or may not) contain one or more sections. These are indicated with the `<sect1>` element. If a section contains another section then use the `<sect2>` element, and so on, up to `<sect5>`.

Chapters and sections contain the remainder of the content.

An article is simpler than a book, and does not use chapters. Instead, the content of an article is organized into one or more sections, using the same `<sect1>` (and `<sect2>` and so on) elements that are used in books.

Obviously, you should consider the nature of the documentation you are writing in order to decide whether it is best marked up as a book or an article. Articles are well suited to information that does not need to be broken down into several chapters, and that is, relatively speaking, quite short, at up to 20-25 pages of content. Books are best suited to information that can be broken up into several chapters, possibly with appendices and similar content as well.

The FreeBSD tutorials are all marked up as articles, while this document, the FreeBSD FAQ, and the FreeBSD Handbook are all marked up as books, for example.

### 4.2.3.1 Starting a Book

The content of the book is contained within the `<book>` element. As well as containing structural markup, this element can contain elements that include additional information about the book. This is either meta-information, used for reference purposes, or additional content used to produce a title page.

This additional information should be contained within `<bookinfo>`.

Example 4-19. Boilerplate `<book>` with `<bookinfo>`

    <book>
      <bookinfo>
        <title>Your Title Here</title>

        <author>
          <firstname>Your first name</firstname>
          <surname>Your surname</surname>
          <affiliation>
            <address><email>Your email address</email></address>
          </affiliation>
        </author>

        <copyright>
          <year>1998</year>
          <holder role="mailto:your email address">Your name</holder>
        </copyright>

        <releaseinfo>$FreeBSD$</releaseinfo>

        <abstract>
          <para>Include an abstract of the book's contents here.</para>
        </abstract>
      </bookinfo>

      …

    </book>

### 4.2.3.2 Starting an Article

The content of the article is contained within the `<article>` element. As well as containing structural markup, this element can contain elements that include additional information about the article. This is either meta-information, used for reference purposes, or additional content used to produce a title page.

This additional information should be contained within `<articleinfo>`.

Example 4-20. Boilerplate `<article>` with `<articleinfo>`

    <article>
      <articleinfo>
        <title>Your title here</title>

        <author>
          <firstname>Your first name</firstname>
          <surname>Your surname</surname>
          <affiliation>
            <address><email>Your email address</email></address>
          </affiliation>
        </author>

        <copyright>
          <year>1998</year>
          <holder role="mailto:your email address">Your name</holder>
        </copyright>

        <releaseinfo>$FreeBSD$</releaseinfo>

        <abstract>
          <para>Include an abstract of the article's contents here.</para>
        </abstract>
      </articleinfo>

      …

    </article>

### 4.2.3.3 Indicating Chapters

Use `<chapter>` to mark up your chapters. Each chapter has a mandatory `<title>`. Articles do not contain chapters, they are reserved for books.

Example 4-21. A Simple Chapter

    <chapter>
      <title>The Chapter's Title</title>

      ...
    </chapter>

A chapter cannot be empty; it must contain elements in addition to `<title>`. If you need to include an empty chapter then just use an empty paragraph.

Example 4-22. Empty Chapters

    <chapter>
      <title>This is An Empty Chapter</title>

      <para></para>
    </chapter>

### 4.2.3.4 Sections Below Chapters

In books, chapters may (but do not need to) be broken up into sections, subsections, and so on. In articles, sections are the main structural element, and each article must contain at least one section. Use the `<sect`n`>` element. The `n` indicates the section number, which identifies the section level.

The first `<sect`n`>` is `<sect1>`. You can have one or more of these in a chapter. They can contain one or more `<sect2>` elements, and so on, down to `<sect5>`.

Example 4-23. Sections in Chapters

    <chapter>
      <title>A Sample Chapter</title>

      <para>Some text in the chapter.</para>

      <sect1>
        <title>First Section (1.1)</title>

        &hellip;
      </sect1>

      <sect1>
        <title>Second Section (1.2)</title>

        <sect2>
          <title>First Sub-Section (1.2.1)</title>

          <sect3>
            <title>First Sub-Sub-Section (1.2.1.1)</title>

            &hellip;
          </sect3>
        </sect2>

        <sect2>
          <title>Second Sub-Section (1.2.2)</title>

          &hellip;
        </sect2>
      </sect1>
    </chapter>

> Note: This example includes section numbers in the section titles. You should not do this in your documents. Adding the section numbers is carried out by the stylesheets (of which more later), and you do not need to manage them yourself.

### 4.2.3.5 Subdividing Using `<part>` Elements

You can introduce another layer of organization between `<book>` and `<chapter>` with one or more `<part>`s. This cannot be done in an `<article>`.

    <part>
      <title>Introduction</title>

      <chapter>
        <title>Overview</title>

        ...
      </chapter>

      <chapter>
        <title>What is FreeBSD?</title>

        ...
      </chapter>

      <chapter>
        <title>History</title>

        ...
      </chapter>
    </part>

## 4.2.4 Block Elements

### 4.2.4.1 Paragraphs

DocBook supports three types of paragraphs: `<formalpara>`, `<para>`, and `<simpara>`.

Most of the time you will only need to use `<para>`. `<formalpara>` includes a `<title>` element, and `<simpara>` disallows some elements from within `<para>`. Stick with `<para>`.

Example 4-24. `<para>`

Use:

    <para>This is a paragraph.  It can contain just about any
      other element.</para>

Appearance:

This is a paragraph. It can contain just about any other element.

### 4.2.4.2 Block Quotations

A block quotation is an extended quotation from another document that should not appear within the current paragraph. You will probably only need it infrequently.

Blockquotes can optionally contain a title and an attribution (or they can be left untitled and unattributed).

Example 4-25. `<blockquote>`

Use:

    <para>A small excerpt from the US Constitution:</para>

    <blockquote>
      <title>Preamble to the Constitution of the United States</title>

      <attribution>Copied from a web site somewhere</attribution>

      <para>We the People of the United States, in Order to form a more perfect
        Union, establish Justice, insure domestic Tranquility, provide for the
        common defence, promote the general Welfare, and secure the Blessings
        of Liberty to ourselves and our Posterity, do ordain and establish this
        Constitution for the United States of America.</para>
    </blockquote>

Appearance:

A small excerpt from the US Constitution:

| Preamble to the Constitution of the United States We the People of the United States, in Order to form a more perfect Union, establish Justice, insure domestic Tranquility, provide for the common defence, promote the general Welfare, and secure the Blessings of Liberty to ourselves and our Posterity, do ordain and establish this Constitution for the United States of America. |
--Copied from a web site somewhere |

### 4.2.4.3 Tips, Notes, Warnings, Cautions, Important Information and Sidebars

You may need to include extra information separate from the main body of the text. Typically this is “meta” information that the user should be aware of.

Depending on the nature of the information, one of `<tip>`, `<note>`, `<warning>`, `<caution>`, and `<important>` should be used. Alternatively, if the information is related to the main text but is not one of the above, use `<sidebar>`.

The circumstances in which to choose one of these elements over another is unclear. The DocBook documentation suggests:

- A Note is for information that should be heeded by all readers.

- An Important element is a variation on Note.

- A Caution is for information regarding possible data loss or software damage.

- A Warning is for information regarding possible hardware damage or injury to life or limb.

Example 4-26. `<warning>`

Use:

    <warning>
      <para>Installing FreeBSD may make you want to delete Windows from your
        hard disk.</para>
    </warning>

Appearance:

> Warning: Installing FreeBSD may make you want to delete Windows from your hard disk.

### 4.2.4.4 Lists and Procedures

You will often need to list pieces of information to the user, or present them with a number of steps that must be carried out in order to accomplish a particular goal.

In order to do this, use `<itemizedlist>`, `<orderedlist>`, or `<procedure>`[2]

`<itemizedlist>` and `<orderedlist>` are similar to their counterparts in HTML, `<ul>` and `<ol>`. Each one consists of one or more `<listitem>` elements, and each `<listitem>` contains one or more block elements. The `<listitem>` elements are analogous to HTML's `<li>` tags. However, unlike HTML, they are required.

`<procedure>` is slightly different. It consists of `<step>`s, which may in turn consists of more `<step>`s or `<substep>`s. Each `<step>` contains block elements.

Example 4-27. `<itemizedlist>`, `<orderedlist>`, and `<procedure>`

Use:

    <itemizedlist>
      <listitem>
        <para>This is the first itemized item.</para>
      </listitem>

      <listitem>
        <para>This is the second itemized item.</para>
      </listitem>
    </itemizedlist>

    <orderedlist>
      <listitem>
        <para>This is the first ordered item.</para>
      </listitem>

      <listitem>
        <para>This is the second ordered item.</para>
      </listitem>
    </orderedlist>

    <procedure>
      <step>
        <para>Do this.</para>
      </step>

      <step>
        <para>Then do this.</para>
      </step>

      <step>
        <para>And now do this.</para>
      </step>
    </procedure>

Appearance:

- This is the first itemized item.

- This is the second itemized item.

1. This is the first ordered item.

2. This is the second ordered item.

1. Do this.

2. Then do this.

3. And now do this.

### 4.2.4.5 Showing File Samples

If you want to show a fragment of a file (or perhaps a complete file) to the user, wrap it in the `<programlisting>` element.

White space and line breaks within `<programlisting>` are significant. In particular, this means that the opening tag should appear on the same line as the first line of the output, and the closing tag should appear on the same line as the last line of the output, otherwise spurious blank lines may be included.

Example 4-28. `<programlisting>`

Use:

    <para>When you have finished, your program should look like
      this:</para>

    <programlisting>#include &lt;stdio.h&gt;

    int
    main(void)
    {
        printf("hello, world\n");
    }</programlisting>

Notice how the angle brackets in the `#include` line need to be referenced by their entities instead of being included literally.

Appearance:

When you have finished, your program should look like this:

    #include <stdio.h>

    int
    main(void)
    {
        printf("hello, world\n");
    }

### 4.2.4.6 Callouts

A callout is a mechanism for referring back to an earlier piece of text or specific position within an earlier example without linking to it within the text.

To do this, mark areas of interest in your example (`<programlisting>`, `<literallayout>`, or whatever) with the `<co>` element. Each element must have a unique `id` assigned to it. After the example include a `<calloutlist>` that refers back to the example and provides additional commentary.

Example 4-29. `<co>` and `<calloutlist>`

    <para>When you have finished, your program should look like
      this:</para>

    <programlisting>#include &lt;stdio.h&gt; <co id="co-ex-include"/>

    int <co id="co-ex-return"/>
    main(void)
    {
        printf("hello, world\n"); <co id="co-ex-printf"/>
    }</programlisting>

    <calloutlist>
      <callout arearefs="co-ex-include">
        <para>Includes the standard IO header file.</para>
      </callout>

      <callout arearefs="co-ex-return">
        <para>Specifies that <function>main()</function> returns an
          int.</para>
      </callout>

      <callout arearefs="co-ex-printf">
        <para>The <function>printf()</function> call that writes
          <literal>hello, world</literal> to standard output.</para>
      </callout>
    </calloutlist>

Appearance:

When you have finished, your program should look like this:

    #include <stdio.h>

    int
    main(void)
    {
        printf("hello, world\n");
    }

  Includes the standard IO header file.
  Specifies that `main()` returns an int.
  The `printf()` call that writes `hello, world` to standard output.

### 4.2.4.7 Tables

Unlike HTML, you do not need to use tables for layout purposes, as the stylesheet handles those issues for you. Instead, just use tables for marking up tabular data.

In general terms (and see the DocBook documentation for more detail) a table (which can be either formal or informal) consists of a `<table>` element. This contains at least one `<tgroup>` element, which specifies (as an attribute) the number of columns in this table group. Within the tablegroup you can then have one `<thead>` element, which contains elements for the table headings (column headings), and one `<tbody>` which contains the body of the table.

Both `<tgroup>` and `<thead>` contain `<row>` elements, which in turn contain `<entry>` elements. Each `<entry>` element specifies one cell in the table.

Example 4-30. `<informaltable>`

Use:

    <informaltable pgwide="1">
      <tgroup cols="2">
        <thead>
          <row>
            <entry>This is Column Head 1</entry>
            <entry>This is Column Head 2</entry>
          </row>
        </thead>

        <tbody>
          <row>
            <entry>Row 1, column 1</entry>
            <entry>Row 1, column 2</entry>
          </row>

          <row>
            <entry>Row 2, column 1</entry>
            <entry>Row 2, column 2</entry>
          </row>
        </tbody>
      </tgroup>
    </informaltable>

Appearance:

This is Column Head 1 | This is Column Head 2
--- | ---
Row 1, column 1 | Row 1, column 2
Row 2, column 1 | Row 2, column 2

Always use the `pgwide` attribute with a value of `1` with the `<informaltable>` element. A bug in Internet Explorer can cause the table to render incorrectly if this is omitted.

If you do not want a border around the table the `frame` attribute can be added to the `<informaltable>` element with a value of `none` (i.e., `<informaltable frame="none">`).

Example 4-31. Tables Where `frame="none"`

Appearance:

This is Column Head 1 | This is Column Head 2
--- | ---
Row 1, column 1 | Row 1, column 2
Row 2, column 1 | Row 2, column 2

### 4.2.4.8 Examples for the User to Follow

A lot of the time you need to show examples for the user to follow. Typically, these will consist of dialogs with the computer; the user types in a command, the user gets a response back, they type in another command, and so on.

A number of distinct elements and entities come into play here.

`<screen>`

  Everything the user sees in this example will be on the computer screen, so the next element is `<screen>`.

  Within `<screen>`, white space is significant.

`<prompt>`, `&prompt.root;` and `&prompt.user;`

  Some of the things the user will be seeing on the screen are prompts from the computer (either from the operating system, command shell, or application). These should be marked up using `<prompt>`.

  As a special case, the two shell prompts for the normal user and the root user have been provided as entities. Every time you want to indicate the user is at a shell prompt, use one of `&prompt.root;` and `&prompt.user;` as necessary. They do not need to be inside `<prompt>`.

  > Note: `&prompt.root;` and `&prompt.user;` are FreeBSD extensions to DocBook, and are not part of the original DTD.

`<userinput>`

  When displaying text that the user should type in, wrap it in `<userinput>` tags. It will probably be displayed differently to the user.

Example 4-32. `<screen>`, `<prompt>`, and `<userinput>`

Use:

    <screen>&prompt.user; <userinput>ls -1</userinput>
    foo1
    foo2
    foo3
    &prompt.user; <userinput>ls -1 | grep foo2</userinput>
    foo2
    &prompt.user; <userinput>su</userinput>
    <prompt>Password: </prompt>
    &prompt.root; <userinput>cat foo2</userinput>
    This is the file called 'foo2'</screen>

Appearance:

    % ls -1
    foo1
    foo2
    foo3
    % ls -1 | grep foo2
    foo2
    % su
    Password:
    # cat foo2
    This is the file called 'foo2'

> Note: Even though we are displaying the contents of the file `foo2`, it is not marked up as `<programlisting>`. Reserve `<programlisting>` for showing fragments of files outside the context of user actions.

## 4.2.5 In-line Elements

### 4.2.5.1 Emphasizing Information

When you want to emphasize a particular word or phrase, use `<emphasis>`. This may be presented as italic, or bold, or might be spoken differently with a text-to-speech system.

There is no way to change the presentation of the emphasis within your document, no equivalent of HTML's `<b>` and `<i>`. If the information you are presenting is important then consider presenting it in `<important>` rather than `<emphasis>`.

Example 4-33. `<emphasis>`

Use:

    <para>FreeBSD is without doubt <emphasis>the</emphasis>
      premiere Unix like operating system for the Intel architecture.</para>

Appearance:

FreeBSD is without doubt the premiere Unix like operating system for the Intel architecture.

### 4.2.5.2 Quotations

To quote text from another document or source, or to denote a phrase that is used figuratively, use `<quote>`. Within a `<quote>` tag, you may use most of the markup tags available for normal text.

Example 4-34. Quotations

Use:

    <para>However, make sure that the search does not go beyond the
      <quote>boundary between local and public administration</quote>,
      as RFC 1535 calls it.</para>

Appearance:

However, make sure that the search does not go beyond the “boundary between local and public administration”, as RFC 1535 calls it.

### 4.2.5.3 Keys, Mouse Buttons, and Combinations

To refer to a specific key on the keyboard, use `<keycap>`. To refer to a mouse button, use `<mousebutton>`. And to refer to combinations of key presses or mouse clicks, wrap them all in `<keycombo>`.

`<keycombo>` has an attribute called `action`, which may be one of `click`, `double-click`, `other`, `press`, `seq`, or `simul`. The last two values denote whether the keys or buttons should be pressed in sequence, or simultaneously.

The stylesheets automatically add any connecting symbols, such as `+`, between the key names, when wrapped in `<keycombo>`.

Example 4-35. Keys, Mouse Buttons, and Combinations

Use:

    <para>To switch to the second virtual terminal, press
      <keycombo action="simul"><keycap>Alt</keycap>
        <keycap>F1</keycap></keycombo>.</para>

    <para>To exit <command>vi</command> without saving your work, type
      <keycombo action="seq"><keycap>Esc</keycap><keycap>:</keycap>
        <keycap>q</keycap><keycap>!</keycap></keycombo>.</para>

    <para>My window manager is configured so that
      <keycombo action="simul"><keycap>Alt</keycap>
        <mousebutton>right</mousebutton>
      </keycombo> mouse button is used to move windows.</para>

Appearance:

To switch to the second virtual terminal, press Alt+F1.

To exit `vi` without saving your work, type Esc : q !.

My window manager is configured so that Alt+right mouse button is used to move windows.

### 4.2.5.4 Applications, Commands, Options, and Cites

You will frequently want to refer to both applications and commands when writing documentation. The distinction between them is simple: an application is the name for a suite (or possibly just 1) of programs that fulfill a particular task. A command is the name of a program that the user can run.

In addition, you will occasionally need to list one or more of the options that a command might take.

Finally, you will often want to list a command with its manual section number, in the “command(number)” format so common in Unix manuals.

Mark up application names with `<application>`.

When you want to list a command with its manual section number (which should be most of the time) the DocBook element is `<citerefentry>`. This will contain a further two elements, `<refentrytitle>` and `<manvolnum>`. The content of `<refentrytitle>` is the name of the command, and the content of `<manvolnum>` is the manual page section.

This can be cumbersome to write, and so a series of general entities have been created to make this easier. Each entity takes the form `&man.`manual-page`.`manual-section`;`.

The file that contains these entities is in `doc/share/xml/man-refs.ent`, and can be referred to using this FPI:

    PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN"

Therefore, the introduction to your documentation will probably look like this:

    <!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [

    <!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
    %man;

    …

    ]>

Use `<command>` when you want to include a command name “in-line” but present it as something the user should type in.

Use `<option>` to mark up the options which will be passed to a command.

When referring to the same command multiple times in close proximity it is preferred to use the `&man.`command`.`section`;` notation to markup the first reference and use `<command>` to markup subsequent references. This makes the generated output, especially HTML, appear visually better.

This can be confusing, and sometimes the choice is not always clear. Hopefully this example makes it clearer.

Example 4-36. Applications, Commands, and Options

Use:

    <para><application>Sendmail</application> is the most
      widely used Unix mail application.</para>

    <para><application>Sendmail</application> includes the
      <citerefentry>
        <refentrytitle>sendmail</refentrytitle>
        <manvolnum>8</manvolnum>
      </citerefentry>, &man.mailq.1;, and &man.newaliases.1;
      programs.</para>

    <para>One of the command line parameters to <citerefentry>
        <refentrytitle>sendmail</refentrytitle>
        <manvolnum>8</manvolnum>
      </citerefentry>, <option>-bp</option>, will display the current
      status of messages in the mail queue.  Check this on the command
      line by running <command>sendmail -bp</command>.</para>

Appearance:

Sendmail is the most widely used Unix mail application.

Sendmail includes the sendmail(8), mailq(1), and newaliases(1) programs.

One of the command line parameters to sendmail(8), `-bp`, will display the current status of messages in the mail queue. Check this on the command line by running `sendmail -bp`.

> Note: Notice how the `&man.`command`.`section`;` notation is easier to follow.

### 4.2.5.5 Files, Directories, Extensions

Whenever you wish to refer to the name of a file, a directory, or a file extension, use `<filename>`.

Example 4-37. `<filename>`

Use:

    <para>The SGML source for the Handbook in English can be
      found in <filename class="directory">/usr/doc/en_US.ISO8859-1/books/handbook/</filename>.  The first
      file is called <filename>book.xml</filename> in that
      directory.  You should also see a <filename>Makefile</filename>
      and a number of files with a <filename>.ent</filename>
      extension.</para>

Appearance:

The SGML source for the Handbook in English can be found in `/usr/doc/en/handbook/`. The first file is called `handbook.xml` in that directory. You should also see a `Makefile` and a number of files with a `.ent` extension.

### 4.2.5.6 The Name of Ports

> FreeBSD Extension: These elements are part of the FreeBSD extension to DocBook, and do not exist in the original DocBook DTD.

You might need to include the name of a program from the FreeBSD Ports Collection in the documentation. Use the `<filename>` tag with the `role` attribute set to `package` to identify these. Since ports can be installed in any number of locations, only include the category and the port name; do not include `/usr/ports`.

Example 4-38. `<filename>` Tag with `package` Role

Use:

    <para>Install the <filename role="package">net/ethereal</filename> port to view network traffic.</para>

Appearance:

Install the `net/ethereal` port to view network traffic.

### 4.2.5.7 Devices

> FreeBSD Extension: These elements are part of the FreeBSD extension to DocBook, and do not exist in the original DocBook DTD.

When referring to devices you have two choices. You can either refer to the device as it appears in `/dev`, or you can use the name of the device as it appears in the kernel. For this latter course, use `<devicename>`.

Sometimes you will not have a choice. Some devices, such as networking cards, do not have entries in `/dev`, or the entries are markedly different from those entries.

Example 4-39. `<devicename>`

Use:

    <para><devicename>sio</devicename> is used for serial
      communication in FreeBSD.  <devicename>sio</devicename> manifests
      through a number of entries in <filename>/dev</filename>, including
      <filename>/dev/ttyd0</filename> and <filename>/dev/cuaa0</filename>.</para>

    <para>By contrast, the networking devices, such as
      <devicename>ed0</devicename> do not appear in <filename>/dev</filename>.</para>

    <para>In MS-DOS, the first floppy drive is referred to as
      <devicename>a:</devicename>.  In FreeBSD it is
      <filename>/dev/fd0</filename>.</para>

Appearance:

`sio` is used for serial communication in FreeBSD. `sio` manifests through a number of entries in `/dev`, including `/dev/ttyd0` and `/dev/cuaa0`.

By contrast, the networking devices, such as `ed0` do not appear in `/dev`.

In MS-DOS, the first floppy drive is referred to as `a:`. In FreeBSD it is `/dev/fd0`.

### 4.2.5.8 Hosts, Domains, IP Addresses, and So Forth

> FreeBSD Extension: These elements are part of the FreeBSD extension to DocBook, and do not exist in the original DocBook DTD.

You can markup identification information for networked computers (hosts) in several ways, depending on the nature of the information. All of them use `<hostid>` as the element, with the `role` attribute selecting the type of the marked up information.

No `role` attribute, or `role="hostname"`

  With no `role` attribute (i.e., `<hostid>`...`</hostid>`) the marked up information is the simple hostname, such as `freefall` or `wcarchive`. You can explicitly specify this with `role="hostname"`.

`role="domainname"`

  The text is a domain name, such as `FreeBSD.org` or `ngo.org.uk`. There is no hostname component.

`role="fqdn"`

  The text is a Fully Qualified Domain Name, with both hostname and domain name parts.

`role="ipaddr"`

  The text is an IP address, probably expressed as a dotted quad.

`role="ip6addr"`

  The text is an IPv6 address.

`role="netmask"`

  The text is a network mask, which might be expressed as a dotted quad, a hexadecimal string, or as a `/` followed by a number.

`role="mac"`

  The text is an Ethernet MAC address, expressed as a series of 2 digit hexadecimal numbers separated by colons.

Example 4-40. `<hostid>` and Roles

Use:

    <para>The local machine can always be referred to by the
      name <hostid>localhost</hostid>, which will have the IP address
      <hostid role="ipaddr">127.0.0.1</hostid>.</para>

    <para>The <hostid role="domainname">FreeBSD.org</hostid> domain
      contains a number of different hosts, including
      <hostid role="fqdn">freefall.FreeBSD.org</hostid> and
      <hostid role="fqdn">pointyhat.FreeBSD.org</hostid>.</para>

    <para>When adding an IP alias to an interface (using
      <command>ifconfig</command>) <emphasis>always</emphasis> use a
      netmask of <hostid role="netmask">255.255.255.255</hostid>
      (which can also be expressed as <hostid
        role="netmask">0xffffffff</hostid>).</para>

    <para>The MAC address uniquely identifies every network card
      in existence.  A typical MAC address looks like <hostid
        role="mac">08:00:20:87:ef:d0</hostid>.</para>

Appearance:

The local machine can always be referred to by the name `localhost`, which will have the IP address `127.0.0.1`.

The `FreeBSD.org` domain contains a number of different hosts, including `freefall.FreeBSD.org` and `bento.FreeBSD.org`.

When adding an IP alias to an interface (using `ifconfig`) always use a netmask of `255.255.255.255` (which can also be expressed as `0xffffffff`).

The MAC address uniquely identifies every network card in existence. A typical MAC address looks like `08:00:20:87:ef:d0`.

### 4.2.5.9 Usernames

> FreeBSD Extension: These elements are part of the FreeBSD extension to DocBook, and do not exist in the original DocBook DTD.

When you need to refer to a specific username, such as `root` or `bin`, use `<username>`.

Example 4-41. `<username>`

Use:

    <para>To carry out most system administration functions you
      will need to be <username>root</username>.</para>

Appearance:

To carry out most system administration functions you will need to be `root`.

### 4.2.5.10 Describing `Makefile`s

> FreeBSD Extension: These elements are part of the FreeBSD extension to DocBook, and do not exist in the original DocBook DTD.

Two elements exist to describe parts of `Makefile`s, `<maketarget>` and `<makevar>`.

`<maketarget>` identifies a build target exported by a `Makefile` that can be given as a parameter to `make`. `<makevar>` identifies a variable that can be set (in the environment, on the `make` command line, or within the `Makefile`) to influence the process.

Example 4-42. `<maketarget>` and `<makevar>`

Use:

    <para>Two common targets in a <filename>Makefile</filename>
      are <maketarget>all</maketarget> and <maketarget>clean</maketarget>.</para>

    <para>Typically, invoking <maketarget>all</maketarget> will rebuild the
      application, and invoking <maketarget>clean</maketarget> will remove
      the temporary files (<filename>.o</filename> for example) created by
      the build process.</para>

    <para><maketarget>clean</maketarget> may be controlled by a number of
      variables, including <makevar>CLOBBER</makevar> and
      <makevar>RECURSE</makevar>.</para>

Appearance:

Two common targets in a `Makefile` are `all` and `clean`.

Typically, invoking `all` will rebuild the application, and invoking `clean` will remove the temporary files (`.o` for example) created by the build process.

`clean` may be controlled by a number of variables, including `CLOBBER` and `RECURSE`.

### 4.2.5.11 Literal Text

You will often need to include “literal” text in the documentation. This is text that is excerpted from another file, or which should be copied from the documentation into another file verbatim.

Some of the time, `<programlisting>` will be sufficient to denote this text. `<programlisting>` is not always appropriate, particularly when you want to include a portion of a file “in-line” with the rest of the paragraph.

On these occasions, use `<literal>`.

Example 4-43. `<literal>`

Use:

    <para>The <literal>maxusers 10</literal> line in the kernel
      configuration file determines the size of many system tables, and is
      a rough guide to how many simultaneous logins the system will
      support.</para>

Appearance:

The `maxusers 10` line in the kernel configuration file determines the size of many system tables, and is a rough guide to how many simultaneous logins the system will support.

### 4.2.5.12 Showing Items That the User Must Fill In

There will often be times when you want to show the user what to do, or refer to a file, or command line, or similar, where the user cannot simply copy the examples that you provide, but must instead include some information themselves.

`<replaceable>` is designed for this eventuality. Use it inside other elements to indicate parts of that element's content that the user must replace.

Example 4-44. `<replaceable>`

Use:

    <screen>&prompt.user; <userinput>man <replaceable>command</replaceable></userinput></screen>

Appearance:

    % man command

`<replaceable>` can be used in many different elements, including `<literal>`. This example also shows that `<replaceable>` should only be wrapped around the content that the user is meant to provide. The other content should be left alone.

Use:

    <para>The <literal>maxusers <replaceable>n</replaceable></literal>
      line in the kernel configuration file determines the size of many system
      tables, and is a rough guide to how many simultaneous logins the system will
      support.</para>

    <para>For a desktop workstation, <literal>32</literal> is a good value
      for <replaceable>n</replaceable>.</para>

Appearance:

The `maxusers `n`` line in the kernel configuration file determines the size of many system tables, and is a rough guide to how many simultaneous logins the system will support.

For a desktop workstation, `32` is a good value for `n`.

### 4.2.5.13 Quoting System Errors

You might want to show errors generated by FreeBSD. Mark these with `<errorname>`. This indicates the exact error that appears.

Example 4-45. `<errorname>`

Use:

    <screen><errorname>Panic: cannot mount root</errorname></screen>

Appearance:

    “Panic: cannot mount root”

## 4.2.6 Images

> Important: Image support in the documentation is currently extremely experimental. The mechanisms described here are unlikely to change, but that is not guaranteed.

> You will also need to install the `graphics/ImageMagick` port, which is used to convert between the different image formats. This is a big port, and most of it is not required. However, while we are working on the `Makefile`s and other infrastructure it makes things easier. This port is not in the `textproc/docproj` meta port, you must install it by hand.

> The best example of what follows in practice is the `doc/en_US.ISO8859-1/articles/vm-design/` document. If you are unsure of the description that follows, take a look at the files in that directory to see how everything hangs together. Experiment with creating different formatted versions of the document to see how the image markup appears in the formatted output.

### 4.2.6.1 Image Formats

We currently support two formats for images. The format you should use will depend on the nature of your image.

For images that are primarily vector based, such as network diagrams, time lines, and similar, use Encapsulated Postscript, and make sure that your images have the `.eps` extension.

For bitmaps, such as screen captures, use the Portable Network Graphic format, and make sure that your images have the `.png` extension.

These are the only formats in which images should be committed to the Subversion repository.

Use the right format for the right image. It is to be expected that your documentation will have a mix of EPS and PNG images. The `Makefile`s ensure that the correct format image is chosen depending on the output format that you use for your documentation. Do not commit the same image to the repository in two different formats.

> Important: It is anticipated that the Documentation Project will switch to using the Scalable Vector Graphic (SVG) format for vector images. However, the current state of SVG capable editing tools makes this impractical.

### 4.2.6.2 Markup

The markup for an image is relatively simple. First, markup a `<mediaobject>`. The `<mediaobject>` can contain other, more specific objects. We are concerned with two, the `<imageobject>` and the `<textobject>`.

You should include one `<imageobject>`, and two `<textobject>` elements. The `<imageobject>` will point to the name of the image file that will be used (without the extension). The `<textobject>` elements contain information that will be presented to the user as well as, or instead of, the image.

There are two circumstances where this can happen.

- When the reader is viewing the documentation in HTML. In this case, each image will need to have associated alternate text to show the user, typically whilst the image is loading, or if they hover the mouse pointer over the image.

- When the reader is viewing the documentation in plain text. In this case, each image should have an ASCII art equivalent to show the user.

An example will probably make things easier to understand. Suppose you have an image, called `fig1`, that you want to include in the document. This image is of a rectangle with an A inside it. The markup for this would be as follows.

    <mediaobject>
      <imageobject>
        <imagedata fileref="fig1">
      </imageobject>

      <textobject>
        <literallayout class="monospaced">+---------------+
    |       A       |
    +---------------+</literallayout>
      </textobject>

      <textobject>
        <phrase>A picture</phrase>
      </textobject>
    </mediaobject>

  Include an `<imagedata>` element inside the `<imageobject>` element. The `fileref` attribute should contain the filename of the image to include, without the extension. The stylesheets will work out which extension should be added to the filename automatically.
  The first `<textobject>` should contain a `<literallayout>` element, where the `class` attribute is set to `monospaced`. This is your opportunity to demonstrate your ASCII art skills. This content will be used if the document is converted to plain text.

  Notice how the first and last lines of the content of the `<literallayout>` element butt up next to the element's tags. This ensures no extraneous white space is included.

  The second `<textobject>` should contain a single `<phrase>` element. The contents of this will become the `alt` attribute for the image when this document is converted to HTML.

### 4.2.6.3 `Makefile` Entries

Your images must be listed in the `Makefile` in the `IMAGES` variable. This variable should contain the name of all your source images. For example, if you have created three figures, `fig1.eps`, `fig2.png`, `fig3.png`, then your `Makefile` should have lines like this in it.

    …
    IMAGES= fig1.eps fig2.png fig3.png
    …

or

    …
    IMAGES=  fig1.eps
    IMAGES+= fig2.png
    IMAGES+= fig3.png
    …

Again, the `Makefile` will work out the complete list of images it needs to build your source document, you only need to list the image files you provided.

### 4.2.6.4 Images and Chapters in Subdirectories

You must be careful when you separate your documentation into smaller files (see Section 3.7.1) in different directories.

Suppose you have a book with three chapters, and the chapters are stored in their own directories, called `chapter1/chapter.xml`, `chapter2/chapter.xml`, and `chapter3/chapter.xml`. If each chapter has images associated with it, it is suggested to place those images in each chapter's subdirectory (`chapter1/`, `chapter2/`, and `chapter3/`).

However, if you do this you must include the directory names in the `IMAGES` variable in the `Makefile`, and you must include the directory name in the `<imagedata>` element in your document.

For example, if you have `chapter1/fig1.png`, then `chapter1/chapter.xml` should contain:

    <mediaobject>
      <imageobject>
        <imagedata fileref="chapter1/fig1">
      </imageobject>

      …

    </mediaobject>

  The directory name must be included in the `fileref` attribute.

The `Makefile` must contain:

    …
    IMAGES=  chapter1/fig1.png
    …

Then everything should just work.

## 4.2.7 Links

> Note: Links are also in-line elements.

### 4.2.7.1 Linking to Other Parts of the Same Document

Linking within the same document requires you to specify where you are linking from (i.e., the text the user will click, or otherwise indicate, as the source of the link) and where you are linking to (the link's destination).

Each element within DocBook has an attribute called `id`. You can place text in this attribute to uniquely name the element it is attached to.

This value will be used when you specify the link source.

Normally, you will only be linking to chapters or sections, so you would add the `id` attribute to these elements.

Example 4-46. Attribute `id` on Chapters and Sections

    <chapter id="chapter1">
      <title>Introduction</title>

      <para>This is the introduction.  It contains a subsection,
        which is identified as well.</para>

      <sect1 id="chapter1-sect1">
        <title>Sub-sect 1</title>

        <para>This is the subsection.</para>
      </sect1>
    </chapter>

Obviously, you should use more descriptive values. The values must be unique within the document (i.e., not just the file, but the document the file might be included in as well). Notice how the `id` for the subsection is constructed by appending text to the `id` of the chapter. This helps to ensure that they are unique.

If you want to allow the user to jump into a specific portion of the document (possibly in the middle of a paragraph or an example), use `<anchor>`. This element has no content, but takes an `id` attribute.

Example 4-47. `<anchor>`

    <para>This paragraph has an embedded
      <anchor id="para1">link target in it.  It will not show up in
      the document.</para>

When you want to provide the user with a link they can activate (probably by clicking) to go to a section of the document that has an `id` attribute, you can use either `<xref>` or `<link>`.

Both of these elements have a `linkend` attribute. The value of this attribute should be the value that you have used in a `id` attribute (it does not matter if that value has not yet occurred in your document; this will work for forward links as well as backward links).

If you use `<xref>` then you have no control over the text of the link. It will be generated for you.

Example 4-48. Using `<xref>`

Assume that this fragment appears somewhere in a document that includes the `id` example:

    <para>More information can be found
      in <xref linkend="chapter1"/>.</para>

    <para>More specific information can be found
      in <xref linkend="chapter1-sect1"/>.</para>

The text of the link will be generated automatically, and will look like (emphasized text indicates the text that will be the link):

> More information can be found in Chapter One.

> More specific information can be found in the section called Sub-Sect 1.

Notice how the text from the link is derived from the section title or the chapter number.

> Note: This means that you cannot use `<xref>` to link to an `id` attribute on an `<anchor>` element. The `<anchor>` has no content, so the `<xref>` cannot generate the text for the link.

If you want to control the text of the link then use `<link>`. This element wraps content, and the content will be used for the link.

Example 4-49. Using `<link>`

Assume that this fragment appears somewhere in a document that includes the `id` example.

    <para>More information can be found in
      <link linkend="chapter1">the first chapter</link>.</para>

    <para>More specific information can be found in
      <link linkend="chapter1-sect1">this</link> section.</para>

This will generate the following (emphasized text indicates the text that will be the link):

> More information can be found in the first chapter.

> More specific information can be found in this section.

> Note: That last one is a bad example. Never use words like “this” or “here” as the source for the link. The reader will need to hunt around the surrounding context to see where the link is actually taking them.

> Note: You can use `<link>` to include a link to an `id` on an `<anchor>` element, since the `<link>` content defines the text that will be used for the link.

### 4.2.7.2 Linking to Documents on the WWW

Linking to external documents is much simpler, as long as you know the URL of the document you want to link to. Use `<ulink>`. The `url` attribute is the URL of the page that the link points to, and the content of the element is the text that will be displayed for the user to activate.

Example 4-50. `<ulink>`

Use:

    <para>Of course, you could stop reading this document and
      go to the <ulink url="&url.base;/index.html">FreeBSD
      home page</ulink> instead.</para>

Appearance:

Of course, you could stop reading this document and go to the FreeBSD home page instead.

### Notes

[1] | A short history can be found under http://www.oasis-open.org/docbook/intro.shtml#d0e41.
[2] | There are other types of list element in DocBook, but we are not concerned with those at the moment.

Prev | Home | Next
XML Markup | Up | * Stylesheets