# Customizing the output

Doxygen provides various levels of customization. The first section discusses what to do if you want to do minor tweaker to the look and feel of the output. The next section show how to reorder and hide certain information on a page. The last section show how to generate whatever output you want based on the XML output produced by doxygen.

## Minor Tweaks

To simply tweak things like fonts or colors, margins, or other look & feel espects of the HTML output you can create a different cascading style sheet. You can also let doxygen use a custom header and footer for each HTML page it generates, for instance to include a logo or to make the doxygen output blend in with the rest of the web site.

To do this first run doxygen as follows:

    doxygen -w html header.html footer.html customdoxygen.css

This will create 3 files:

- header.html is a HTML fragment which doxygen normally uses to start a HTML page. Note that the fragment ends with a body tag and that is contains a couple of commands of the form $word. These will be replaced by doxygen on the fly.
- footer.html is a HTML fragment which doxygen normally uses to end a HTML page. Also here special commands can be used. This file contain the link to www.doxygen.org and the body and html end tags.
- customdoxygen.css is the default cascading style sheet used by doxygen.

You should edit these files and then reference them from the config file.

    HTML_HEADER      = header.html
    HTML_FOOTER      = footer.html
    HTML_STYLESHEET  = customdoxygen.css

See the documentation of the HTML_HEADER tag for more information about the possible meta commands.

Note:
  You should not put the style sheet in the HTML output directory. Treat it is a source file. Doxygen will copy it for you.

  If you use images or other external content in a custom header you need to make sure these end up in the HTML output directory yourself, for instance by writing a script that runs doxygen can then copies the images to the output.

## Changing the layout of pages

In some cases you may want to change the way the output is structured. A different style sheet or custom headers and footers do not help in such case.

The solution doxygen provides is a layout file, which you can modify and doxygen will use to control what information is presented, in which order, and to some extent also how information is presented. The layout file is an XML file.

The default layout can be generated by doxygen using the following command:

    doxygen -l

optionally the name of the layout file can be specified, if omitted `DoxygenLayout.xml` will be used.

The toplevel structure of the file looks as follows:

    <doxygenlayout version="1.0">
      <navindex>
        ...
      </navindex>
      <class>
        ...
      </class>
      <namespace>
        ...
      </namespace>
      <file>
        ...
      </file>
      <group>
        ...
      </group>
      <directory>
        ...
      </directory>
    </doxygenlayout>

The root tag of the XML is `doxygenlayout`, it has an attribute named `version`, which will be used in the future to cope with changes that are not backward compatible.

The first section, enclosed by `navindex` tags represents the layout of the navigation tabs displayed at the top of each HTML page. Each tab is represented by a `tab` tag in the XML file.

You can hide tabs by setting the `visible` attribute to `no`. You can also override the default title of a tab by specifying it as the value of the `title` attribute. If the title field is the empty string (the default) then doxygen will fill in an appropriate title. You can reorder the tabs by moving the tab tags in the XML file within the `navindex` section and even change the tree structure. Do not change the value of the `type` attribute however. Only a fixed set of types are supported, each representing a link to a specific index.

The sections after `navindex` represent the layout of the different pages generated by doxygen:

- The `class` section represents the layout of all pages generated for documented classes, structs, unions, and interfaces.
- The `namespace` section represents the layout of all pages generated for documented namespaces (and also Java packages).
- The `file` section represents the layout of all pages generated for documented files.
- The `group` section represents the layout of all pages generated for documented groups (or modules).
- The `directory` section represents the layout of all pages generated for documented directories.

Each XML tag within one of the above page sections represents a certain piece of information. Some pieces can appear in each type of page, others are specific for a certain type of page. Doxygen will list the pieces in the order in which they appear in the XML file.

Some tags have a `visible` attribute which can be used to hide the fragment from the generated output, by setting the attribute's value to "no". You can also use the value of a configuration option to determine the visibility, by using its name prefixed with a dollar sign, e.g.

      ...
      <includes visible="$SHOW_INCLUDE_FILES"/>
      ...

This was mainly added for backward compatibility. Note that the `visible` attribute is just a hint for doxygen. If no relevant information is available for a certain piece it is omitted even if it is set to `yes` (i.e. no empty sections are generated).

Some tags have a `title` attribute. This attribute can be used to customize the title doxygen will use as a header for the piece.

Warning:
  at the moment you should not remove tags from the layout file as a way to hide information. Doing so can cause broken links in the generated output!

At the moment the following generic tags are possible for each page:

`briefdescription`
  Represents the brief description on a page.
`detaileddescription`
  Represents the detailed description on a page.
`authorsection`
  Represents the author section of a page (only used for man pages).
`memberdecl`
  Represents the quick overview of members on a page (member declarations). This tag has child tags each representing a list of members of a certain type. The possible child tags are not listed in detail in the document, but the name of the tag should be a good indication of the type of members that the tag represents.
`memberdef`
  Represents the detailed member list on a page (member definition). Like the `memberdecl` tag, also this tag has a number of possible child tags.

The class page has the following specific tags:

`includes`
  Represents the include file needed to obtain the definition for this class.
`inheritancegraph`
  Represents the inheritance relations for a class. Note that the CLASS_DIAGRAM option determines if the inheritance relation is a list of base and derived classes or a graph.
`collaborationgraph`
  Represents the collaboration graph for a class.
`allmemberslink`
  Represents the link to the list of all members for a class.
`usedfiles`
  Represents the list of files from which documentation for the class was extracted.

The file page has the following specific tags:

`includes`
  Represents the list of #include statements contained in this file.
`includegraph`
  Represents the include dependency graph for the file.
`includedbygraph`
  Represents the included by dependency graph for the file.
`sourcelink`
  Represents the link to the source code of this file.

The group page has a specific `groupgraph` tag which represents the graph showing the dependencies between groups.

Similarily, the directory page has a specific `directorygraph` tag which represents the graph showing the dependencies between the directories based on the #include relations of the files inside the directories.

## Using the XML output

If the above two methods still do not provide enough flexibility, you can also use the XML output produced by doxygen as a basis to generate the output you like. To do this set GENERATE_XML to YES.

The XML output consists of an index file named `index.xml` which lists all items extracted by doxygen with references to the other XML files for details. The structure of the index is described by a schema file `index.xsd`. All other XML files are described by the schema file named `compound.xsd`. If you prefer one big XML file you can combine the index and the other files using the XSLT file `combine.xslt`.

You can use any XML parser to parse the file or use the one that can be found in the `addon/doxmlparser` directory of doxygen source distribution. Look at `addon/doxmlparser/include/doxmlintf.h` for the interface of the parser and in `addon/doxmlparser/example` for examples.

The advantage of using the doxmlparser is that it will only read the index file into memory and then only those XML files that you implicitly load via navigating through the index. As a result this works even for very large projects where reading all XML files as one big DOM tree would not fit into memory.