#[ A paragraph is a document-structural object, like a section or a table of contents, and making paragraphs is a service @document provides: inside a @document, blank-line-separated text becomes paragraphs (the LaTeX convention) and @par need not be written. @par is the explicit form, for a text FRAGMENT rendered without a @document, where nothing infers them. Written inside a @document it is harmless: html sees a

, which the paragraph pass recognizes as a block and leaves alone, and \par in vertical mode is a no-op. ]# # Paragraph @@par.k s : A paragraph of text. @@ @@par.html ::

*s*

@@ @@par.tex :: \par *s* \par @@ # In plain text a paragraph is delimited by blank lines, which # phases.justify_blocks then fills; #/2 inserts them without depending on # the definition body's own whitespace surviving extraction. @@par.txt :: #/2*s*#/2 @@ # Non-breaking space @@sp.k : Non-breaking space character @@ @@sp.html :: &^#160; @@ @@sp.tex :: ~ @@ # Indented block @@indent.k s :left.int 8 :right.int -1 :ragged.bool false : Indented block. The *left* and *right* values are the number of characters for indentation (as roughtly defined by "ex"). By default, *right* is set to the *left* value (with -1 as the sentinel). @@ @@indent.html,tex,txt :: @eval block.Indent(K) eval@ @@ # Right justification @@right.k s :margin 0 :top_margin 2 : Right-justified text @@ @@right.html ::
*s*
@@ @@right.tex :: {\setlength{\topsep}{0pt}\setlength{\partopsep}{0pt}\setlength{\parskip}{*top_margin*ex} \begin{flushright} \raggedleft\rightskip=*margin*ex *s* \end{flushright}} @@ @@right.txt :: @eval import textwrap; "\n".join([line.rjust(*Target_txt_width*, "~") for line in textwrap.wrap("""*s*""", *Target_txt_width*)]) @ @@ # Quote with attribution @@quote.k text | attribution : A block quote with attribution. @@ @@quote.html,tex :: @indent *text* :left 8 @ @right *attribution* :margin 8 :top_margin @cond @eval "*K_target*" == "html" @ | -1 | 1 cond@ @ @@ # Highlighted note in text @@note.k s :label Note :color 1.0,1.0,0.9 :border_color 0.2,0.2,0.2 :level.int 0 :width.float 0.5 : Rectangular block for an editorial note @@ @@note.html,tex :: @eval block.Note(K) @ @@ # Center @@center.k s : Center text @@ @@center.tex :: \begin{center} *s* \end{center} @@ @@center.html ::

*s*

@@ # Newline @@nl.k : Newline character @@ @@nl.html ::
@@ @@nl.tex :: \newline @@ @@nl.txt :: @eval phases.txt_nl_marker() @ @@ # New page @@newpage.k : Start new page @@ @@newpage.html :: @@ @@newpage.tex :: \newpage @@ @@newpage.txt :: @@ # Extend page @@extendpage.k linecount : Extenad current page @@ @@extendpage.html :: @@ @@extendpage.tex :: \enlargethispage{*linecount*\baselineskip} @@ @@extendpage.txt :: @@ # Vertical space @@vspace.k lines.float : Vertical space, in multiples of the current line height @@ @@vspace.tex :: \vspace{*lines*\baselineskip} @@ @@vspace.html ::
@@ @@vspace.txt :: @eval phases.txt_vspace_marker() * round(*lines*) @ @@ # Vertical fill to end of page @@vfill.k : Fill the vertical space so that any following text is flush with the bottom of the page (in HTML, the bottom of the window; once the content is taller than the window the space collapses, as on a full LaTeX page). Several vfills divide the space equally, like LaTeX's \vfill glue. In plain text, only makes some vertical space. @@ @@vfill.tex :: \vfill @@ # An empty glue div; block.css gives it flex-grow 1 and makes the text # column a flex column only in documents that use it (the :has() rule). @@vfill.html ::
@@ @@vfill.txt :: @vspace 3 @ @@ # Questions and answers @@qa.k question | answer : Question and answer formatting @@ @@qa.html,tex,txt :: @b Q: @ *question* @b A: @ *answer* @@ # Absolute positioning @@@argtype coords | x and y coordinates :pattern 'float'\s+'float' @@@ @@block.k : to.coords | content :width.float .5 :point.coords 0.0 0.0 : Absolute positioning of text block @@ @@block.tex :: @eval block.Block(K) eval@ @@ # Preserved line endings @@lines.k s : Maintain line breaks @@ @@lines.html,tex,txt :: @eval block.Lines(K) eval@ @@ # Multiple columns of text @@multicolumn.k s :n 2 :gap 3 : Format *s* in *n* columns (default: 2). The *gap* is in "ex" units. @@ @@multicolumn.tex :: {\setlength{\columnsep}{*gap*ex} \setlength{\multicolsep}{\parskip} \begin{multicols}{*n*} *s* \end{multicols}} @@ @@multicolumn.html ::

*s*

@@ # Text justified left and right on one line @@left_right.k parts.rest(2) : Pairs of text left- and right- justified. First, left lines are written with a bar (|) between each line. Then, two bars (||), and the right lines with a bar betwen them. @@ @@left_right.html,tex :: @eval block.Left_right(K) @ @@ # Footnote @@footnote.k s : Footnote @@ @@footnote.html :: *s* @@ @@footnote.tex :: \unskip\footnote{*s*} @@ @@footnote.txt :: __ #- @eval phases.txt_footnote_marker() @ *s* @eval phases.txt_footnote_marker() @ #- __ @@ # This doesn't work, either, so it isn't the @eval: # @@footnote.txt :: __ #- marker *s* marker #- __ @@