Provided by: libpdf-builder-perl_3.026-1_all bug

NAME

       PDF::Builder::Content::Text - additional specialized text-related formatting methods. Inherits from
       PDF::Builder::Content

       Note: If you have used some of these methods in PDF::Builder with a graphics type object (e.g.,
       $page->gfx()->method()), you may have to change to a text type object (e.g., $page->text()->method()).

METHODS

   Single Lines from a String
       text_left

           $width = $content->text_left($text, %opts)

           Alias for "text". Implemented for symmetry, for those who use a lot of "text_center" and
           "text_right", and desire a matching "text_left".

           Adds text to the page (left justified), at the current position.  Note that there is no maximum
           width, and nothing to keep you from overflowing the physical page on the right!  The width used (in
           points) is returned.

       text_center

           $width = $content->text_center($text, %opts)

           As "text", but centered on the current point.

           Adds text to the page (centered).  The width used (in points) is returned.

       text_right

           $width = $content->text_right($text, %opts)

           As "text", but right-aligned to the current point.

           Adds text to the page (right justified).  Note that there is no maximum width, and nothing to keep
           you from overflowing the physical page on the left!  The width used (in points) is returned.

       text_justified

           $width = $content->text_justified($text, $width, %opts)

           As "text", but stretches text using "wordspace", "charspace", and (as a last resort) "hscale", to
           fill the desired (available) $width. Note that if the desired width is less than the natural width
           taken by the text, it will be condensed to fit, using the same three routines.

           The unchanged $width is returned, unless there was some reason to change it (e.g., overflow).

           Options:

           'nocs' => value
               If  this option value is 1 (default 0), do not use any intercharacter spacing. This is useful for
               connected characters, such as fonts for Arabic, Devanagari, Latin cursive handwriting,  etc.  You
               don't  want  to  add  additional  space  between  characters  during  justification,  which would
               disconnect them.

               Word (interword) spacing values (explicit or default) are doubled if nocs is 1. This is  to  make
               up for the lack of added/subtracted intercharacter spacing.

           'wordsp' => value
               The  percentage  of one space character (default 100) that is the maximum amount to add to (each)
               interword spacing to expand the line.  If "nocs" is 1, double "value".

           'charsp' => value
               If adding interword space didn't do enough, the percentage of one em (default 100)  that  is  the
               maximum  amount to add to (each) intercharacter spacing to further expand the line.  If "nocs" is
               1, force "value" to 0.

           'wordspa' => value
               If adding intercharacter space didn't do enough, the percentage of one space  character  (default
               100)  that  is the maximum additional amount to add to (each) interword spacing to further expand
               the line.  If "nocs" is 1, double "value".

           'charspa' => value
               If adding more interword space didn't do enough, the percentage of one em (default 100)  that  is
               the maximum additional amount to add to (each) intercharacter spacing to further expand the line.
               If "nocs" is 1, force "value" to 0.

           'condw' => value
               The  percentage  of  one space character (default 25) that is the maximum amount to subtract from
               (each) interword spacing to condense the line.  If "nocs" is 1, double "value".

           'condc' => value
               If removing interword space didn't do enough, the percentage of one em (default 10) that  is  the
               maximum  amount  to subtract from (each) intercharacter spacing to further condense the line.  If
               "nocs" is 1, force "value" to 0.

           If expansion (or reduction) wordspace and charspace changes didn't do enough to make the line fit the
           desired width, use "hscale()" to finish expanding or condensing the line to fit.

   Multiple Lines from a String
       The string is split at regular blanks (spaces), x20, to find the longest  substring  that  will  fit  the
       $width.   If  a single word is longer than $width, it will overflow.  To stay strictly within the desired
       bounds, set the option "spillover"=>0 to disallow spillover.

       Hyphenation

       If hyphenation is enabled, those methods which split up a string into multiple lines  (the  "text  fill",
       paragraph,  and  section  methods) will attempt to split up the word that overflows the line, in order to
       pack the text even more tightly ("greedy" line splitting). There are a number of controls  over  where  a
       word  may  be split, but note that there is nothing language-specific (i.e., following a given language's
       rules for where a word may be split). This is left to other packages.

       There are hard coded minimums of 2 letters  before  the  split,  and  2  letters  after  the  split.  See
       "Hyphenate_basic.pm".  Note  that  neither  hyphenation  nor  simple  line splitting makes any attempt to
       prevent widows and orphans, prevent splitting of the last word in a column or page, or  otherwise  engage
       in more desirable paragraph shaping.

       'hyphenate' => value
           0:  no  hyphenation  (default),  1:  do  basic  hyphenation. Always allows splitting at a soft hyphen
           (\xAD). Unicode hyphen (U+2010) and non-splitting hyphen (U+2011) are ignored as split points.

       'spHH' => value
           0: do not split at a hard hyphen (x\2D), 1: OK to split (default)

       'spOP' => value
           0: do not split after most punctuation, 1: OK to split (default)

       'spDR' => value
           0: do not split after a run of one or more digits, 1: OK to split (default)

       'spLR' => value
           0: do not split after a run of one or more ASCII letters, 1: OK to split (default)

       'spCC' => value
           0: do not split in camelCase between a lowercase letter and an  uppercase  letter,  1:  OK  to  split
           (default)

       'spRB' => value
           0:  do  not split on a Required Blank ( ), is default.  1: OK to split on Required Blank. Try to
           avoid this; it is a desperation move!

       'spFS' => value
           0: do not split where it will just fit (middle of word!), is default.  1: OK to split to just fit the
           available space. Try to avoid this; it is a super desperation move, and the split will probably  make
           no linguistic sense!

       'min_prefix' => value
           Minimum number of letters before word split point (hyphenation point).  The default is 2.

       'min_suffix' => value
           Minimum number of letters after word split point (hyphenation point).  The default is 3.

       Methods

       text_fill_left, text_fill

           ($width, $leftover) = $content->text_fill_left($string, $width, %opts)

           Fill  a  line  of  'width'  with  as much text as will fit, and outputs it left justified.  The width
           actually used, and the leftover text (that didn't fit), are returned.

           ($width, $leftover) = $content->text_fill($string, $width, %opts)

           Alias for text_fill_left().

       text_fill_center

           ($width, $leftover) = $content->text_fill_center($string, $width, %opts)

           Fill a line of 'width' with as much text as will fit, and outputs it centered.   The  width  actually
           used, and the leftover text (that didn't fit), are returned.

       text_fill_right

           ($width, $leftover) = $content->text_fill_right($string, $width, %opts)

           Fill  a  line  of  'width'  with as much text as will fit, and outputs it right justified.  The width
           actually used, and the leftover text (that didn't fit), are returned.

       text_fill_justified

           ($width, $leftover) = $content->text_fill_justified($string, $width, %opts)

           Fill a line of 'width' with as much text as will fit, and outputs it fully  justified  (stretched  or
           condensed).  The width actually used, and the leftover text (that didn't fit), are returned.

           Note  that  the  entire  line  is  fit  to  the  available width via a call to "text_justified".  See
           "text_justified" for options to control stretch and condense.  The last line is  unjustified  (normal
           size) and left aligned by default, although the option

           Options:

           'last_align' => place
               where  place  is 'left' (default), 'center', or 'right' (may be shortened to first letter) allows
               you to specify the alignment of the last line output.

   Larger Text Segments
       paragraph

           ($overflow_text, $unused_height) = $txt->paragraph($text, $width,$height, $continue, %opts)

           ($overflow_text, $unused_height) = $txt->paragraph($text, $width,$height, %opts)

           $overflow_text = $txt->paragraph($text, $width,$height, $continue, %opts)

           $overflow_text = $txt->paragraph($text, $width,$height, %opts)

           Print a single string into a rectangular area on the page, of given width  and  maximum  height.  The
           baseline of the first (top) line is at the current text position.

           Apply  the  text within the rectangle and return any leftover text (if could not fit all of it within
           the rectangle). If called in an array context, the unused height  is  also  returned  (may  be  0  or
           negative if it just filled the rectangle).

           $continue  is  optional,  with  a  default  value  of  0.  An %opts list may be given after the fixed
           parameters, whether or not $continue is explicitly given.

           If $continue is 1, the first line does not get special treatment for indenting or outdenting, because
           we're printing the continuation of the paragraph that was interrupted earlier. If it's 0,  the  first
           line may be indented or outdented.

           Options:

           'pndnt' => $indent
               Give  the  amount  of  indent (positive) or outdent (negative, for "hanging") for paragraph first
               lines). This setting is ignored for centered text.

           'align' => $choice
               $choice is 'justified', 'right', 'center', 'left'; the default is 'left'.   See  "text_justified"
               call  for  options  to  control  how  a  line is expanded or condensed if $choice is 'justified'.
               $choice may be shortened to the first letter.

           'last_align' => place
               where place is 'left' (default), 'center', or 'right' (may be shortened to first  letter)  allows
               you  to  specify  the  alignment  of  the  last  line  output,  but  applies only when "align" is
               'justified'.

           'underline' => $distance
           'underline' => [ $distance, $thickness, ... ]
               If a scalar, distance below baseline, else array  reference  with  pairs  of  distance  and  line
               thickness.

           'spillover' => $over
               Controls  if words in a line which exceed the given width should be "spilled over" the bounds, or
               if a new line should be used for this word.

               $over is 1 or 0, with the default 1 (spills over the width).

           Example:

               $txt->font($font,$fontsize);
               $txt->leading($leading);
               $txt->translate($x,$y);
               $overflow = $txt->paragraph( 'long paragraph here ...',
                                            $width,
                                            $y+$leading-$bottom_margin );

           Note: if you need to change any text treatment within a  paragraph  (bold  or  italicized  text,  for
           instance),  this  can  not  handle it. Only plain text (all the same font, size, etc.) can be typeset
           with "paragraph()".  Also, there is currently very limited line splitting (hyphenation) to better fit
           to a given width, and nothing is done for "widows and orphans".

       section, paragraphs

           ($overflow_text, $continue, $unused_height) = $txt->section($text, $width,$height, $continue, %opts)

           $overflow_text = $txt->section($text, $width,$height, $continue, %opts)

           The $text contains a string with one or more paragraphs $width wide, starting  at  the  current  text
           position,  with a newline \n between each paragraph. Each paragraph is output (see "paragraph") until
           the $height limit is met (a partial paragraph may be at the bottom). Whatever wasn't output, will  be
           returned.   If  called  in  an array context, the unused height and the paragraph "continue" flag are
           also returned.

           $continue is 0 for the first call of section(), and then use the value  returned  from  the  previous
           call  (1  if  a  paragraph  was cut in the middle) to prevent unwanted indenting or outdenting of the
           first line being printed.

           For compatibility with recent changes to PDF::API2, paragraphs is accepted as an alias for "section".

           Options:

           'pvgap' => $vertical
               Additional vertical space (unit: pt) between paragraphs (default 0). Note that  this  space  will
               also be added after the last paragraph printed.

           See "paragraph" for other %opts you can use, such as "align" and "pndnt".

           Alternate name: paragraphs

           This is for compatibiity with PDF::API2.

       textlabel

           $width = $txt->textlabel($x,$y, $font, $size, $text, %opts)

           Place  a  line of text at an arbitrary "[$x,$y]" on the page, with various text settings (treatments)
           specified in the call.

           $font
               A previously created font.

           $size
               The font size (points).

           $text
               The text to be printed (a single line).

           Options:

           'rotate' => $deg
               Rotate $deg degrees counterclockwise from due East.

           'color' => $cspec
               A color name or permitted spec, such as "#CCE840", for the character fill.

           'strokecolor' => $cspec
               A color name or permitted spec, such as "#CCE840", for the character outline.

           'charspace' => $cdist
               Additional distance between characters.

           'wordspace' => $wdist
               Additional distance between words.

           'hscale' => $hfactor
               Horizontal scaling mode (percentage of normal, default is 100).

           'render' => $mode
               Character rendering mode (outline only, fill only, etc.). See "render" call.

           'left' => 1
               Left align on the given point. This is the default.

           'center' => 1
               Center the text on the given point.

           'right' => 1
               Right align on the given point.

           'align' => $placement
               Alternate to left, center, and right. $placement is 'left' (default), 'center', or 'right'.

           Other options available to "text", such as underlining, can be used here.

           The width used (in points) is returned.

       Please note that "textlabel()" was not designed to interoperate with  other  text  operations.  It  is  a
       standalone  operation,  and  does  not  leave  a "next write" position (or any other setting) for another
       "text" mode operation. A following write will likely be at "(0,0)", and not at the expected location.

       "textlabel()" is intended as an "all in one" convenience function for single lines of  text,  such  as  a
       label on some graphics, and not as part of putting down multiple pieces of text. It is possible to figure
       out  the position of a following write (either "textlabel" or "text") by adding the returned width to the
       original position's x value (assuming left-justified positioning).

   Complex Column Output with Markup
       column

           ($rc, $next_y, $unused) = $text->column($page, $text, $grfx, $markup, $txt, %opts)

           This method fills out a column of text on a page, returning any unused portion that could not be fit,
           and where it left off on the page.

           Tag names, CSS entries, markup type, etc. are case-sensitive (usually lower-case letters  only).  For
           example, you cannot give a <P> paragraph in HTML or a P selector in CSS styling.

           $page  is the page context. Currently, its only use is for page annotations for links ('md1' []() and
           'html' <a>), so if you're not using those, you may pass anything such as "undef"  for  $page  if  you
           wish.

           $text  is  the  text context, so that various font and text-output operations may be performed. It is
           often, but not necessarily always, the same as the object containing the "column" method.

           $grfx is the graphics (gfx) context. It may be a dummy (e.g., undef) if no graphics are to be  drawn,
           but  graphical  items such as the column outline ('outline' option) and horizontal rule (<hr> in HTML
           markup) use it.  Currently, text-decoration underline (default for links,  'md1'  "[]()"  and  'html'
           "<a>")  or  line-through  or  overline  use  the  text context, but may in the future require a valid
           graphics context. Images (when implemented) will require a graphics context.

           $markup is information on what sort of markup is being used to format and lay out the column's text:

           'pre'
               The input material has already been processed and is already in the  desired  form.  $txt  is  an
               array reference to the list of hashes. This must be used when you are calling "column()" a second
               (or  later)  time  to output material left over from the first call. It may also be used when the
               caller application has already processed the text into the appropriate format, and  other  markup
               isn't being used.

           'none'
               If  none  is  specified,  there  is  no  markup in use. At most, a blank line or a new text array
               element specifies a new paragraph, and that's it. $txt may be a single string, or an array (list)
               of strings.

               The input txt is a list (anonymous array reference) of  strings,  each  containing  one  or  more
               paragraphs.  A  single  string may also be given. An empty line between paragraphs may be used to
               separate the paragraphs. Paragraphs may not span array elements.

           'md1'
               This specifies a certain flavor of Markdown compatible with Text::Markdown:

                   * or _ italics, ** bold, *** bold+italic;
                   bulleted list *, numbered list 1. 2. etc.;
                   #, ## etc. headings and subheadings;
                   ---, ===, ___ horizontal rule;
                   [label](URL) external links (to HTML page or within this document, see 'a')
                   ` (backticks) enclose a "code" section

               HTML (see below) may be mixed in  as  desired  (although  not  within  "code"  blocks  marked  by
               backticks,  where  <,  >,  and  &  get  turned  into HTML entities, disabling the intended tags).
               Markdown will be converted into HTML, which  will  then  be  interpreted  into  PDF.   Note  that
               Text::Markdown  may  produce  HTML  for  certain  features,  that  is  not  yet supported by HTML
               processing (see 'html' section below). Let us know if you need such a feature!

               The input txt is a list (anonymous array reference) of  strings,  each  containing  one  or  more
               paragraphs and other markup. A single string may also be given. Per Markdown formatting, an empty
               line  between  paragraphs  may  be  used to separate the paragraphs. Separate array elements will
               first be glued together into a single string before processing,  permitting  paragraphs  to  span
               array elements if desired.

               There  are  other flavors of Markdown, so other mdn flavors may be defined in the future, such as
               POD from Perl code.

           'html'
               This specifies that a subset of HTML  markup  is  used,  along  with  some  attributes  and  CSS.
               Currently, HTML tags

                   'i'/'em' (italic), 'b'/'strong' (bold),
                   'p' (paragraph),
                   'font' (font face->font-family, color, size->font-size),
                   'span' (needs style= attribute with CSS to do anything useful),
                   'ul', 'ol', 'li' (bulleted, numbered lists),
                   'img' (TBD, image, empty. hspace->margin-left/right,
                          vspace->margin-top/bottom, width, height),
                   'a' (anchor/link, web page URL or this document target #p[-x-y[-z]]),
                   'pre', 'code' (TBD, preformatted and code blocks),
                   'h1' through 'h6' (headings)
                   'hr' (horizontal rule)
                   'br' (TBD, line break, empty)
                   'sup', 'sub' (TBD superscript and subscript)
                   's', 'strike', 'del' (line-through)
                   'u', 'ins' (underline)
                   'ovl' (TBD -- non-HTML, overline)
                   'k' (TBD -- non-HTML, kerning left/right shift)
                   'blockquote' (block quote)

               are supported (fully or in part unless "TBD"), along with limited CSS for color, font-size, font-
               family,  etc.  <style> tags may be placed in an optional <head> section, or within the <body>. In
               the latter case, style tags will be pulled out of the body and added (in order) on to the end  of
               any  style  tag(s) defined in a head section. Multiple style tags will be condensed into a single
               collection (later definitions of equal precedence overriding earlier). These stylings  will  have
               global  effect,  as  though they were defined in the head. As with normal CSS, the hierarchy of a
               given property (in decreasing precedence) is

                   appearance in a style= tag attribute
                   appearance in a tag attribute (possibly a different name than the property)
                   appearance in a #IDname selector in a <style>
                   appearance in a .classname selector in a <style>
                   appearance in a tag name selector in a <style>

               Selectors are quite simple: a single tag name (e.g., body), a single class (.cname), or a  single
               ID  (#iname).  There are no combinations (e.g., "p.abstract" or "ol, ul"), hierarchies (e.g., "ol
               > li"), specified number of appearance, or other such complications as found in a browser's  CSS.
               Sorry!

               Supported CSS properties:

                   border-* TBD
                   color (foreground color)
                   display (inline/block)
                   font-family (name as defined to FontManager, e.g. Times)
                   font-size (pt, bare number = pt, % of current size)
                   font-style (normal/italic)
                   font-weight (normal/bold)
                   height (pt, bare number) thickness of horizontal rule
                   list-style-position (outside) TBD inside
                   list-style-type (marker description, see also _marker-before/after)
                   margin-top/right/bottom/left (pt, bare number = pt, % of font-size)
                     margin TBD update four margin-* properties
                   text-decoration (none, underline, line-through, overline)
                   text-height (leading, as ratio of baseline-spacing to font-size)
                   text-indent (pt, bare number = pt, % of current font-size)
                   text-align (left/right) TBD, future also center/justify?
                   width (pt, bare number) width of horizontal rule

               Non-standard CSS "properties". You may want to set these in CSS:

                   _marker-before (text to insert before <ol> marker, default nothing)
                   _marker-after (text to insert after <ol> marker, default period)

               Non-standard CSS "properties". You normally would not set these in CSS:

                   _fs (current running font size, in points, on the properties stack)
                   _href (URL for <a>, normally provided by href= attribute)
                   _left (running number of points to indent on the left, from margin-left and list nesting)
                   _right (running number of points to indent on the right, from margin-right)

               Sizes  may  be  '%'  (of  font-size), or 'pt' (the default unit).  More support may be added over
               time. CAUTION: comments /* and */ are NOT currently supported in CSS -- perhaps in the future.

               Numeric entities (decimal &#nnn; and  hexadecimal  &#xnnn;)  are  supported,  as  well  as  named
               entities (&mdash; for example).

               The  input  txt  is  a  list  (anonymous array reference) of strings, each containing one or more
               paragraphs and other markup. A single string  may  also  be  given.  Per  normal  HTML  practice,
               paragraph  tags  should  be used to mark paragraphs. Note that HTML::TreeBuilder is configured to
               automatically mark top body-level text with paragraph tags, in case you forget to do so, although
               it is probably better to do it yourself, to maintain more control over the processing.   Separate
               array  elements  will  first be glued together into a single string before processing, permitting
               paragraphs to span array elements if desired.

           There are other markup languages out there, such as HTML-like Pango, and man page (troff), that might
           be supported in the future. It is very unlikely that TeX or LaTeX will ever  be  supported,  as  they
           both already have excellent PDF output.

           $txt  is  the  input text: a string, an array reference to multiple strings, or an array reference to
           hashes. See $markup for details.

           %opts Options -- a number of these are of course, mandatory.

           'rect' => [x, y, width, height]
               This defines a column as a rectangular area of a given width and height (both in points)  on  the
               current  page.  In  the  future, it is expected that more elaborate non-rectangular areas will be
               definable, but for now, a simple rectangle is all that is  permitted.  The  column's  upper  left
               coordinate is "x, y".

               The  top  text  baseline is assumed to be relative to the UL corner (based on the determined line
               height), and the column outline clips that baseline, as it does  additional  baselines  down  the
               page (interline spacing is "leading" multiplied by the largest "font_size" or image height needed
               on that line).

               Currently, 'rect' is required, as it is the only column shape supported.

           'relative' => [ x, y, scale(s) ]
               'relative'  defaults  to "[ 0, 0, 1, 1 ]", and allows a column outline (currently only 'rect') to
               be either absolute or relative. "x" and "y" are  added  to  each  "x,y"  coordinate  pair,  after
               scaling. Scaling values:

               (none)  The scaling defaults to 1 in both x and y dimensions (no change).
               scale (one value)  The scaling in both the x (width) and y (height) dimensions uses this value.
               scale_x, scale_y (two values)  There are two separate scaling factors for the x dimension (width)
               and y dimension (height).

               This  permits  a  generically-shaped  outline  to  be defined, scaled (perhaps not preserving the
               aspect ratio) and placed anywhere on the  page.  This  could  save  you  from  having  to  define
               similarly-shaped  columns from scratch multiple times.  If you want to define a relative outline,
               the lower left corner (whether or not it contains a point, and whether or not it's the first  one
               listed)  would  usually be "0, 0", to have scaling work as expected. In other works, your outline
               template should be in the lower left corner of the page.

           'start_y' => $start_y
               If omitted, it is assumed that you want to start at the top of the defined  column  (the  maximum
               "y"  value  minus  the  maximum  vertical extent of this line).  If used, the normal value is the
               "next_y" returned from the previous "column()" call. It is the  deepest  extent  reached  by  the
               previous  line (plus leading), and is the top-most point of the new first line of this "column()"
               call.

               Note that the "x" position will be determined by the column shape and size (the  left-most  point
               of the baseline), so there is no place to explicitly set an "x" position to start at.

           'font_size' => $font_size
               This  is  the  starting  font size (in points) to be used. Over the course of the text, it may be
               modified by markup.

               The starting font size may be set in a number of ways.  It  may  be  inherited  from  a  previous
               "$text->font(..., font-size)" statement; it may be set via the "font_size" option (overriding any
               font  method  inheritance);  it  may default to 12pt (if neither explicit way is given). For HTML
               markup, it may of course be modified by the  "font"  tag  or  by  CSS  styling  "font-size".  For
               Markdown, it may be modified by CSS styling.

           'marker_width' => $marker_width
               This  is  the  width  of  the gutter to the left of a list item, where (for the first line of the
               item) the marker lives.  The  marker  contains  the  symbol  (for  bulleted/unordered  lists)  or
               formatted  number  and "before" and "after" text (for numbered/ordered lists). Both have a single
               space before the item text starts. The number is a length, in points.

               The default is 2 times the font_size passed to "column()", and is not adjusted for any changes of
               font_size in the markup. An explicit value passed in is also not changed -- the gutter width  for
               the  marker  will  be  the  same  in  all  lists  (keeping  them  aligned).  If  you plan to have
               exceptionally long markers, such as  an  ordered  list  of  years  in  Roman  numerals,  such  as
               (MCMXCIX), you may want to make this gutter a bit wider.

           'leading' => $leading
               This  is  the leading ratio used throughout the column text.  The "$x, $y" position through "$x +
               width"  is  assumed  to  be  the  first  text  baseline.  The  next  line  down  will  be  "$y  -
               $leading*$font_size".  If the font_size changes for any reason over the course of the column, the
               baseline spacing (leading * font_size) will also change.  The  default  leading  ratio  is  1.125
               (12.5% added to font).

           'para' => [ $indent, $top-margin ]
               When  starting  a  new  paragraph,  these  are the default indentation (in points), and the extra
               vertical spacing for a top margin on a paragraph. The default is "[ 1*$font_size,  0  ]".  Either
               may  be  overridden  by  the  appropriate CSS settings. An outdent may be defined with a negative
               indentation value.  These apply to all $markup types.

           'outline' => "color string"
               You may optionaly request that the column be outlined in a  given  color,  to  aid  in  debugging
               fitting problems.

           'color' => "color string"
               The color to draw the text (or rule or other graphic) in. The default is black (#000000).

           'style' => "CSS styling"
               You  may define CSS (selectors and properties lists) to override the built-in CSS defaults. These
               will be applied for the entire "column()" call. You can use this, or "style" tags in 'html',  but
               for 'none' or 'md1', you will need to use this method to set styling.

           'substitute' => [ [ 'char or string', 'before', 'replace', 'after'],... ]
               When  a  certain Unicode code point (character) or string is found, insert before text before the
               character, replace the character or string with replace text, and insert  after  text  after  the
               character. This may make it easier to insert HTML code (font, color, etc.) into Markdown text, if
               the  desired  settings  and  character can not be produced by your Markdown editor.  This applies
               both to 'md1' and 'html' markup.  Multiple  substitutions  may  be  defined  via  multiple  array
               elements.   If  you  want  to leave the original character or string itself unchanged, you should
               define the replace text to be the same as 'char or string'.  'before' and/or 'after' text may  be
               empty strings if you don't want to insert some sort of markup there.

               Example: to insert a red cross (X-out) and green tick (check) mark

                   'substitute' => [
                     [ '%cross%', '<font face="ZapfDingbats" color="red">', '8', '</font>' ],
                     [ '%tick%', '<font face="ZapfDingbats" color="green">', '4', '</font>' ],
                   ]

               should   change   "%cross%"   in   Markdown   text  ('md1')  or  HTML  text  ('html')  to  "<font
               face="ZapfDingbats" color="green">8</font>" and similarly for "%tick%". This is  done  after  the
               Markdown  is  converted  to  HTML  (but before HTML is parsed), so make sure that your macro text
               (e.g., "%tick%") isn't something that Markdown will try to  interpret  by  itself!  Also,  Perl's
               regular expression parser seems to get upset with some characters, such as "|", so don't use them
               as delimiters (e.g., "|cross|"). You don't have to wrap your macro name in delimiters, but it can
               make  the  text  structure  clearer, and may be necessary in order not to do substitutions in the
               wrong place.

           'restore' => flag
               This integer flag determines what sort of cleanup "column()" will do upon exit,  to  restore  (or
               not) the font state (face, bold or normal weight, italic or normal style, size, and color).

               for rc = 0 (all input markup was used up, without running out of column)
                   restore => 0
                       This  is  the default. Upon exiting, "column()" will attempt to restore the state to what
                       one would see if there was yet more text to be output. Note that this is not  necessarily
                       what  one  would  see if the entire state was restored to entry conditions. The intent is
                       that another "column()" call can be immediately made, using whatever font state was  left
                       by the previous call, as though the two calls' markup inputs were concatenated.

                   restore => 1
                       This  value  of  "restore"  commands  that  no change be made to the font state, that is,
                       "column()" exits with the font state left in the last text output.  This may or  may  not
                       be desirable, especially if the last text output left the text in an unexpected state.

                   restore => 2
                       This  value of "restore" attempts to bring the font state all the way back to what it was
                       upon entry to the routine, as if it had never been called. Note that  if  "column()"  was
                       called  with  no  global font settings, that can not be undone, although the color can be
                       changed back to its original state, usually black.

                       CAUTION: The Font Manager is not synchronized with whatever state the  font  is  returned
                       to.  You should not request the 'current' font, but should instead explicitly set it to a
                       specific face, etc., which resets 'current'.

               for rc = 1 (ran out of column space before all the input markup was used up)
                   restore => 0
                       This is the default. Upon exiting, no changes will be made to the font state. As the code
                       will be in the middle of some output, the font state  is  kept  the  same,  so  the  next
                       "column()"  call  (for  the  overflow) can pick up where the previous call left off, with
                       regards to the font state.

                       It is equivalent to "restore = 1".

                   restore => 1
                       This is the same as "restore = 0".

                   restore => 2
                       This value of "restore" attempts to bring the font state all the way back to what it  was
                       upon  entry  to  the routine, as if it had never been called. Note that if "column()" was
                       called with no global font settings, that can not be undone, although the  color  can  be
                       changed back to its original state, usually black.

                       CAUTION:  The  Font  Manager is not synchronized with whatever state the font is returned
                       to. You should not request the 'current' font, but should instead explicitly set it to  a
                       specific face, etc., which resets 'current'.

           The Font Manager system is used to supply the requested fonts, so it is up to the application to pre-
           load  the  desired  font  information before "column()" is called. Any request to change the encoding
           within "column()" will be ignored, as the fonts have already been specified for a specific  encoding.
           Needless  to  say,  the  encoding  used  in creating the input text needs to match the specified font
           encoding.

           Absent any markup changing the font face or styling, whatever is  defined  by  Font  Manager  as  the
           current  font  will be what is used. This way, you may inherit the font from the previous "column()",
           or call  "$text-"font($pdf->get_font(),  size)>  to  set  both  the  font  and  size,  or  just  call
           "$pdf-"get_font()>  to  set only the font, relying on the "font_size" option or CSS markup to set the
           size.

           Line fitting (paragraph shaping) is currently quite primitive. Words will not be split  (hyphenated).
           It  is  planned to eventually add Knuth-Plass paragraph shaping, along with proper language-dependent
           hyphenation.

           Each change of font automatically supplies its maximum ascender and minimum  descender,  the  extents
           above and below the text line's baseline. Each block of text with a given face and variant, or change
           of  font  size,  will  be  given  the  same  vertical  extents  -- the extents are font-wide, and not
           determined on a per-glyph basis. So, unfortunately, a block of text "acemnorsuvwz" will have the same
           vertical extents as a block of text "bdfghijklpqty". For a given line of text, the  highest  ascender
           and the lowest descender (plus leading) will be used to position the line at the appropriate distance
           below  the  previous  line  (or  the top of the column). No attempt is made to "fit" projections into
           recesses (jigsaw-puzzle like). If there is an inset into the side of a column, or it is otherwise not
           a straight vertical line, so long as the baseline fits within the column outline, no  check  is  made
           whether  descenders or ascenders will fall outside the defined column (i.e., project into the inset).
           We suggest that you try to keep font sizes fairly consistent,  to  keep  reasonably  consistent  text
           vertical extents.

           Data returned by this call

           If  there  is  more text than can be accommodated by the column size, the unused portion is returned,
           with a return code of 1. It is an empty list if all the text could be formatted, and the return  code
           is  0.   "next_y" is the y coordinate where any additional text ("column()" call) could be added to a
           column (as "start_y") that wasn't completely filled.  This would be at the starting point  of  a  new
           column  (i.e.,  the  last  paragraph  is  ended). Note that the application code should check if this
           position is too far down the page (in the bottom margin) and not blindly use it! Also,  as  'md1'  is
           first converted to HTML, any unused portion will be returned as 'pre' markup, rather than Markdown or
           HTML.  Be  sure  to  specify  'pre'  for  any continuation of the column (with one or more additional
           "column()" calls), rather than 'none', 'md1', or 'html'.

           $rc The return code.

               '0' A return code of 0 indicates that the call completed, while using up all the input  $txt.  It
                   did not run out of defined column space.

                   NOTE:  if  "restore"  has  a  value  of  1,  the "column()" call makes no effort to "restore"
                   conditions to any starting values. If your last bit of text left the "current" font with some
                   "odd" face/family, size, italicized, bolded, or colored; that will be what  is  used  by  the
                   next  column  call  (or other PDF::Builder text calls). This is done in order to allow you to
                   easily chain from one column to the next, without having to manually  tell  the  system  what
                   font,  color,  etc.  you  want to return to. On the other hand, in some cases you may want to
                   start from the same initial coditions as usual. You may want to add  "get_font()",  "font()",
                   "fillcolor()", and "strokecolor()" calls as necessary before the next text output, to get the
                   expected  text characteristics. Or, you can simply let "restore" default to 0 to get the same
                   effect.

               '1' A return code of 1 indicates that the call completed by filling up the defined column  space.
                   It  did  not run out of input $txt. You will need to make one or more calls with empty column
                   space (to fill), to use up the remaining input text (with "pre" $markup).

                   If "restore" defaults to 0 (or is set to 1), the text settings in the "current" font are left
                   as-is, so that whatever you were doing when you ran out of defined column (as regards to font
                   face/family, size, italic and bold states, and color) should automatically be the  same  when
                   you make the next "column()" call to make more output.

               Additional return codes may be added in the future, to indicate failures of one sort or another.

           $next_y
               The  next  page  "y"  coordinate to start at, if using the same column definition as the previous
               "column()" definition did (i.e., you didn't completely fill the column,  and  received  a  return
               code  of  0).  In that case, $next_y would give the page "y" coordinate to pass to "column()" (as
               "start_y") to start a new paragraph at.

               If the return code $rc was 1 (column was used up), the $next_y returned will be -1, as  it  would
               be meaningless to use it.

           $unused
               This  is the unused portion of the input text (return code $rc is 1), in a format ("pre" $markup)
               suitable for input as $txt. It will be a reference to an array of hashes.

               If $rc is 0 (all input was used up), $unused is an empty anonymous array.  It contains nothing to
               be used.

perl v5.36.0                                       2023-12-15                   PDF::Builder::Content::Text(3pm)