Markdown のサポート

Markdown のサポートは Doxygen バージョン 1.8.0 で導入されました。これは John Gruber によって書かれたプレーンテキストの書式設定構文であり、以下の設計目標を持っています

Markdown の書式設定構文の設計目標は、可能な限り読みやすくすることです。アイデアは、Markdown で書式設定されたドキュメントが、タグや書式設定の指示でマークアップされているように見えないように、プレーンテキストとしてそのまま公開できることです。Markdown の構文は既存のいくつかのテキストから HTML へのフィルターに影響を受けていますが、Markdown の構文の最大のインスピレーション源はプレーンテキストメールの形式です。

次のセクションでは、標準の Markdown 機能について簡単に説明します。詳細については、Markdown サイトを参照してください。

例えば、PHP Markdown ExtraGitHub Flavored Markdown など、いくつかの機能強化がなされました。Markdown 拡張のセクションでは、Doxygen がサポートする拡張機能について説明します。

最後に、Doxygen の詳細セクションでは、Markdown 標準の Doxygen の実装に関するいくつかの詳細について説明します。

標準の Markdown

段落

Doxygen が Markdown をサポートする前から、Markdown と同じ段落処理方法をサポートしていました。段落を作成するには、連続するテキスト行を1つ以上の空白行で区切るだけです。

Here is text for one paragraph.

We continue with more text in another paragraph.

ヘッダー

Markdown と同様に、Doxygen は2種類のヘッダーをサポートしています

レベル1または2のヘッダーは次のように作成できます

This is a level 1 header
========================

This is a level 2 header
------------------------

ヘッダーの後には、= または - のみが含まれる行が続きます。= または - の正確な量は、少なくとも2つあれば重要ではありません。

または、行の先頭に # を使用してヘッダーを作成できます。行の先頭にある # の数によってレベルが決まります (最大6レベルがサポートされています)。ヘッダーは任意の数の # で終了できます。

例を次に示します

# This is a level 1 header

### This is level 3 header #######

ブロッククォート

ブロッククォートは、各行を1つ以上の > で始めることで作成できます。これは、テキストのみのメールで使用されるものと似ています。

> This is a block quote
> spanning multiple lines

リストとコードブロック (下記参照) はクォートブロック内に表示できます。クォートブロックはネストすることもできます。

Doxygen は、誤検出を避けるために (最後の) > 文字の後にスペースを入れる必要があることに注意してください。つまり、次のように記述した場合

0  if OK\n
>1 if NOK

2行目はブロッククォートとして認識されません。

リスト

簡単な箇条書きリストは、行を -, +, または * で始めることで作成できます。

- Item 1

  More text for this item.

- Item 2
  + nested list item.
  + another nested item.
- Item 3

リスト項目は複数の段落にまたがることができ (各段落が適切なインデントで始まる場合)、リストはネストできます。次のように番号付きリストを作成することもできます

1. First item.
2. Second item.

Doxygen の詳細については、リストの拡張も必ずお読みください。

コードブロック

事前フォーマットされた逐語的なブロックは、テキストブロックの各行を少なくとも4つの余分なスペースでインデントすることで作成できます

This a normal paragraph

    This is a code block

We continue with a normal paragraph again.

Doxygen はコードブロックから必須のインデントを削除します。段落の途中でコードブロックを開始できないことに注意してください (つまり、コードブロックの前の行は空である必要があります)。

Doxygen がインデントをどのように処理するかについては、標準の Markdown とは少し異なるため、コードブロックのインデントのセクションを参照してください。

水平線

少なくとも3つ以上のハイフン、アスタリスク、またはアンダースコアを含む行に対して水平線が生成されます。行には任意の量の空白を含めることもできます。

- - -
______

コメントブロックでアスタリスクを使用すると機能しないことに注意してください。詳細については、アスタリスクの使用を参照してください。
ハイフンを使用し、前の行が空でない場合、ハイフンのシーケンスに少なくとも1つの空白を使用する必要があることに注意してください。そうしないと、レベル2のヘッダーとして認識される可能性があります (ヘッダーを参照)。

強調

テキストフラグメントを強調するには、フラグメントをアンダースコアまたはアスタリスクで開始および終了します。2つのアスタリスクまたはアンダースコアを使用すると、強い強調が生成されます。3つのアスタリスクまたはアンダースコアは、前の2つのオプションの強調を結合します。

 *single asterisks*

 _single underscores_

 **double asterisks**

 __double underscores__

 ***triple asterisks***

 ___triple underscores___

Doxygen が強調/打ち消し線スパンを標準/Markdown GitHub Flavored Markdown とは少し異なる方法で処理する方法の詳細については、強調と打ち消し線の制限のセクションを参照してください。

打ち消し線

テキストフラグメントを打ち消し線で表示するには、フラグメントを2つのチルダで開始および終了します。

 ~~double tilde~~

Doxygen が強調/打ち消し線スパンを標準 Markdown / GitHub Flavored Markdown とは少し異なる方法で処理する方法の詳細については、強調と打ち消し線の制限のセクションを参照してください。

コードスパン

コードスパンを示すには、それをバックティック ( ` ) で囲む必要があります。コードブロックとは異なり、コードスパンは段落内にインラインで表示されます。例

Use the `printf()` function.

コードスパン内にリテラルのバックティックまたは単一引用符を表示するには、二重バックティックを使用します。つまり

To assign the output of command `ls` to `var` use ``var=`ls```.

To assign the text 'text' to `var` use ``var='text'``.

Doxygen がコードスパンを標準 Markdown とは少し異なる方法で処理する方法の詳細については、コードスパンの制限のセクションを参照してください。

リンク

Doxygen は、Markdown で定義された2つのリンク作成スタイル (インライン参照) の両方をサポートしています。

どちらのスタイルでも、リンク定義は [角括弧] で区切られたリンクテキストで始まります。

インラインリンク

インラインリンクの場合、リンクテキストの後に URL とオプションのリンクタイトルが続き、これらが一緒に一対の通常の括弧で囲まれます。リンクタイトル自体は引用符で囲まれます。

[The link text](http://example.net/)
[The link text](http://example.net/ "Link title")
[The link text](/relative/path/to/index.html "Link title")
[The link text](somefile.html)

さらに、Doxygen は文書化されたエンティティをリンクする同様の方法を提供します

[The link text](@ref MyClass)

参照の最初の非空白文字が # である場合、これは Doxygen リンクとして解釈され、@ref コマンドとして置き換えられます

[The link text](#MyClass)

は次のように解釈されます

@ref MyClass "The link text"

参照リンク

URL をインラインで配置する代わりに、リンクを個別に定義し、テキスト内から参照することもできます。

リンク定義は次のようになります

[link name]: http://www.example.com "Optional title"

二重引用符の代わりに、単一引用符または括弧もタイトル部分に使用できます。

定義されると、リンクは次のようになります

[link text][link name]

リンクテキストと名前が同じ場合、次も

[link name][]

あるいは

[link name]

リンクを参照するために使用できます。リンク名の一致は大文字と小文字を区別しないことに注意してください。これは次の例に示されています

I get 10 times more traffic from [Google] than from
[Yahoo] or [MSN].

[google]: http://google.com/        "Google"
[yahoo]:  http://search.yahoo.com/  "Yahoo Search"
[msn]:    http://search.msn.com/    "MSN Search"

リンク定義は出力に表示されません。

インラインリンクと同様に、Doxygen はリンク定義内で @ref もサポートします

[myclass]: @ref MyClass "My class"

画像

画像の Markdown 構文はリンクの構文と似ています。唯一の違いは、リンクテキストの前の追加の ! です。

![Caption text](/path/to/img.jpg)
![Caption text](/path/to/img.jpg "Image title")
![Caption text][img def]
![img def]

[img def]: /path/to/img.jpg "Optional Title"

ここでも、@ref を使用して画像をリンクできます

![Caption text](@ref image.png)
![img def]

[img def]: @ref image.png "Caption text"

キャプションテキストはオプションです。

画像のパスを IMAGE_PATH に追加することを忘れないでください。

自動リンク

URL または電子メールアドレスへのリンクを作成するには、Markdown は次の構文をサポートしています

<http://www.example.com>
<https://www.example.com>
<ftp://www.example.com>
<mailto:[email protected]>
<[email protected]>

Doxygen は山括弧なしでもリンクを生成することに注意してください。

Markdown 拡張

目次

Doxygen は、特別なリンカーカー [TOC] をサポートしています。これは、ページの先頭にすべてのセクションをリストした目次を生成するためにページに配置できます。

[TOC] を使用することは、\tableofcontents コマンドを使用することと同じであることに注意してください。

TOC_INCLUDE_HEADINGS は0より大きい値に設定する必要があることに注意してください。そうしないと、Markdown ヘッダーを使用しても目次は表示されません。

テーブル

"Markdown Extra" で定義されている機能の1つは、シンプルなテーブルのサポートです

テーブルは、ヘッダー行、区切り線、および少なくとも1つの行で構成されます。テーブルの列はパイプ (|) 文字で区切られます。

例を次に示します

First Header  | Second Header
------------- | -------------
Content Cell  | Content Cell
Content Cell  | Content Cell

これにより、次のテーブルが生成されます

最初のヘッダー2番目のヘッダー
コンテンツセルコンテンツセル
コンテンツセルコンテンツセル

列の配置は、ヘッダー区切り線にある1つまたは2つのコロンで制御できます

| Right | Center | Left  |
| ----: | :----: | :---- |
| 10    | 10     | 10    |
| 1000  | 1000   | 1000  |

これは次のようになります

中央
10 10 10
1000 1000 1000

さらに、列スパンと行スパンがサポートされています。セルのキャレット ("^") は、上のセルが行をまたがることを示します。任意の数の行スパンにキャレットのシーケンスを使用できます。例

| Right | Center | Left  |
| ----: | :----: | :---- |
| 10    | 10     | 10    |
| ^     | 1000   | 1000  |

これは次のようになります

中央
10 10 10
1000 1000

列スパンは、隣接する垂直バー ("|") を使用してサポートされます。追加の垂直バーごとに、追加の列をまたがることを示します。別の言い方をすれば、単一の垂直バーは単一の列スパンを示し、2つの垂直バーは2列スパンを示し、以下同様です。例

| Right | Center | Left  |
| ----: | :----: | :---- |
| 10    | 10     | 10    |
| 1000  |||

これは次のようになります

中央
10 10 10
1000

Doxygen のより複雑なテーブルについては、テーブルの挿入をご覧ください。

フェンス付きコードブロック

"Markdown Extra" で定義されているもう1つの機能は、フェンス付きコードブロックのサポートです

フェンス付きコードブロックはインデントを必要とせず、「フェンスライン」のペアで定義されます。このような行は、行に3つ以上のチルダ (~) 文字で構成されます。ブロックの終わりも同じ数のチルダを持つ必要があります。例を次に示します

This is a paragraph introducing:

~~~~~~~~~~~~~~~~~~~~~
a one-line code block
~~~~~~~~~~~~~~~~~~~~~

デフォルトでは、出力は通常のコードブロックと同じです。

Doxygen でサポートされている言語の場合、コードブロックを構文強調表示で表示することもできます。そのためには、開始フェンスの後にプログラミング言語に対応する典型的なファイル拡張子を指定する必要があります。例えば、Python 言語に従って強調表示するには、次のように記述する必要があります

~~~~~~~~~~~~~{.py}
# A class
class Dummy:
    pass
~~~~~~~~~~~~~

これにより、次が生成されます

# クラス
class Dummy
pass

C の場合は次のように記述します

~~~~~~~~~~~~~~~{.c}
int func(int a,int b) { return a*b; }
~~~~~~~~~~~~~~~

これにより、次が生成されます

int func(int a,int b) { return a*b; }

ドットはオプションであり、言語名がアルファベット文字で始まり、それ以降の文字が英数字またはプラス記号である場合、中括弧はオプションです。

フェンス付きコードブロックを示すもう1つの方法は、3つ以上のバックティック (```) を使用することです

```
これもフェンス付きコードブロックです
```

画像形式 dotmscplantuml の場合、フェンス付きブロックは、画像形式が有効になっている場合 ( HAVE_DOTPLANTUML_JAR_PATH を参照) は画像として表示され、そうでない場合はプレーンコードとして表示されます。

```plantuml
Alice -> Bob
```

または

```plantuml
@startuml
Alice -> Bob
@enduml
```

ヘッダー ID 属性

標準の Markdown はヘッダーのラベル付けをサポートしていません。これは、セクションにリンクしたい場合に問題となります。

PHP Markdown Extra では、ヘッダーに次を追加することでヘッダーにラベルを付けることができます

Header 1                {#labelid}
========

## Header 2 ##          {#labelid2}

同じコメントブロック内のセクションにリンクするには、次を使用できます

[Link text](#labelid)

一般的にセクションにリンクするために、Doxygen では @ref を使用できます

[Link text](@ref labelid)

これはレベル1から4のヘッダーにのみ機能することに注意してください。

画像属性

標準の Markdown は画像寸法の制御をサポートしていないため、ドキュメント作成時の柔軟性が低下します。

PHP Markdown Extra では、次のように画像にextra属性を追加できます

![Caption text](/path/to/img.jpg){attributes}

出力形式固有の属性を可能にするために、次の構文がサポートされています

![Caption text](/path/to/img.jpg){format: attributes, format: attributes}

可能な内容については、\image コマンドの サイズ表示の段落を参照してください。

![Doxygen Logo](https://doxygen.dokyumento.jp/images/doxygen.png){html: width=50%, latex: width=5cm}

Doxygen の詳細

Doxygen は可能な限り Markdown 標準に従おうとしますが、いくつかの逸脱と Doxygen 固有の追加があります。

Markdown ファイルをページとして含める

Doxygen は Markdown 書式設定のファイルを処理できます。これには、そのようなファイルの拡張子は .md または .markdown である必要があります (Markdown ファイルの拡張子が異なる場合は EXTENSION_MAPPING を参照し、パーサー名として md を使用してください)。各ファイルはページに変換されます (詳細については page コマンドを参照)。Doxygen は、Markdown ファイルが専用コマンド (\defgroup\dir など) で始まる場合、ファイルがディレクトリまたはグループドキュメントのみを含む場合に空のページが作成されるのを避けるために、専用ページを作成しません。サブディレクトリ内の README.md ファイルは、専用コマンド (@page@mainpage など) で新しいページを作成するために明示的に上書きされない限り、ディレクトリドキュメントとして扱われます。

デフォルトでは、ページの名前タイトルはファイル名から派生します。ただし、ファイルがレベル1ヘッダーで始まる場合、それはページのタイトルとして使用されます。ヘッダー ID 属性に示されているように、ヘッダーにラベルを指定した場合、Doxygen はそれをページ名として使用します。

ラベルが index または mainpage と呼ばれる場合、Doxygen はドキュメントをフロントページ (index.html) に配置します。

Doxygen で処理されるとメインページとして表示される README.md ファイルの例を次に示します

My Main Page                         {#mainpage}
============

Documentation that will appear on the main page

ページにラベルがある場合、上記のように @ref を使用してそれにリンクできます。そのようなラベルのない Markdown ページを参照するには、単純にページのファイル名を使用できます。例

See [the other page](other.md) for more info.

HTML ブロックの扱い

Markdown はブロックレベルの HTML の処理方法に関してかなり厳格です

ブロックレベルの HTML 要素 (例: <div><table><pre><p> など) は、周囲のコンテンツと空白行で区切られなければならず、ブロックの開始タグと終了タグはタブやスペースでインデントされてはなりません。

Doxygen にはこの要件はなく、そのような HTML ブロック内でも Markdown 書式設定を処理します。唯一の例外は <pre> ブロックであり、これは手付かずで渡されます (アスキーアートに便利です)。

Doxygen は、逐語的ブロックまたはコードブロック内、および変更なしで処理する必要があるその他のセクション (たとえば、数式やインライン dot グラフ) 内では Markdown 書式設定を処理しません。

コードブロックのインデント

Markdown は、コードブロックを開始するために単一のタブまたは4つのスペースを許可します。Doxygen は Markdown 処理を行う前にタブをスペースに置き換えるため、設定ファイルの TAB_SIZE が4に設定されている場合にのみ同じ効果が得られます。より高い値に設定されている場合、コードブロックにスペースが存在します。より低い値は、単一のタブがコードブロックの開始として解釈されるのを防ぎます。

Markdown では、4スペースでインデントされた (リスト内では8スペースでインデントされた) ブロックはすべてコードブロックとして扱われます。このインデント量は絶対的、つまり行の開始から数えられます。

Doxygen のコメントはプログラミング言語によって要求される任意のインデントレベルで表示できるため、代わりに相対インデントを使用します。インデント量は、前の段落に対して相対的に数えられます。前の段落がない場合 (つまり、コードブロックで開始したい場合)、コメントブロック全体の最小インデント量が参照として使用されます。

ほとんどの場合、この違いは異なる出力にはなりません。段落のインデントを操作した場合にのみ、違いが顕著になります

text

 text

  text

   code

この場合、Markdown は「code」という単語をコードブロックに配置しますが、Doxygen はそれを通常のテキストとして扱います。これは、絶対インデントが4であっても、前の段落に対するインデントが1に過ぎないためです。

相対インデントを決定するときにリストマーカーは数えられないことに注意してください

1.  Item1

    More text for item1

2.  Item2

        Code block for item2

Item1 のインデントは4 (リストマーカーを空白として扱った場合) なので、次の段落「More text...」は同じインデントレベルで始まり、したがってコードブロックとして認識されません。

強調と打ち消し線の制限

標準の Markdown や GitHub Flavored Markdown とは異なり、Doxygen は内部のアンダースコア、アスタリスク、チルダに触れないため、以下はそのまま表示されます

a_nice_identifier

さらに、* または _ は、次の条件を満たす場合にのみ強調を開始し、~ は、次の条件を満たす場合にのみ打ち消し線を開始します

  • 英数字が続く場合、および
  • スペース、改行、または次のいずれかの文字 <{([,:; が先行する場合

強調または打ち消し線は、次の条件を満たす場合に終了します

  • 英数字が続かない場合、および
  • スペース、改行、または次のいずれかの文字 ({[<=+-\@ が先行しない場合

強調または打ち消し線のスパンは、単一の段落に制限されます。

最後に、C スタイルの Doxygen コメントブロック (つまり /``** ... *``/ ) 内で、行の先頭にアスタリスク * を使用してテキストの一部を強調表示したい場合、先頭に列「ラインアップ」として * がない場合、Doxygen は行の先頭にあるアスタリスクのシーケンスを「ラインアップ」として認識し、強調として認識しないことに注意してください。したがって、以下は太字としてレンダリングされません

/**
 **this is not bold**
 */

しかし、これは太字としてレンダリングされます

/**
 * **this is bold**
 */

コードスパンの制限

標準の Markdown とは異なり、Doxygen は以下をそのままにしておくことに注意してください。

A `cool' word in a `nice' sentence.

言い換えれば、単一引用符は、バックティックのペアで囲まれたコードスパンの特別な扱いをキャンセルします。この追加の制限は、下位互換性の理由で追加されました。

コードスパン内に単一引用符を使用したい場合は、1つのバックティックではなく、コードスパンの周りに2つのバックティックを使用してください。

二重バックティックも同様に二重引用符で終わります。

A ``cool'' word in a ``nice'' sentence.

リストの拡張

Markdown では、空行で区切られた2つのリストが1つのリストに結合されます。これは予期せぬことであり、多くの人がバグだと考えています。しかし、Doxygen は期待どおりに2つの個別のリストを作成します。

- Item1 of list 1
- Item2 of list 1

1. Item1 of list 2
2. Item2 of list 2

Markdown では、リストをマークするために使用する実際の数字は、Markdown が生成する HTML 出力に影響しません。つまり、標準の Markdown は以下を3つの番号付き項目を持つ1つのリストとして扱います

1. Item1
1. Item2
1. Item3

しかし、Doxygen はマークとして使用される数字が厳密に昇順であることを要求するため、上記の例では1つの項目を持つ3つのリストが生成されます。前の項目と同じかそれより小さい数字を持つ項目は、新しいリストを開始します。例えば

1. Item1 of list 1
3. Item2 of list 1
2. Item1 of list 2
4. Item2 of list 2

次が生成されます

  1. リスト1の項目1
  2. リスト1の項目2
  1. リスト2の項目1
  2. リスト2の項目2

歴史的に、Doxygen には -# マーカーを使用して番号付きリストを作成する追加の方法があります

-# item1
-# item2

チェック済みまたは未チェックのチェックボックスをインジケーターとするリストは、- [ ] または - [x] または - [X] をマーカーとして使用して作成されます

- [ ] unchecked
- [x] checked

アスタリスクの使用

コメントブロック内でリストを開始したり、水平線を作成したりするために * を使用する場合は、特別な注意が必要です。

Doxygen は、Markdown 処理を行う前に、コメントから先頭の * をすべて削除します。したがって、以下は正常に機能しますが

    /** A list:
     *  * item1
     *  * item2
     */

先頭の * を削除すると、Doxygen は他のアスタリスクも削除し、リストが消えてしまいます!

* で作成された水平線は、まったく表示されません。これらは Markdown ファイルでのみ機能します。

マークアップのスコープの制限

はぐれた * または _ が数段落後に何かに一致し、その間のすべてを強調表示してしまうのを避けるため、Doxygen は * と _ のスコープを単一の段落に制限します。

コードスパンの場合、開始バックティックと終了バックティックの間には2つの改行のみが許可されます。

リンクにも制限があります。リンクテキストとリンクタイトルはそれぞれ1つの改行のみを含めることができ、URL には改行を含めることはできません。

GitHub アラートのサポート

GitHub 版の Markdown には、いわゆるアラートのサポートがあります。構文は1レベルのブロッククォートの後に [!<alert>] が続く形式で、<alert>notewarningtipcautionimportant のいずれかになります。Doxygen では、これらのアラートは通常の Doxygen コマンドに翻訳されます

  • > [!note]\note に翻訳されます
  • > [!warning]\warning に翻訳されます
  • > [!tip]\remark に翻訳されます
  • > [!caution]\attention に翻訳されます
  • > [!important]\important に翻訳されます

> [!note]
> メモ用の特別なテキスト

これは次のようにレンダリングされます

メモ用の特別なテキスト

デバッグの問題

Doxygen はソースコードを解析するとき、まずコメントブロックを抽出し、次にこれらを Markdown プリプロセッサに通します。Markdown プリプロセッサの出力は、特殊コマンドHTML コマンドを含むテキストで構成されます。2回目のパスでは、Markdown プリプロセッサの出力を取得し、それをさまざまな出力形式に変換します。

Markdown プリプロセス中にエラーは生成されません。Markdown 構文に適合しないものはすべてそのまま渡されます。後続の解析フェーズでは、これはエラーにつながる可能性があり、中間形式に基づいているため、常に明らかではない場合があります。

Markdown 処理後の結果を確認するには、-d Markdown オプションを付けて Doxygen を実行します。その後、各コメントブロックが Markdown 処理の前後に表示されます。

次のセクションに進むか、インデックスに戻ります。