| .TH HTMLROFF 7 |
| .SH NAME |
| htmlroff \- HTML formatting and typesetting |
| .SH DESCRIPTION |
| .I Htmlroff (1) |
| accepts |
| .I troff |
| input with a few extensions and changes. |
| This manual describes the changes to the input language, |
| assuming a working knowledge of |
| .I troff |
| itself. |
| .SS Name lengths |
| .PP |
| Request, macro, string, and number names can be longer |
| than two letters, as in: |
| .IP |
| .EX |
| \&.html c <center> |
| \&.de footnote |
| Footnote here. |
| \&.. |
| \&.footnote |
| \&.ds string "hello |
| \&\e*[string] |
| \&.nr number 1 |
| \&\en[number] |
| .EE |
| .SS HTML output |
| .PP |
| Two new requests: |
| .IP |
| .EX |
| \&.html \fIid\fP \fR[ \fI<html>\fP ]\fL |
| \&.ihtml \fIid\fP \fR[ \fI<ihtml>\fP ]\fL |
| .EE |
| .LP |
| .B .html |
| and |
| .B .ihtml |
| insert HTML into the output. |
| The requests are only for opening new HTML tags. |
| To close previously-opened tags, repeat the request |
| with the same |
| .IR id . |
| For example, the input: |
| .IP |
| .EX |
| \&.html t <table><tr> |
| \&.html td <td>Cell 1 |
| \&.html td <td>Cell 2 |
| \&.html td |
| \&.html t |
| .EX |
| .LP |
| produces this output: |
| .IP |
| .EX |
| <table><tr><td>Cell 1</td><td>Cell 2</td></tr></table> |
| .EE |
| .LP |
| The |
| .B .html |
| request is intended for block-level HTML constructs (those that can contain |
| .BR <p> ) |
| and maintains the HTML tag stack automatically. |
| Intermediate tags need not be explicitly closed: |
| removing the final |
| .B \&.html t |
| line in the example above would produce the same output. |
| The special |
| .I id |
| .L - |
| closes the HTML tags immediately after printing them. |
| .PP |
| The |
| .B .ihtml |
| request is similar to |
| .B .html |
| but is intended for inline HTML constructs such as |
| .B <b> |
| or |
| .B <i> |
| (those that can be contained |
| within |
| .BR <p> ). |
| Unlike |
| .BR .html , |
| .B .ihtml |
| treats the open HTML tags as a set rather than a stack: |
| each must be explicitly closed. |
| Although it treats the tags as a set, |
| .B .ihtml |
| treats nesting properly in the output, |
| closing and reopening tags as necessary. |
| For example, the input: |
| .IP |
| .EX |
| \&.ihtml style <b> |
| \&.ihtml link <a href="link.html"> |
| Bold |
| \&.ihtml style <i> |
| and italic, still linked. |
| \&.ihtml link <a> |
| Unlinked. |
| \&.ihtml style |
| .EE |
| .LP |
| produces this output: |
| .IP |
| .EX |
| <b><a href="link.html">Bold</a></b> |
| <i><a href="link.html">and italic, still linked.</i></a> |
| <i>Unlinked.</i> |
| .EE |
| .PP |
| Outside of |
| .B .html |
| and |
| .B .ihtml |
| requests, the characters |
| .L < , |
| .L > , |
| and |
| .L & |
| are treated as normal characters, not HTML markers, |
| and are translated to |
| .L < , |
| .L > , |
| and |
| .L & |
| on output. |
| To embed the raw HTML markers, use |
| .L \e< , |
| .L \e> , |
| and |
| .L \e@ |
| .RI [ sic ]. |
| .SS Font changes |
| .PP |
| .I Htmlroff |
| interprets the usual |
| .BR \ef , |
| .BR .ft , |
| .BR \es , |
| and |
| .B .ps |
| requests to change the font and point size. |
| After applying each such change to its internal registers, |
| .I htmlroff |
| invokes the |
| .B .font |
| macro to emit corresponding HTML. |
| The default definition of |
| .B .font |
| is: |
| .IP |
| .EX |
| \&.de font |
| \&.ihtml f1 |
| \&.ihtml f |
| \&.ihtml f <span style=\"font-size=\\n(.spt\"> |
| \&.if \\n(.f==2 .ihtml f1 <i> |
| \&.if \\n(.f==3 .ihtml f1 <b> |
| \&.if \\n(.f==4 .ihtml f1 <b><i> |
| \&.if \\n(.f==5 .ihtml f1 <tt> |
| \&.if \\n(.f==6 .ihtml f1 <tt><i> |
| \&.. |
| .EE |
| .LP |
| Input files can redefine |
| .B .font |
| like any other request or macro. |
| .SS Paragraphs |
| .I Htmlroff |
| implements line height, text adjustment, and margins by |
| wrapping all output text in |
| .B <p style="..."> |
| tags. |
| This behavior can be disabled by setting the |
| .B .paragraph |
| number register to zero. |
| Setting the |
| .B .margin |
| register to zero |
| eliminates only the margin annotations. |
| .SS Subscripts and superscripts |
| .PP |
| .I Htmlroff |
| interprets the |
| .BR \eu , |
| .BR \ed , |
| and |
| .BR \ev |
| requests to move vertically during output. |
| It emits output vertically offset up the page inside |
| .B <sup> |
| tags and output vertically offset down the page |
| inside |
| .B <sub> |
| tags. |
| This heuristic handles simple equations formatted by |
| .IR eqn (1). |
| .SS Conditional input |
| .PP |
| To make it easier to write input files that can be formatted by both |
| .I troff |
| and |
| .IR htmlroff , |
| .I htmlroff |
| adds a new condition |
| .B h |
| which evaluates true in |
| .B .if |
| and |
| .B .ie |
| requests. |
| The |
| .B t |
| condition continues to evaluate true, to accomodate |
| input files trying to distinguish between |
| .I troff |
| and |
| .IR nroff . |
| To write a conditional matching |
| .I troff |
| alone, use |
| .RB ` ".if !h .if t" '. |
| .PP |
| .I Htmlroff 's |
| handling of conditional input does not match |
| .IR troff 's |
| exactly. |
| For example, |
| .IP |
| .EX |
| \&.if 0 \e{\e |
| \&.de xx |
| \&.. |
| \&.\e} |
| .EE |
| .LP |
| redefines the |
| .B xx |
| macro in |
| .I troff |
| but not in |
| .IR htmlroff . |
| Do not write files depending on this behavior, as this bug may be fixed |
| in the future. |
| .I Htmlroff |
| also mishandles |
| .B \e} |
| in some cases. To work around them, use |
| .B .\e} |
| on a line by itself, as in the last example. |
| .SS Diversions |
| .PP |
| Diversions in |
| .I htmlroff |
| use the alignment in effect at the time of the |
| diversion |
| when output. |
| In particular, |
| .IP |
| .EX |
| \&.di xx |
| Line here. |
| \&.di |
| \&.nf |
| \&.ce |
| \&.xx |
| .EE |
| .LP |
| produces a centered line in |
| .I troff |
| but not in |
| .IR htmlroff . |
| The solution is to center inside the diversion, as in |
| .IP |
| .EX |
| \&.di xx |
| \&.if h .ce 999 |
| Line here |
| \&.di |
| .EE |
| .SS Input pipes |
| .PP |
| .I Htmlroff |
| adds a new request |
| .B .inputpipe |
| .I stop |
| .I cmd |
| that redirects |
| .I htmlroff 's |
| input into a pipe to the |
| given |
| .I cmd . |
| The redirection stops on encountering the line |
| .IR stop , |
| optionally followed by white space and extra text. |
| This is a dangerous and clusmy request, as |
| .I htmlroff |
| stops interpreting its input during the redirection, so |
| .I stop |
| must be found in the input itself, not in a macro that |
| the input might appear to call. |
| Although clusmy, |
| .B .inputpipe |
| allows input files to invoke |
| .I troff |
| to handle complicated input. |
| For example, |
| .B tmac.html |
| redefines the |
| .B PS |
| macro that marks the beginning of a |
| .IR pic (1) |
| picture: |
| .IP |
| .EX |
| \&.nr png -1 1 |
| \&.de PS |
| \&.ds pngbase "\e\e*[basename] |
| \&.if '\e\e*[pngbase]'' .ds pngbase \e\en(.B |
| \&.ds pngfile \e\e*[pngbase]\e\en+[png].png |
| \&.html - <center><img src="\e\e*[pngfile]"></center> |
| \&.inputpipe .PE troff2png >\e\e*[pngfile] |
| \&.. |
| .EE |
| .LP |
| This macro invokes the shell script |
| .I troff2png |
| to run troff and convert the Postscript |
| output to a PNG image file. |
| Before starting the program, the macro creates |
| a new file name for the image and prints |
| HTML referring to it. |
| The new |
| .B .B |
| register holds the final path element |
| (the base name) of the current input file. |