// Copyright (c) 2015-2024, The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

[[markup]]
= Markup Style

This chapter demonstrates Asciidoc and Specification structure, including
text layout and markup style.

Chapters and sections follow a rigid template consisting of an optional
anchor (if other parts of the document cross-reference the section) followed
by a one line title (see
http://asciidoctor.org/docs/user-manual/#sections[section 19 of the
Asciidoctor User Manual]) and a blank line.
The anchor is typically the base name of the file containing the chapter,
with a lowercase version of the section name following, with spaces replaced
by dashes.

Always use the one-line title form, with one to four = signs preceding the
chapter/section title.
The two-line title form cannot be easily searched for and often looks like
other types of asciidoc delimiters.
Using a mix of one-line and two-line titles causes compatibility issues, and
using the two-line title form
http://asciidoctor.org/docs/user-manual/#changed-syntax[implicitly sets
syntax compatibility mode].

Always precede the anchor by two blank lines (except at the beginning of a
file), and follow the title by a blank line, to set off sections visibly.

[source,asciidoc]
.Example Markup
----
[[markup]]
= Markup Style


[[markup-sample-section]]
== Sample Section
----


[[markup-sample-section]]
== Sample Section

This is a sample section structurally similar to the <<vulkan-spec,Vulkan
API Specification>>, nested one level inside a chapter.
Sections can be nested up to level 5, although not all levels are included
in the Table of Contents.


[[markup-layout]]
== Asciidoc Markup And Text Layout

Asciidoc source should be text filled to 76 columns with hard line breaks.
Each sentence in a paragraph ends with a newline to minimize git diff
conflicts.
Except when necessary for lists or other markup, text should begin at the
first column of each line (leading spaces are often semantically meaningful
in asciidoc markup).

UTF-8 characters outside the ASCII subset should be used sparingly, only
when needed for non-English names.
Instead use asciidoc markup for special characters, if required.
For example, two hyphens produces an en-dash:

[NOTE]
.Example Markup
====

`An +--+ en-dash` -> An -- en-dash
====

As an exception, multiplication should be marked with the unicode
multiplication symbol "`×`" (and *not* an asterisk) when used in plain text.
You may also use the `{times}` asciidoc attribute for this symbol.
In math sections, the same symbol should be referred to as `\times`.
In code sections, a conventional asterisk (`*`) should be used instead.

See http://asciidoctor.org/docs/user-manual/#special-characters[section 40
of the Asciidoctor User Manual] for supported special characters, as well as
use of entity references.

Quotation marks should use the 66/99 convention.
That is, double asymmetric quotation marks, indicated by a quotation mark
then a backtick as opening marks, and a backtick then quotation mark as
closing marks (pass:["`like this`"]), which renders "`like this`".

_Never_ use hard tabs or trailing blanks.

* In some cases, limitations of asciidoc markup may result in lines that are
  longer than 76 characters and cannot easily be shortened without
  compromising the output documents.


[[markup-blocks]]
=== Blocks

There are a variety of asciidoc _block_ constructs.
With the exception of <<markup-sample-section-tables,tables>> and of _open
blocks_ used to group markup together, blocks should be delimited by exactly
four repeated characters indicating the block type, for consistency.
The block types and delimiters are shown in the following table.

.Asciidoc Block Delimiters
[width="70%",options="header",cols="25%,10%,65%"]
|====
| Table Type    | Delimiter   | Comments
| Open          | `--`        | For <<markup-sample-section-bullet-lists,continuation blocks>>
| Example       | `====`      | For <<markup-informative-notes,Notes>>
| Passthrough   | pass:[++++] | For some kinds of <<writing-math,math markup>>
| Comment       | ////        |
| Listing       | ----        | For source code listings
| Sidebar       | pass:[****] | For <<markup-implementors-notes,implementor's notes>>
| Table         | `\|====`    | For <<markup-sample-section-tables,tables>>
| Quote         | pass:[____] | Currently unused in the OpenXR Specification
| Literal       | ....        | Currently unused in the OpenXR Specification
|====


[[markup-footnotes]]
=== Footnotes

Use manually marked-up footnotes (the asciidoc footnote construct is OK for
PDF outputs, but does not work well with long HTML documents since it places
all footnotes at the end of the document).

Refer to footnotes with asciidoc superscript notation^1^, and mark up the
footnotes below, but near the references as labeled lists.
Manually assigned footnote numbers will inevitably be reused, which is OK as
long as the colliding numbers are not in the same section.

1::
    Like this example footnote.

[NOTE]
.Example Markup
--
[source,asciidoc]
----
See reference^2^

2::
    Reference 2.
----

->

See reference^2^

2::
    Reference 2.
--


[[markup-sample-section-lists]]
=== Lists

[[markup-sample-section-bullet-lists]]
==== Bullet Lists and Continuation Blocks

* Bullet lists are the preferred form of list, aside from glossary
  definitions.
* Lists should have no indentation for the list item delimiter (e.g. one or
  more asterisks, for bullet lists) and one space between the delimiter and
  the text.
+
--
Note that continuation blocks for list items longer than one paragraph
cannot be indented, only the first paragraph.

In general, successive list items should not be separated by white space.
However, list continuation blocks should be followed by a `+` on a line by
itself, or by a blank line, due to limitations of the asciidoc parser.
--
+
* For bullet lists that extend over multiple lines, indent the successive
  lines to align with the text of the first line in that bullet.
  This lets us visually distinguish lists from other kinds of markup.
** Nested lists should align the leftmost list item delimiter (bullet, etc.)
   with the parent delimiter.

[source,asciidoc]
.Example Markup
----
* This is the first item in a bullet list.
** This is a nested item for the first item.
* The second item is described with two paragraphs.
  The second paragraph is in a continuation block:
+
--
This is a continuation block containing the second paragraph on a new line.
--
+
** This is a nested list item for the second item.
   Since it follows a continuation block, it must be separated by a blank
   line or `+` from that block.
----

[[markup-labeled-lists]]
==== Labeled Lists

Labeled lists may be used in some cases such as
<<markup-footnotes,footnotes>>; glossary entries; and long lists of
information about similar names, such as the "`Features, Limits, and
Formats`" chapter of the OpenXR Specification (there is no example currently
in the OpenXR specification directly).
Whenever labeled lists are used the label and its terminating double colon
must be alone on a line, followed by the contents of that list entry.

For consistency do not use labels ending in three or four colons, or two
semicolons, even though these forms are allowed in asciidoc markup.

[source,asciidoc]
.Example Markup
----
Glossary Entry::
    This is a glossary entry.

Last Modified Date::
    2016-02-16
----


[[markup-numbered-lists]]
==== Numbered Lists

Numbered lists may be used if strictly necessary to place an ordering on
list items.
Always use _implicit numbering_, with the bullet point being a single
period.

  . Explicit numbering with a number preceding the period is prone to
    accumulating errors as edits are made.
  . In addition, the markup is harder to recognize for scripts and tools
    (other than asciidoc itself) operating on the document source.

[source,asciidoc]
.Example Markup
----
. First list item.
. Second list item.
. Etc.
----


[[markup-sample-section-anchors]]
=== Anchors and Cross-references

In general, chapters and sections should always have anchors, following the
naming convention <<markup,discussed above>>.
Anchors to other sections of the document may be inserted as needed.
In addition, the autogenerated include files defining commands, structures,
enumerations and flags all define anchors whose name is the name of the
command or type being defined, so it is easy to link to a (for example) a
command name such as <<xrCreateInstance,xrCreateInstance>>.
However, using the <<markup-macros,markup macros>> described below is
preferred when linking to anchors corresponding to API names, such as
flink:xrCreateInstance.

If you want a cross-reference to an anchor to appear as something other than
the raw anchor name, always make sure to include that text as part of the
cross-reference.
There are several different toolchains followed for various forms of
asciidoc output, and not all of them treat anchors without alt-text the same
way.

[source,asciidoc]
.Example Markup
----
In general, chapters and sections should always have anchors, following the
naming convention <<markup,discussed above>>.
...
so it is easy to link to a (for example) a command name such as
<<xrCreateCommandPool,xrCreateCommandPool>>. However, using the
<<markup-macros,markup macros>> described below is preferred when linking to
anchors corresponding to API names, such as flink:xrCreateCommandPool.
----

[[markup-sample-section-extensions]]
==== Extensions

Extensions, like commands and structures, have an auto-generated anchor.
The standardized way of referring to an extension by name is to prepend
`apiext{cl}`: for example, apiext:XR_KHR_vulkan_enable.
When a link would be inappropriate (e.g. in the "`Name`" portion of the
extension's spec itself), surrounding it with backticks is acceptable:
`XR_KHR_vulkan_enable`.

[source,asciidoc]
.Example Markup
----
Extensions, like commands and structures, have an auto-generated anchor.
The standardized way of referring to an extension by name is to prepend
`apiext{cl}`: for example, apiext:XR_KHR_vulkan_enable.
When a link would be inappropriate (e.g. in the "`Name`" portion of the
extension's spec itself), surrounding it with backticks is acceptable:
`XR_KHR_vulkan_enable`.
----

[[markup-sample-section-tables]]
=== Tables

Asciidoc tables should use the block prefix `|====`.
Where feasible, align the `|` separating cells across rows.
This will sometimes result in very wide tables in the source document, but
makes it easier to see which cells belong to which column.
Alternatively, long cells can be broken onto a separate line with the `|`
separator appearing first, except for the first row of the table, which must
all appear on a single line.

Tables should usually be preceded with a short title.

[source,asciidoc]
.Example Markup
----
.Normative Terminology Macros
[width="100%",options="header"]
|====
| Macro Name     | Output
| can{cl}        | can:
| cannot{cl}     | cannot:
|====
----


[[markup-sample-section-images]]
=== Figures

All figures (images) must be marked up as follows, to ensure there is an
anchor and that the figure is given a caption which shows the figure number
and is added to the list of figures:

[source,asciidoc]
.Example Markup
----
[[fig-anchorname]]
image::images/imagename.svg[align="center",title="Figure caption",{fullimagewidth}]
----

There must be both .svg and .pdf versions of each figure checked into the
+images/+ directory, to support generating both HTML and PDF outputs.
It is best to create images in Inkscape as SVG files and then use the
conversion rule in `doc/specs/vulkan/images/Makefile` to generate PDF.

Asciidoc restricts captions in figures to be a single line in the source
document.
If a longer caption is required, follow the figure directive with a sidebar
block including the full caption preceded by a link to the figure:

[source,asciidoc]
.Example Markup
----
.Caption
****
In the <<fig-anchorname,Figure caption>> diagram, the diagram represents
... long caption text here.
****
----


[[markup-macros]]
== Markup Macros and Normative Terminology

This section discusses Asciidoc macros used in the document.
In addition to the macros defined by asciidoc itself, additional macros are
defined by the link:{uri-openxr-ratified-spec}[OpenXR API Specification] and
Reference Page configuration files.


[[markup-macros-api]]
=== API Markup Macros

These macros must be used to tag command, structure, enumeration, enumerant,
and other OpenXR-specific names so they can be rendered in a distinctive
fashion, link to definitions of those names, and be easily searched for in
the source documents.
The validation scripts (`make allchecks` output) also rely on these macros
being used consistently and correctly.
The API markup macros, with examples of their use, are in the following
table:

.API Markup Macros
[width="100%",options="header",cols="20%,80%"]
|====
| Macro Name       | Usage and Meaning
| flink{cl}        | Generates a cross-reference or link to the definition of
                     the command name in the macro argument. Example:
                     flink{cl}xrCreateInstance -> flink:xrCreateInstance.
| fname{cl}        | Formats the macro argument like flink{cl}. Does not
                     generate a cross-reference. Example:
                     fname{cl}xrCreateInstance -> fname:xrCreateInstance.

                     Only use this macro <<markup-macros-api-name, when
                     necessary>>.
| ftext{cl}        | Formats the macro argument like fname{cl}. May contain
                     asterisks for wildcards. Not validated. Example:
                     ftext{cl}xrCreate* -> ftext:xrCreate*.

                     Only use this macro <<markup-macros-api-text, when
                     necessary>>.
| slink{cl}        | Generates a cross-reference or link to the definition
                     of the structure or handle in the macro argument. Example:
                     slink{cl}XrInstanceCreateInfo -> slink:XrInstanceCreateInfo
| sname{cl}        | Formats the macro argument like slink{cl}. Does not
                     generate a cross-reference. May also be an abstract
                     structure or handle name. Example:
                     sname{cl}XrInstanceCreateInfo ->
                     sname:XrInstanceCreateInfo.

                     Only use this macro <<markup-macros-api-name, when
                     necessary>>.
| stext{cl}        | Formats the macro argument like sname{cl}. May contain
                     asterisks for wildcards. Not validated. Example:
                     stext{cl}Xr*CreateInfo -> stext:Xr*CreateInfo.

                     Only use this macro <<markup-macros-api-text, when
                     necessary>>.
| elink{cl}        | Formats the macro argument as an OpenXR enumerated
                     type name and links to the definition of that enumeration
                     type. Example: ename{cl}XrResult -> ename:XrResult.
| ename{cl}        | Formats the macro argument as an OpenXR enumerant name.
                     Example: ename{cl}XR_SUCCESS -> ename:XR_SUCCESS.
| etext{cl}        | Formats the macro argument like ename{cl}. Not validated.
                     Examples: etext{cl}_RANGE_SIZE -> etext:_RANGE_SIZE,
                     etext{cl}XR_ERROR_* ->
                     etext:XR_ERROR_*

                     Only use this macro <<markup-macros-api-text, when
                     necessary>>.
| pname{cl}        | Formats the macro argument as a OpenXR parameter or
                     structure member name. Example: pname{cl}device ->
                     pname:device.
| ptext{cl}        | Formats the macro argument like pname{cl}. May contain
                     asterisks for wildcards. Not validated. Example:
                     ptext{cl}sparseResidency* -> ptext:sparseResidency*.

                     Only use this macro <<markup-macros-api-text, when
                     necessary>>.
| tlink{cl}        | Generates a cross-reference or link to the definition
                     of the OpenXR type in the macro argument. Example:
                     tlink{cl}PFN_xrVoidFunction ->
                     tlink:PFN_xrVoidFunction. This is only used for
                     function pointer types at present.
| tname{cl}        | Formats the macro argument like tlink{cl}. Does not
                     generate a cross-reference. Example:
                     tname{cl}PFN_xrVoidFunction ->
                     tname:PFN_xrVoidFunction.

                     Only use this macro <<markup-macros-api-name, when
                     necessary>>.
| dlink{cl}        | Generates a cross-reference or link to the definition of
                     the OpenXR C macro in the macro argument. Example:
                     dlink{cl}XR_NULL_HANDLE -> dlink:XR_NULL_HANDLE. There are
                     only a few macros in the OpenXR API, described in the
                     "`e`" appendix of the link:{uri-openxr-ratified-spec}[OpenXR
                     API Specification]
| dname{cl}        | Formats the macro argument like dlink{cl}. Does not
                     generate a cross-reference.

                     Only use this macro <<markup-macros-api-name, when
                     necessary>>.
| basetype{cl}     | Formats the macro argument like a basic scalar type.
                     Example:
                     basetype{cl}XrBool32 -> basetype:XrBool32
| apiext{cl}       | Generates a cross-reference or link to the target as an
                     extension.
| code{cl}         | Formats the macro argument as a code sample. Primarily
                     used for SPIR-V keywords and builtin C types. Examples:
                     code{cl}uint32_t -> code:uint32_t,
                     code{cl}ClipDistance -> code:ClipDistance.
| pathname{cl}     | Formats the macro argument as a full semantic path name
                     string. Example:
                     pathname{cl}/user/hand/left -> pathname:/user/hand/left.
| subpathname{cl}  | Formats the macro argument as a substring of a semantic
                     path name.
                     Example:
                     subpathname{cl}/click -> subpathname:/click
| actionname{cl}   | Formats the macro argument as the characters of an action name.
                     Example:
                     actionname{cl}hold -> actionname:hold
|====

When referring to a compound name (function-parameter, or structure-member),
combine the macros separated by two colons, resulting in
flink:xrCreateInstance::pname:info and
slink:XrInstanceCreateInfo::pname:flags.
This is often done when referring to a particular parameter or member in a
part of the document other than the description of the corresponding
function or structure.

[source,asciidoc]
.Example Markup
----
flink:xrCreateInstance::pname:info
slink:XrInstanceCreateInfo::pname:flags.
----


[[markup-macros-api-name]]
==== When To Use *name: Macros

Only use the fname{cl}, sname{cl}, tname{cl}, and dname{cl} macros if no
definition of the target type with a corresponding anchor exists in the
document.
Anchors are automatically defined when including the generated API interface
definitions under `specification/generated/api/.../*txt`.
If an anchor does exist, use the corresponding *link{cl} macro.

[[markup-macros-api-text]]
==== When To Use *text: Macros

Only use the ftext{cl}, stext{cl}, etext{cl}, and ptext{cl} macros when
describing something something that should be rendered like a command,
structure, enumerant, or parameter name, respectively, but is not actually
one.
Typically these macros are used for wildcards describing multiple API names
with common prefixes or suffixes, or common subsets of API names.

==== Other Markup

Uses of standard Asciidoc markup are less common.
Occasional asterisk markup is used for *emphasis*.
Underscores are used for _glossary terms_, as well as placeholder text.
Backtick markup is used for filenames, literal character sequences, code
that does not fit one of the more specific macros above, and entities (such
as previous names of extensions) that should be excluded from verification
by toolchain scripts.
The C code:NULL macro is marked up using the `code{cl}` macro.

[source,asciidoc]
.Example Markup
----
*emphasis*
_semantic path_
`extensions/__extension_name__.adoc`
`openxr.h`
code:NULL
----

==== Glossary Terms

Glossary terms are currently marked up using underscore markup where they
are defined in the documents, as well as being added to the formal Glossary
appendix in the link:{uri-openxr-ratified-spec}[OpenXR API Specification].
However, we will probably change to using custom macros soon, to enable
linkage between the glossary and definitions in the spec body.

[source,asciidoc]
.Example Markup
----
_Glossary terms_
----


=== Normative Terminology

Normative terminology is precisely defined in section 1.6 of the
link:{uri-openxr-ratified-spec}[OpenXR API Specification], and is used to
visually tag terms which express mandatory and optional behavior of OpenXR
implementations, and of applications using OpenXR.

Whenever one of these terms appears in the
link:{uri-openxr-ratified-spec}[OpenXR API Specification], it must be tagged
using the macros, to indicate that its use has been carefully considered and
is consistent with the definitions in section 1.6.
This is extremely important for determining IP that is in and out of Scope
during Ratification reviews.
The normative terminology macros are defined in the following table:

.Normative Terminology Macros
[width="30%",options="header"]
|====
| Macro Name     | Output
| can{cl}        | can:
| cannot{cl}     | cannot:
| may{cl}        | may:
| may{cl} not    | may: not
| must{cl}       | must:
| must{cl} not   | must: not
| optional{cl}   | optional:
| optionally{cl} | optionally:
| required{cl}   | required:
| should{cl}     | should:
| should{cl} not | should: not
|====

Note that the macros are lower-case only, so language should be written such
that these terms do not appear at the beginning of a sentence (if really
necessary, additional capitalized macros could be added).

==== Optional Behavior

If a described behavior of the implementation is not necessary for
conformance, use the terms _may{cl}_ or _optional{cl}_ to describe it.

If a described usage pattern by the application is allowed but not
necessary, use the term _can{cl}_ to describe it.

If language flows more logically using the term "may not", use the term
_may{cl} not_ to describe it.

==== Optional Functionality

If functionality (rather than behavior) is optional, it should be described
as

[source,asciidoc]
.Example Markup
----
not required:
----

Implementations are not mandated to support functionality which is not
required, but if they do, they must behave as described by the
link:{uri-openxr-ratified-spec}[OpenXR API Specification].
The term _functionality_ includes API features, extensions, and layers.

[[markup-informative]]
== Informative, Editing and Implementor's Notes

There are several possible types of notes.
Depending on the type of output, they are rendered in different styles, but
always include a note title, and are usually set off in a box or with an
icon.
While asciidoc supports a wide set of _admonition paragraphs_ such as TIP,
IMPORTANT, WARNING, and CAUTION, we always use the NOTE form, augmented by a
note title.
Each type of note is discussed below.

[[markup-informative-notes]]
=== Informative Notes

Informative notes always appear as part of the document, but are considered
non-normative.
They usually describe usage advice for applications, and are always given
the title _Note_, as in the following example:

[NOTE]
.Note
====
This is an informative note.
====

[source,asciidoc]
.Example Markup
----
[NOTE]
.Note
====
This is an informative note.
====
----

If an entire chapter or section is considered informative, it should begin
with the sentence:

[source,asciidoc]
.Example Markup
----
This chapter/section is Informative.
----


[[markup-editing-notes]]
=== Editing Notes

Editing notes usually only appear in internal (non-published) versions of
documents, via asciidoc conditionals.
If they are not resolved, or are internal issues that should not be visible
in public, they should be removed from the source before pushing content to
a canonical (`1.0` or per-extension) public repository.
They usually tag places where an outstanding Gitlab/GitHub issue is being
worked, and are always given the title _editing-note_, as in the following
example:

ifdef::editing-notes[]
[NOTE]
.editing-note
====
This is an editing note, marked up as follows:
====
endif::editing-notes[]

[source,asciidoc]
.Example Markup
----
\ifdef::editing-notes[]
[NOTE]
.editing-note
====
Contents of an editing note go here.
It is good practice to include a Gitlab/GitHub issue number, or link to the
issue, in the editing note.
====
\endif::editing-notes[]
----


[[markup-implementors-notes]]
=== Implementor's Notes

Implementor's notes may or may not appear in published versions of
documents, via asciidoc conditionals.
They describe suggested approaches or guidelines for people writing OpenXR
implementations, and are rare because the hardware being targeted varies so
widely.
They are always given the title _Implementor's Note_, as in the following
example:

ifdef::implementation-guide[]
.Implementor's Note
====
This is an implementor's note, marked up as follows:
====
endif::implementation-guide[]

[source,asciidoc]
.Example Markup
----
\ifdef::implementation-guide[]
.Implementor's Note
====
Contents of an implementor's note go here.
====
\endif::implementation-guide[]
----


[[markup-word-choices]]
== Word Choices

There are a variety of common terms that have several equivalent word
choices.
Always use the words in the first column instead of the alternate terms.
This list may not be comprehensive; when in doubt, be guided by the existing
link:{uri-openxr-ratified-spec}[OpenXR API Specification].

.Word Choices
[width="100%",options="header"]
|====
| Use This      | Instead Of     | Comments
| application   | client         |
| bitmask       | bit field
                | Technically correct. OpenXR bitmasks are just integers and
                  are not logically addressable at the bit level.
| command       | function
                | Except when talking about function pointers returned by
                  ftext:xrGet*ProcAddr commands.
| create        | allocate
                | When describing objects resulting from ftext:xrCreate*
                  commands.
| depth/stencil | packed (interleaved, combined, _other prefix_)
                  depth/stencil, depth-stencil, DepthStencil, etc.
                | Combined format implicit in the name.
| graphics device
                | GPU
                | Implementations on non-GPU devices are possible.
| heterogeneous | heterogenous   | More common
| homogeneous   | homogenous     | More common
| host endianness | platform endianness |
| image subresource | subresource
                | Except when referring to *host-accessible subresources*
| implementation| system         |
| indices       | indexes        | More common
| member        | field          |
| pname:parameter are/is
                | pname:parameter specifies (denotes, indicates)
                | In rare cases when _are_ or _if_ are not grammatically
                  appropriate, _specifies_ may be used instead.
| pname:parameter is
                | the value of pname:parameter is
                | In rare cases, _the value of_ is appropriate. See the
                  existing specification language for examples.
| begins / begun      | starts / started | For ftext:xrBegin* - also see "`finish`"
| finishes / finished | ends / ended     | For ftext:xrEnd* - also see "`begins`"
| used          | referenced     | When describing attachments specified in a
                                   subpass description.
| statically used | referenced   | When describing resources or push constants
                                   accessed by shader code
| a more specific term | referenced | For all other situations.
| component     | channel        | Specifically this refers to color channels/components
|====



[[markup-avoid-contractions]]
=== Avoid Contractions

Contractions make the specification sound less formal and using them would
be inconsistent with the many non-contraction forms already in use in the
spec.

.Word Choices
[width="30%",options="header"]
|====
| Use This      | Instead Of
| are not       | aren't
| cannot{cl}    | can't
| does not      | doesn't
| do not        | don't
| has not       | hasn't
| is not        | isn't
| it is         | it's
| that is       | that's
| there is      | there's
| we are        | we're
| will not      | won't
|====


[[markup-terms-caution]]
=== Terms to Use With Caution

The term _subset_ is sometimes used to refer to a _strict subset_, and
sometimes used to refer to a subset which may be equal to the entire set.
This is particularly likely to come up when describing bitmasks.
Make sure to use either _subset_ or _strict subset_ as appropriate.


[[markup-terms-avoid]]
=== Terms to Avoid

Do not describe anything in the documentation using vague or wishy-washy
terms.
Our goal is to precisely describe behavior of implementations.

The normative terms may{cl}, optional{cl}, and should{cl} are available when
implementations may make choices of behavior, but when such choices are
allowed, each choice still must have well-defined behavior.

.Terms to Avoid
[width="100%",options="header"]
|====
| Bad Term | Comments
| expect   | And variants such as _expected_
| likely   | And variants such as _will likely_
| allowed, could, generally, might, probably, perhaps
           | And all other such terms of choice. Use _may{cl}_ or _can{cl}_
             depending on the context.
| may{cl} or may{cl} not   | Just use _may{cl}_.
|====
