Syntax
このマニュアルのこのセクションでは、Documenterがドキュメントを構築するために使用する構文について説明します。サポートされているMarkdown構文については、documentation for the Markdown standard library in the Julia manualを参照してください。
@docsblock@autodocsblock@refand@idlinks@metablock@indexblock@contentsblock@exampleblock@replblock@setup <name>block@evalblock@raw <format>block
@docs block
ドキュメント内のコードブロックの代わりに、1つ以上のドキュメント文字列を挿入します。すなわち、
```@docs
Documenter
makedocs
deploydocs
```このブロックタイプは、定義されている場合は CurrentModule モジュール内で評価され、それ以外の場合は Main 内で評価されるため、ブロック内にリストされた各オブジェクトはそのモジュールから見える必要があります。未定義のオブジェクトは、ドキュメント生成中に警告を引き起こし、コードブロックは最終文書に変更されずにレンダリングされます。
オブジェクトはドキュメント内で一度しかリストされてはいけません。重複するオブジェクトが検出されると、エラーが発生し、ビルドプロセスが終了します。
モジュールからのすべてのドキュメント文字列が最終文書に含まれるようにするために、makedocs の modules キーワードを希望するモジュールまたはモジュールに設定できます。すなわち、
makedocs(
modules = [Documenter],
)どの未記載のドキュメント文字列も、makedocs が呼び出されると警告を引き起こします。modules が定義されていない場合、ドキュメントに欠落しているドキュメント文字列があっても警告は表示されません。
特定のメソッドのドキュメント文字列のみを表示するために、ディスパッチタイプを指定して @docs を使用できることにも注意してください。例えば、
```@docs
f(::Type1, ::Type2)
```fに関連するこれらの型のドキュメンテーション文字列のみが表示されます。これは、モジュールが関数を拡張し、その新しいメソッドにドキュメンテーション文字列を追加する場合に便利です。
署名を指定する際は、メソッド定義と正確に一致する必要があることに注意してください。Documenterはディスパッチルールに基づいてメソッドを一致させません。たとえば、foo(::Integer) = ...にドキュメント文字列が付いていると仮定すると、foo(::Number)やfoo(::Int64)はat-docsブロック内でそれに一致しません(Int64 <: Integer <: Numberであっても)。そのドキュメント文字列をスプライスする唯一の方法は、at-docsブロック内で正確にfoo(::Integer)をリストすることです。
@docs; canonical=false block
@docs に canonical キーワード引数を false として渡すことで、@docs が非標準であると見なされるべきであることを示すことができます。
```@docs; canonical=false
makedocs
```これは、チュートリアルなどのどこかにインラインでドキュメント文字列を含めたいときに便利ですが、ドキュメント文字列の標準バージョンはすでにAPIリファレンスにあります。参照はすべて標準の@docsブロックを指します。特定のドキュメント文字列については、@docs ; canonical=falseを使用して好きなだけ含めることができますが、標準でないものは一度だけ含めることができます。標準でない@docsブロックは、欠落しているドキュメント文字列をチェックする際には無視されます。
@autodocs block
提供されたモジュールからすべてのドキュメント文字列を自動的にスプライスし、コードブロックの代わりに配置します。これは、@docs ブロックにすべてのドキュメント文字列を手動で追加することと同等です。
```@autodocs
Modules = [Foo, Bar, Bar.Baz]
Order = [:function, :type]
```上記の @autodocs ブロックは、関数や型を参照するモジュール Foo、Bar、および Bar.Baz に見つかったすべてのドキュメント文字列をドキュメントに追加します。サブモジュールは、その中のドキュメント文字列を含めるために明示的にリストされる必要があることに注意してください。
各モジュールは順番に追加されるため、FooのドキュメントはBarのドキュメントの前に表示されます。Orderベクターの可能な値は次のとおりです。
:module:constant:type:function:macro
Orderが提供されていない場合は、上記に示された順序が使用されます。
潜在的なドキュメント文字列がリストされたモジュールのいずれかに見つかった場合、しかしそれが Order のいずれの値とも一致しない場合、それはドキュメントから省略されます。したがって、Order は基本的なフィルターおよびソーターとして機能します。
Orderに加えて、@autodocsにPagesベクターを含めることで、定義されているソースファイルに基づいてドキュメント文字列をフィルタリングできます:
```@autodocs
Modules = [Foo]
Pages = ["a.jl", "b.jl"]
```上記の例では、ソースファイルのファイルパスが a.jl および b.jl で終わるモジュール Foo のドキュメント文字列が含まれています。Pages によって提供されるページ順序もドキュメント文字列をソートするために使用されます。提供された文字列の末尾を使用してページの一致が行われるため、a.jl は 任意の ソースファイルのファイルパスが a.jl で終わる場合に一致します。つまり、src/a.jl、src/foo/a.jl または src/bar_a.jl です。
特定のドキュメント文字列を独自の基準でフィルタリングするには、Filterキーワードを使用して関数を提供できます:
```@autodocs
Modules = [Foo]
Filter = t -> typeof(t) === DataType && t <: Foo.C
```与えられた例では、Foo.Cのサブタイプのドックストリングのみが表示されています。anonymous functionの代わりに、事前に定義した関数の名前を指定することもできます。
```@autodocs
Modules = [Foo]
Filter = myCustomFilterFunction
```Modulesにリストされているモジュールから公開名のみを含めるには、Private = falseを使用します。同様に、Public = falseを使用すると、プライベート名のみを表示できます。デフォルトでは、これらの両方はtrueに設定されているため、すべての名前が表示されます。
Juliaのバージョン1.10まで、"public"は"exported"と同義です。Julia v1.11以降、"public"は"exported または publicキーワードでマークされた"ことを意味します。
Functions exported from `Foo`:
```@autodocs
Modules = [Foo]
Private = false
Order = [:function]
```
Private types in module `Foo`:
```@autodocs
Modules = [Foo]
Public = false
Order = [:type]
```より複雑なソートが必要な場合は、@docsを使用して明示的に定義します。
@docsと同様に、@autodocs; canonical=falseを使用して、非標準の@autodocsブロックを示すことができます。@docs; canonical=false blockを参照してください。
@ref and @id links
マークダウンリンクで使用され、Documenterに自動的にクロスリファレンスを生成するよう指示するためのURLです。リンクのテキスト部分は、コードオブジェクト(バックティックで囲まれたもの)、ヘッダー名、またはGitHubのPR/Issue番号(#の後に数字)であることができます。
# Syntax
... [`makedocs`](@ref) ...
# Functions
```@docs
makedocs
```
... [Syntax](@ref) ...
... [#42](@ref) ...リンクの「テキスト」部分のプレーンテキストは、ヘッダーへのクロスリファレンスであるか、# に続く数字の場合は GitHub のイシュー/プルリクエストを指します。バックティックで囲まれたテキストは、@docs または @autodocs ブロックからのドキュメント文字列へのクロスリファレンスになります。
バックティックで囲まれたコードは、現在のページの @meta ブロックで指定された CurrentModule で評価されます(デフォルトでは Main)。ドキュメント文字列内の @ref リンクの場合、CurrentModule は自動的にドキュメント文字列を含むモジュールに設定されます。
完全修飾名(例:[`Example.domath`](@ref)または[domath](@ref Example.domath))の参照は、Mainでも解決されます。つまり、docs/make.jlでパッケージをロードすることで、どこからでも完全修飾の@refリンクが機能することが保証されます。
@refリンクは、同じ構文を使用して、現在のページだけでなく、異なるページのドキュメント文字列やヘッダーを参照することがあります。
Named @refs
@refリンクの宛先をオーバーライドすることも可能であり、ドキュメント文字列の参照やページ見出しなど、適切なラベルをリンクに追加することで実現できます。
Both of the following references point to `g` found in module `Main.Other`:
* [`Main.Other.g`](@ref)
* [the `g` function](@ref Main.Other.g)
Both of the following point to the heading "On Something":
* [On Something](@ref)
* [The section about something.](@ref "On Something")これは、現在のモジュールにインポートされていない参照のために完全修飾名を書く必要がないようにするため、またはリンクに表示されるテキストが周囲のテキストに追加の意味を加えるために使用される場合に便利です。
Use [`for i = 1:10 ...`](@ref for) to loop over all the numbers from 1 to 10.名前付きの @ref は控えめに使用するべきです。なぜなら、資格のない名前を書くことは、同じ名前の定義を提供する複数のモジュールが存在する場合、特定のドキュメント文字列でどの関数が参照されているのかを判断するのが難しくなることがあるからです。
Duplicate Headers
場合によっては、ドキュメントに同じ名前のヘッダーが複数含まれていることがありますが、それは異なるページや異なるレベルにあります。重複したヘッダーを @ref で相互参照できるようにするには、以下の例のように名前を付ける必要があります。
# [Header](@id my_custom_header_name)
...
## Header
... [Custom Header](@ref my_custom_header_name) ...名前付きヘッダーを囲むリンクは最終文書から削除されます。名前付き @ref ... のテキストは、参照するヘッダーと一致する必要はありません。名前付き @ref ... は、名前のないものと同様に、異なるページのヘッダーを参照することができます。
重複したドキュメント文字列の参照は発生しません。なぜなら、同じドキュメント文字列を文書に複数回挿入することは許可されていないからです。
ユーザー定義のヘッダー参照ラベルと内部生成のヘッダー参照ラベルは、競合がある場合にはドキュメント文字列の参照よりも優先されます。
@extref link
DocumenterInterLinks pluginを使用すると、Documenterによって生成された他のプロジェクトのドキュメントを相互参照することが可能です。また、Sphinxを使用して、内部参照用の組み込み@refリンクに似た@extrefリンクを使用できます。
External Cross-References と documentation of the DocumenterInterLinks package の詳細については、こちらをご覧ください。
@meta block
このブロックタイプは、ページの他の場所で使用できるメタデータのキー/値ペアを定義するために使用されます。現在認識されているキー:
CurrentModule: Documenterが評価するモジュール、例えば、@docs-blockおよび@ref-linkです。DocTestSetup: doctestの前に評価されるコード。Doctestsの下にあるSetup and Teardown Codeセクションを参照してください。DocTestTeardown: ドクトテストの後に評価されるコード。Doctests の下にある Setup and Teardown Code セクションを参照してください。DocTestFilters: 予測できない出力を扱うためのフィルター、例えば、44696e6720446f637465737473_40726566セクションの下にある Filtering Doctests を参照してください。EditURL: ページを編集できる場所へのリンク。これはデフォルトで.mdページ自体に設定されますが、ソースが別のものである場合(例えば、.mdページがドキュメントビルドの一部として生成される場合)、これはローカルリンクまたは絶対URLとして設定できます。Description: 検索エンジンやリンクのプレビューに表示されるページ固有の説明。makedocsのサイト全体の説明を上書きします。Draft: ページのグローバルドラフトモードをオーバーライドするためのブール値。CollapsedDocStrings: この設定がtrueに設定されている場合、現在サポートされている出力フォーマット(すなわち、HTMLのみ)では、すべてのドキュメント文字列をデフォルトで折りたたんで表示します。ShareDefaultModule:trueに設定すると、すべての名前のない@example、@repl、および@setupブロックは同じ評価サンドボックスモジュールを共有します。これは、チュートリアルのような文書を書くのに便利です。false(デフォルト)の場合、名前のないブロックはそれぞれ別のサンドボックスモジュールを持ち、そこでコードが評価されます。いずれの場合でも、名前付きブロックは常に独自のサンドボックスモジュールを持ち、同じ名前のブロックによって共有されます。
例:
```@meta
CurrentModule = FooBar
DocTestSetup = quote
using MyPackage
end
DocTestFilters = [r"Stacktrace:[\s\S]+"]
EditURL = "link/to/source/file"
```@meta ブロックは常に Main で評価されることに注意してください。
@index block
ドキュメントにスプライスされたドキュメント文字列へのリンクのリストを生成します。有効な設定は Pages、Modules、および Order です。例えば:
```@index
Pages = ["foo.md"]
Modules = [Foo, Bar]
Order = [:function, :type]
```PagesまたはModulesが提供されていない場合、すべてのページまたはモジュールが含まれます。Orderのデフォルトは
[:module, :constant, :type, :function, :macro]指定されていない場合、Order と Modules は @autodocs block と同様に動作し、指定されたモジュールまたはカテゴリのいずれかに一致しないドキュメント文字列をフィルタリングします。
Pages、Modules、および Order に割り当てられた値は、任意の有効な Julia コードである可能性があり、必要に応じて配列リテラルよりも複雑なものにすることができます。すなわち、
```@index
Pages = map(file -> joinpath("man", file), readdir("man"))
```ただし、この場合 Pages はユーザーが期待する順序でソートされていない可能性があることに注意してください。できるだけ配列リテラルを使用するようにしてください。
@contents block
ドキュメントセクションへのリンクのネストされたリストを生成します。有効な設定は Pages と Depth です。
```@contents
Pages = ["foo.md"]
Depth = 5
```@indexと同様に、Pagesが指定されていない場合はすべてのページが含まれます。デフォルトのDepth値は2で、つまりヘッダーのレベル1と2が含まれます。DepthはUnitRangeも受け入れるため、表示される最小ヘッダー レベルを設定することも可能です。たとえば、Depth = 2:3を使用すると、レベル2-3のヘッダーのみを含めることができます。
いくつかのケースでは、サイドバーの一部を@contentsブロックに複製することが望ましい場合があります。コードを重複させずにこれを達成するための可能なパターンは、make.jl内でグローバル変数を通じてpagesキーワードエントリを定義することです。例えば、
SUBSECTION_PAGES = ["subsection/a.md", "subsection/b.md"]
makedocs(
pages = [
"index.md",
"Subsection" => SUBSECTION_PAGES,
...その変数は Main モジュールに存在し、@contents や他のブロックで再利用できます。例えば、
```@contents
Pages = Main.SUBSECTION_PAGES
```Documenterは「サブセクション」ページの内容をリストし、それらは常にサイドバーに表示されているのと同じ順序で表示されます。
@example block
コードブロックを評価し、最後の式の結果を元のソースコードと共に最終文書に挿入します。最後の式が nothing を返す場合、ブロック全体の stdout と stderr ストリームが代わりに挿入されます。最後の行の末尾にあるセミコロン ; は影響を与えません。
```@example
a = 1
b = 2
a + b
```上記の @example ブロックは、以下を最終文書に挿入します。
```julia
a = 1
b = 2
a + b
```
```
3
```レンダリングされたコードブロックから先頭と末尾の改行が削除されます。各行の末尾の空白も削除されます。
作業ディレクトリ pwd は、ファイルが書き込まれる build 内のディレクトリに設定され、include 呼び出しのパスは pwd に対して相対的に解釈されます。これは、makedocs の workdir キーワードを使用してカスタマイズできます。
ソースコードの隠蔽
コードブロックには、最終文書に表示する必要のないコンテンツが含まれている場合があります。レンダリングされるべきでない行には # hide コメントを追加できます。すなわち、
```@example
import Random # hide
Random.seed!(1) # hide
A = rand(3, 3)
b = [1, 2, 3]
A \ b
```@example ブロックの各行に # hide を追加すると、レンダリングされたドキュメントでそのブロックが非表示になります。ただし、結果ブロックはまだレンダリングされます。 @setup ブロックは、出力を含む全体のブロックを非表示にするための便利なショートハンドです。
空の出力
@example ブロックが nothing を返すと、結果ブロックにはブロック全体で生成された stdout および stderr ストリームが表示されます。これらが空の場合、結果ブロックは表示されず、レンダリングされたドキュメントにはソースコードブロックのみが表示されます。
名前付き @example ブロック
デフォルトでは、@example ブロックは、それぞれの匿名 Module 内で実行され、ブロック間の副作用を避けます。ページ上の異なるブロック間で同じモジュールを共有するには、次の構文を使用して @example に名前を付けることができます。
```@example 1
a = 1
```
```@example 1
println(a)
```名前は上記の例のように整数だけでなく、任意のテキストにすることができます。つまり、@example fooのように。
すべての無名ブロック間でモジュールをデフォルトで共有するには、たくさんの例がすべて関連しているチュートリアルで、ページの @meta ブロックに ShareDefaultModule = true を設定できます。
@example ブロックは、以下の例に示すように、中間的な説明やプロットなどのマルチメディアを必要とするドキュメントを生成する際に便利です。
First we define some functions
```@example 1
using PyPlot # hide
f(x) = sin(2x) + 1
g(x) = cos(x) - x
```
and then we plot `f` over the interval from ``-π`` to ``π``
```@example 1
x = range(-π, π; length=50)
plot(x, f.(x), color = "red")
savefig("f-plot.svg"); nothing # hide
```

and then we do the same with `g`
```@example 1
plot(x, g.(x), color = "blue")
savefig("g-plot.svg"); nothing # hide
```
@example ブロックは、ファイルがレンダリングされる build ディレクトリ内で評価されることに注意してください。これは、上記の例では savefig がそのディレクトリに .svg ファイルを出力することを意味します。これにより、相対パスを気にすることなく、画像を簡単に参照できるようになります。
If you use Plots.jl with the default backend GR.jl, you will likely see warnings like
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.これを修正するには、環境変数 GKSwstype を 100 に設定する必要があります。たとえば、GitHub Actionsを使用してドキュメントをビルドする場合、デフォルトのスクリプトを次のように変更できます。
- name: Build and deploy
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # For authentication with GitHub Actions token
DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # For authentication with SSH deploy key
GKSwstype: "100" # https://discourse.julialang.org/t/generation-of-documentation-fails-qt-qpa-xcb-could-not-connect-to-display/60988
run: julia --project=docs --color=yes docs/make.jl代わりに、Julia内でこの環境変数を直接設定することができます。
ENV["GKSwstype"] = "100"@example ブロックは自動的に ans を定義します。これは、Julia REPL のように、最後に評価された式の値にバインドされます。これは、plot によって返されたオブジェクトを名前付き変数にバインドすることが最終的にレンダリングされたドキュメントで不自然に見えるような次のような状況で便利です:
```@example
using Gadfly # hide
plot([sin, x -> 2sin(x) + x], -2π, 2π)
draw(SVG("plot.svg", 6inch, 4inch), ans); nothing # hide
```
カラー出力
@example ブロックは、ANSI escape codes を HTML にマッピングすることで、カラー テキスト出力をサポートします。たとえば、このブロック:
```@example
printstyled("Here are some colors:\n"; color=:red, bold=true)
for color in 0:15
print("\e[38;5;$(color);48;5;$(color)m ")
print("\e[49m", lpad(color, 3), " ")
color % 8 == 7 && println()
end
print("\e[m")
```以下の入力および出力ブロックの結果:
printstyled("Here are some colors:\n"; color=:red, bold=true)
for color in 0:15
print("\e[38;5;$(color);48;5;$(color)m ")
print("\e[49m", lpad(color, 3), " ")
color % 8 == 7 && println()
end
print("\e[m")Here are some colors:
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
グローバルにカラー出力を無効にするには、ansicolor=falseをDocumenter.HTMLに渡します。また、ブロック内でローカルに無効にするには、ansicolor=falseを使用します。次のように:
```@example; ansicolor=false
printstyled("hello, world"; color=:red, bold=true)
```@example ブロックの遅延実行
@example ブロックは、continued というキーワード引数を受け入れ、true または false に設定できます(デフォルトは false)。continued = true の場合、コードの実行は次の continued = false の @example ブロックまで遅延されます。これは、ブロック内の式が完了していない場合などに必要です。例:
```@example half-loop; continued = true
for i in 1:3
j = i^2
```
Some text explaining what we should do with `j`
```@example half-loop
println(j)
end
```ここでは最初のブロックが不完全です – ループが end を欠いています。したがって、ここで continued = true を設定することで、最初のブロックの評価を遅らせ、2番目のブロックに到達するまで待ちます。 continued = true のブロックには出力がありません。
@repl block
これらは @example ブロックに似ていますが、各トップレベルの式の前に julia> プロンプトを追加し、エラーに遭遇しても失敗しません。 # hide 構文は、@example ブロックと同様に @repl ブロックでも使用できます。さらに、行の末尾にセミコロン ; を付けることで、Julia REPL のように出力を抑制します。
```@repl
a = 1
b = 2
a + b
```生成します
```julia
julia> a = 1
1
julia> b = 2
2
julia> a + b
3
```そして同様に
```@repl
sqrt(-1)
```生成します
```julia
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
```@repl ブロックは、@example ブロックと同様にカラー出力をサポートしています。次のブロック
```@repl
printstyled("hello, world"; color=:red, bold=true)
```gives
julia> printstyled("hello, world"; color=:red, bold=true)hello, world
グローバルにカラー出力を無効にするには、ansicolor=falseをDocumenter.HTMLに渡します。また、ブロック内でローカルに無効にするには、ansicolor=falseを使用します。次のように:
```@repl; ansicolor=false
printstyled("hello, world"; color=:red, bold=true)
```名前付き @repl <name> ブロックは、名前付き @example <name> ブロックと同じように動作します。
作業ディレクトリ pwd は、ファイルが書き込まれる build 内のディレクトリに設定され、include 呼び出しのパスは pwd に対して相対的に解釈されます。これは、makedocs の workdir キーワードを使用してカスタマイズできます。
Julia 1.5は、forループなどでグローバル変数を扱う際にソフトスコープを使用するようにREPLを変更しました。Julia 1.5以降でDocumenterを使用する場合、Documenterは@replブロックおよびREPLタイプのドクトテストでソフトスコープを使用します。
@setup <name> block
これらは @example ブロックに似ていますが、入力と出力の両方が最終文書から隠されています。これは、隠す必要があるセットアップコードの行がいくつかある場合に便利です。
@exampleや@replブロックとは異なり、@setupは下流の@example <name>および@repl <name>ブロックに関連付けるために<name>属性を必要とします。
```@setup abc
using RDatasets
using DataFrames
iris = dataset("datasets", "iris")
```
```@example abc
println(iris)
```@eval block
ブロックの内容を評価し、最後の式が nothing に評価されない限り、結果の値を最終文書に挿入します。
以下の例では、PyPlotパッケージを使用してプロットを生成し、最終的なドキュメントに表示します。
```@eval
using PyPlot
x = range(-π, π; length=50)
y = sin.(x)
plot(x, y, color = "red")
savefig("plot.svg")
nothing
```
上記の例で nothing を返す代わりに、Markdown.parse を通じて新しい Markdown.MD オブジェクトを返すことができます。これは、ファイル名がブロック自体の評価まで知られていない場合により適切です。
別の例は、CSVやJSONなどの機械可読データ形式からマークダウンテーブルを生成することです。
```@eval
using CSV
using Latexify
df = CSV.read("table.csv")
mdtable(df, latex=false)
```CSVファイルtable.csvのマークダウンバージョンを生成し、出力形式でレンダリングします。
@eval ブロック内の最終的な式は、nothing または有効な Markdown.MD オブジェクトでなければなりません。他のオブジェクトは警告を生成し、テキスト形式でコードブロックとしてレンダリングされますが、この動作は変更される可能性があり、信頼すべきではありません。
各 @eval ブロックは、その内容を別のモジュール内で評価することに注意してください。各ブロックを評価する際、現在の作業ディレクトリ pwd は、ファイルが書き込まれる build 内のディレクトリに設定され、include 呼び出しのパスは pwd に対して相対的に解釈されます。
ほとんどの場合、@example は @eval よりも好まれます。通常のJuliaコードと同様に、eval は最後の手段としてのみ考慮されるべきであり、@eval も同じように扱われるべきです。
@raw <format> block
最終文書にコードをそのまま挿入できるようにします。例えば、出力にカスタムHTMLやLaTeXコードを挿入するためです。
format 引数は必須であり、Documenter は特定のブロックを出力にコピーするかどうかを判断するためにこれを使用します。現在サポートされているフォーマットは html と latex で、それぞれのライターによって使用されます。format が認識されない @raw ブロックは通常無視されるため、出力フォーマットごとに生のブロックを持つことが可能であり、ブロックが出力に重複することはありません。
次の例は、カスタムスタイルを持つSVGコードを@rawブロックを使用してドキュメントに含める方法を示しています。
```@raw html
<svg style="display: block; margin: 0 auto;" width="5em" height="5em">
<circle cx="2.5em" cy="2.5em" r="2em" stroke="black" stroke-width=".1em" fill="red" />
</svg>
```次のように表示され、コードはHTMLファイルにそのままコピーされます。