Text Styles
Text alignment
The text-align
key is used to align text horizontally within the text box.
It has the same function as the text-align
property in CSS.
The text can be aligned using the following keywords:
- center
-
Text is centered within the text box.
- justify
-
Text is spaced out to align evenly with both sides of the text box.
- left
-
Text is aligned to the left side of the text box.
- right
-
Text is aligned to the right side of the text box.
- inherit
-
Only applies to the caption text of block images (
image-caption
) and tables (table-caption
). The valueinherit
resolves to the alignment of the block. Further information about usinginherit
on image caption text and table caption text can be found on xref Block Image Styles and Table Styles, respectively.
The text-align
key is distinct from the similarly-named align
key.
The align key aligns a block element horizontally within its container.
The base text-align
can be set using the text-align
document attribute, which takes precedence over the value in the theme.
If a text-<align>
role (e.g., text-center
) is set on a block element it overrides the value from the theme.
Decoration
The text-decoration
key specifies the type of decoration, such as an underline, that is applied to the text.
It accepts the following keywords:
- line-through
-
A line is drawn across the text. This is commonly referred to as a strikethrough.
- none
-
Clears an inherited value and no decoration is applied to the text.
- underline
-
A line is drawn beneath the text.
When a key category allows the text-decoration
key to be set, you can usually specify a text-decoration-color
and text-decoration-width
, too.
Font size
The font-size
key specifies the size of the font.
The font size may be specified either as a fixed value (e.g., 12
) or a relative value (e.g., 0.8em
).
Font sizes are most often specified as a fixed value, though there are important cases when a relative value is more suitable.
The font size always resolves to a point value when text is written to the PDF.
If the font size is specified as a number, or a number with a fixed unit of measurement (e.g., px
), that value is converted to points.
The conversion to points is done when the theme is loaded.
The font-size
key on the base
category, as well as min, large, and small font size keys, must always be specified as a fixed value.
The only time this value is not used as specified is when the element is inside a table. If the font size on the table or AsciiDoc table cell differs from the base font size, all nested content is scaled by that ratio.
If the font size has relative units, em
, %
, or rem
, then the value will be computed at the point of use.
-
If the value has the unit
em
, then that value will be multiplied by the current font size. -
If the value has the unit
%
, then that value will be divided by 100, then multiplied by the current font size. -
If the value has the unit
rem
, then that value will be multiplied by the base font size.
For example, if the font size is 0.75em
and the current font size is 12
, then the font size will be 9
.
Relative font sizes are best suited for inline elements, such as a codespan.
Only use a relative font size when the font size should always be scaled relative to either the parent element (em
or %
) or base font size (rem
).
Line height
The line-height
key specifies the height of the box in which a single line of text is positioned.
This theme key is used to control the spacing between wrapped lines.
The line height value is a multiplier of the font size. A line height value of 1 means that the height of the line should be equivalent to the height of the font. In this case, a wrapped line will start directly below the previous line, with no extra vertical space. A line height value of 2 means that the height of the line should be equivalent to twice the height of the font. In this case, there will be extra space between wrapped lines than what the text occupies. If the value is greater than 1, the text is positioned equidistant between the top and bottom of the line’s box.
The impact of the line height and how it’s computed is more complex than it would seem at first glance.
Even if you set the value to 1, you may notice extra space between wrapped lines.
As you’re no doubt aware, not all characters have the same height (e.g., x
vs X
).
Furthermore, some characters have vertical strokes that rise above the lowercase letter x
(ascenders) and some have strokes that drop below the lowercase letter x
(descenders).
We refer to the height of the lowercase letter x
the x-height.
The x-height is always less than—and can vary considerably from—the effective height of the font.
Many fonts contain built-in line height. As a result, the size of the font may appear to take up more room than the number of points you specify. You can compensate for this difference by adjusting the line height value in your theme. In particular, the Noto font family has a built-in line height of 1.36. Thus, if you set the line height in your theme to 1, you’re really setting it to 1.36. If you want a line height of 1.5, set the line height to 1.1 in your theme. |
You can study the built-in line height by setting the base-line-height
key to 1, the mark-border-offset
key to 0, then applying the mark formatting to various characters, words, and phrases.
#x# #Hg# #Adjective# #Jog# +
#Hg# #x#
The background color under the marked text stretches across the entire built-in line height. This reveals the difference between the height of the text and the height of the line. If you increase the line height value, you’ll see spacing appear between the background color stripes of wrapped lines.
If the line-height value is < 1, you risk causing the text in adjacent lines to overlap.
|
The reserved height for ascenders and descenders, which can differ, also impacts how the text is positioned vertically within the line height.
The text is positioned so that the space above and ascender and the space below a descender are equivalent.
If the text has no ascenders or descenders (e.g., x
), it can appear slightly higher or lower in the line than expected.
It all depends on the properties of the font.
You can observe this behavior by testing the previous example with different fonts.
Try change the font family (e.g., Helvetica
or Times-Roman
) to see what impact it has.
When you’re choosing a line height value, study the interplay between characters with ascenders (e.g, h
) and descenders (e.g., y
).
Use marked text to reveal the space occupied by a single line.
Adjust the line height value until the spacing between the lines matches what you expect.
Font style
The font-style
key specifies the font variant in a font family that the text should use.
The key accepts the following keywords:
- bold
-
Text is styled using the bold variant of a font family.
- bold_italic
-
Text is styled using the bold italic variant of a font family
- italic
-
Text is styled using the italic variant of a font family.
- normal
-
Text is styled using the normal font variant in a font family.
- normal_italic
-
The style of the text is reset to normal, and then the text is styled using the italic variant of a font family.
Usually, you can specify a font style wherever you can set a font family (font-family
).
The converter uses the values of both keys in combination to locate the correct font within a font stack.
Transform
The text-transform
key changes the case of the text.
It accepts the following keywords:
- capitalize
-
Transforms the first letter of each word to a capital letter.
- lowercase
-
Transforms all the text to lowercase letters.
- none
-
Clears an inherited value and no case transformation is applied to the text.
- smallcaps
-
Replaces lowercase ASCII letters (a-z) with their small capital variant. Lowercase letters outside the ASCII range are not transformed.
- uppercase
-
Transforms all the text to capital letters.
The text-transform
key can’t be set on the base category.
If you want the smallcaps transformation to support letters beyond the a-z range, you can do so by overridding the smallcaps
method in an extended converter.
class MyPDFConverter < (Asciidoctor::Converter.for 'pdf')
register_for 'pdf'
def smallcaps string
string = super
string = string.gsub 'é', %(\u1d07\u0301)
string
end
end
This transformation can be automated using String#unicode_normalize
with the :nfd
form.
This method will rewrite all characters with diacritical marks so that the diacritical mark is added using a combining character (i.e., a two graphene form).
class MyPDFConverter < (Asciidoctor::Converter.for 'pdf')
register_for 'pdf'
def smallcaps string
string = string.unicode_normalize :nfd unless string.ascii_only?
super
end
end
The smallcaps transformation for extended Latin characters (e.g., characters that include an accent) typically requires the addition of a combining character, such as the combining acute accent in the example above). Therefore, you must ensure that the font you’re using supports these combining characters (meaning it provides the necessary glyphs).
Superscript
Text formatted as superscript, which includes footnote number references in the body, are displayed in a smaller font size (58.3%) and raised above the baseline (offset by 85% of the ascender height). It’s not currently possible to influence the font size and text position of superscript text using the theme. These settings are hardcoded into Asciidoctor PDF and Prawn, respectively. However, you can adjust them in a Prawn patch by requiring the following Ruby script:
Prawn::Text::Formatted::Arranger.prepend (Module.new do
def initialize(*)
super
@sub_and_sup_relative_size = 0.75
end
end)
Prawn::Text::Formatted::Fragment.prepend (Module.new do
def y_offset
superscript? ? 0.5 * ascender : super
end
end)
Adjust the relative size and y offset values as you see fit.
Border and background color
For inline elements that support a border or background color, the decoration is fit to the text by default.
That means it stretches from the start of the first character to the end of the last character horizontally and across the entire built-in line height of the text vertically.
The line-height
key on the block element (e.g., paragraph) does not affect the decoration.
To extend the decoration out evenly on both axes, set the border-offset
key to a positive number.
This setting does not affect the layout of the text.
It only swells the extent of the decoration under it.