home *** CD-ROM | disk | FTP | other *** search
- .\" Copyright (c) 1986 The Regents of the University of California.
- .\" All rights reserved.
- .\"
- .\" Redistribution and use in source and binary forms, with or without
- .\" modification, are permitted provided that the following conditions
- .\" are met:
- .\" 1. Redistributions of source code must retain the above copyright
- .\" notice, this list of conditions and the following disclaimer.
- .\" 2. Redistributions in binary form must reproduce the above copyright
- .\" notice, this list of conditions and the following disclaimer in the
- .\" documentation and/or other materials provided with the distribution.
- .\" 3. All advertising materials mentioning features or use of this software
- .\" must display the following acknowledgement:
- .\" This product includes software developed by the University of
- .\" California, Berkeley and its contributors.
- .\" 4. Neither the name of the University nor the names of its contributors
- .\" may be used to endorse or promote products derived from this software
- .\" without specific prior written permission.
- .\"
- .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- .\" SUCH DAMAGE.
- .\"
- .\" @(#)termdesc.me 6.3 (Berkeley) 4/17/91
- .\"
- .+c
- .(l C
- .sz 14
- .b "Writing \s-2NROFF\s0 Terminal Descriptions"
- .sp
- .sz 10
- Eric Allman
- .i "Britton-Lee, Inc."
- .)l
- .sp 2
- .sh 1 "INTRODUCTION"
- .eh 'SMM:20-%''Writing NROFF Terminal Descriptions'
- .oh 'Writing NROFF Terminal Descriptions''SMM:20-%'
- .pp
- As of the Version 7 Phototypesetter release of \s-2UNIX\s0,*
- .(f
- *\s-2UNIX\s0 is a trademark of Bell Laboratories.
- .)f
- \s-2NROFF\s0 has supported terminal description files.
- These files describe the characteristics of available hard-copy printers.
- This document describes some of the details of how to write
- terminal description files.
- .pp
- .ul
- Disclaimer.
- This document describes the results of my personal experience.
- The effects of changing some of the fields from the norms
- may not be well defined,
- even if it seems like it
- .q ought
- to work given the descriptions herein.
- These tables are known to vary slightly
- for different versions of \s-2UNIX\s0.
- I have not seen \s-2UNIX\s0 3.0 at this time,
- so this may be irrelevant in that context.
- .sh 1 "GENERAL"
- .pp
- When \s-2NROFF\s0 starts up,
- it looks for a
- .b \-T
- flag describing the terminal type.
- For example,
- if the command line is given as
- .(b
- nroff \-T300s
- .)b
- \s-2NROFF\s0 prepares output for a
- .i DTC300S
- terminal.
- This terminal is described in the file
- /usr/lib/term/tab300s
- on most systems.
- .pp
- If no
- .b \-T
- flag is given,
- the terminal type
- .b 37
- (ASR 37 \*- a relic assumed for historical humor only)
- is assumed.
- .pp
- The terminal description table is a stripped
- .q \&.o
- file generated from a data structure,
- shown in figure one.
- .(z
- .hl
- .ta 8n 24n
- #define INCH 240 /* one inch in units */
- struct
- {
- int bset; /* stty bits to set */
- int breset; /* stty bits to reset */
- int Hor; /* horizontal resolution in units */
- int Vert; /* vertical resolution in units */
- int Newline; /* the distance a newline moves */
- int Char; /* the distance one char moves */
- int Em; /* size of an Em */
- int Halfline; /* the distance a halfline up/down moves */
- int Adj; /* default adjustment width */
- char *twinit; /* string to init the terminal */
- char *twrest; /* string to reset the terminal */
- char *twnl; /* string to send a newline (CR-LF) */
- char *hlr; /* half line reverse string */
- char *hlf; /* half line forward string */
- char *flr; /* full line reverse string */
- char *bdon; /* string to turn boldface on */
- char *bdoff; /* string to turn boldface off */
- char *ploton; /* string to turn plot on */
- char *plotoff; /* string to turn plot off */
- char *up; /* move up in plot mode */
- char *down; /* move down in plot mode */
- char *right; /* move right in plot mode */
- char *left; /* move left in plot mode */
- char *codetab[256-32]; /* the codes to send for characters */
- int zzz; /* padding */
- };
- .sp
- .ce
- Figure 1 \*- the terminal descriptor data structure
- .hl
- .)z
- This structure can be dealt with in two sections:
- the terminal capability descriptor (everything to codetab),
- and the output descriptor.
- .sh 1 "TERMINAL CAPABILITIES"
- .pp
- The section of the data structure up to but excluding
- .i codetab
- describes the basic functions and setup requirements of the terminal.
- Distances are measured in
- .q units,
- which are 1/240 of an inch in \s-2NROFF\s0.
- In general, \s-2NROFF\s0 assumes that there is a
- .q "plot mode"
- on the terminal that allows you to move in small increments.
- A terminal has a resolution when in plot mode
- that is measured in units.
- This limits how well the terminal can simulate
- printing Greek and special characters.
- .sh 2 "bset, breset"
- .pp
- These fields define bits in a vanilla stty(2) word
- (sg_flags) to
- set and clear respectively when
- \s-2NROFF\s0 starts.
- They are normally represented in octal,
- although you could include <sgtty.h>.
- [Note:
- these fields are presumably different
- in \s-2UNIX\s0 3.0.]
- .sh 2 "Hor, Vert"
- .pp
- These represent the horizontal and vertical resolution respectively
- of the terminal when it is in plot mode.
- They are given in units.
- .sh 2 "Newline"
- .pp
- This field describes the distance that the
- .i twnl
- field (below) will move the paper;
- it is literally the size of a newline.
- .sh 2 "Char"
- .pp
- This is the distance that a regular character
- will move the print head to the right.
- .sh 2 "Em"
- .pp
- The
- .q em
- is a typesetting unit,
- approximately equal to the width of the letter
- .q m .
- In \s-2NROFF\s0 driver tables,
- this must be the distance a space or backspace character will move
- the carriage.
- .sh 2 "Halfline"
- .pp
- This is the distance that the
- .i hlr
- or
- .i hlf
- strings move the print head
- (reverse or forward respectively).
- .sh 2 "Adj"
- .pp
- This is the resolution that \s-2NROFF\s0 will normally adjust
- your lines to horizontally.
- Typically this is the same as Char.
- If the
- .b \-e
- flag is given to \s-2NROFF\s0,
- output resolution will be to the full device resolution.
- .sh 2 "twinit, twrest"
- .pp
- These strings are output when \s-2NROFF\s0 starts and finishes
- respectively.
- .sh 2 "twnl"
- .pp
- This string is output when \s-2NROFF\s0 wants to do a carriage return.
- Typically it will be
- .q "\er\en" .
- Remember,
- the terminal will normally have CRMOD turned off
- when this is set.
- .sh 2 "hlr, hlf"
- .pp
- These strings are sent to move the carriage back or forward
- one half line respectively.
- The actual amount that they moved is defined by
- Halfline.
- The carriage should be left in the same column.
- .sh 2 "flr"
- .pp
- The string to send to move a full line backwards.
- This should leave the carriage in the same column.
- .sh 2 "bdon, bdoff"
- .pp
- These strings are sent to turn boldface mode on and off
- respectively.
- Normally this will set the terminal into overstrike mode.
- If they are not given,
- some newer versions of \s-2NROFF\s0 will output the characters
- four times to force overstriking.
- .sh 2 "ploton, plotoff"
- .pp
- These strings turn plot mode on and off respectively.
- In plot mode,
- the carriage moves a very small amount,
- and only under specific control;
- i.e., characters do not automatically cause any carriage motion.
- .sh 2 "up, down, right, left"
- .pp
- These strings are only output in plot mode.
- They should move the carriage up, down, left, and right
- respectively;
- they will move the carriage a distance of Hor or Vert
- as appropriate.
- .sh 2 "An Example"
- .pp
- Consider the following table describing a
- DTC300S:
- .(b
- .ta 1.5i
- /*bset*/ 0,
- /*breset*/ 0177420,
- /*Hor*/ INCH/60,
- /*Vert*/ INCH/48,
- /*Newline*/ INCH/6,
- /*Char*/ INCH/10,
- /*Em*/ INCH/10,
- /*Halfline*/ INCH/12,
- /*Adj*/ INCH/10,
- /*twinit*/ "\e033\e006",
- /*twrest*/ "\e033\e006",
- /*twnl*/ "\e015\en",
- /*hlr*/ "\e033H",
- /*hlf*/ "\e033h",
- /*flr*/ "\e032",
- /*bdon*/ "",
- /*bdoff*/ "",
- /*ploton*/ "\e006",
- /*plotoff*/ "\e033\e006",
- /*up*/ "\e032",
- /*down*/ "\en",
- /*right*/ " ",
- /*left*/ "\eb",
- .)b
- This describes a terminal that should have the
- ALLDELAY and CRMOD bits turned off,
- 1/60" horizontal and 1/48" vertical resolution,
- six lines per inch and ten characters per inch, including space,
- halfline takes 1/12" (one half of a full line),
- should send ESC-control-F to initialize and reset the terminal
- (to insure that it is in a normal state),
- takes <CR><LF> to give a newline,
- <ESC>H to move back one half line,
- <ESC>h to move forward one half line,
- control-Z to move back one full line,
- has no bold mode,
- takes control-F to enter plot mode
- and escape-control-F to exit plot mode,
- and uses control-Z, linefeed, space, and backspace
- to move up, down, right, and left respectively
- when in plot mode.
- .sh 1 "CHARACTER DESCRIPTIONS"
- .pp
- There is one character description
- for each possible character to be output.
- The easiest way to find what character corresponds to what position
- is to edit an existing character table;
- one is given in the appendix as an example.
- Character representations are represented as a string per
- character.
- .pp
- The first character of the string
- is interpreted as a binary number
- giving the number of character spaces taken up
- by this character.
- For regular characters
- this will always be
- .q "\e001" ,
- but Greek and special characters can take more.
- If the 0200 bit is set in this character,
- it indicates that the character should be underlined
- if we are in italic (underline) mode.
- Thus,
- alphabetic and numeric descriptions
- will begin
- .q "\e201" .
- .pp
- The remainder of the string is output to represent the character.
- If the first output character
- (i.e.,
- the second character in the total string)
- has the 0200 bit set,
- the character will be output in plot mode
- so that fancy characters can be built up from existing characters.
- If necessary,
- the
- .q "\e200"
- character can be used as a null character
- to force \s-2NROFF\s0 to set the terminal into plot mode.
- All characters without the 0200 bit are output literally;
- characters with the 0200 bit are not output,
- but are used to indicate local carriage movement.
- The next two bits (0140 bits) represent direction:
- .(b
- .ta \w'0200 'u
- 0200 right
- 0240 left
- 0300 down
- 0340 up
- .)b
- The bottom five bits represent a distance in terminal resolution units.
- This is rather confusing,
- but the examples should make this much more clear.
- .sh 2 "Some Examples"
- .pp
- The following examples are from the DTC300S table:
- .(b
- .ta 2i
- "\e001 ", /*space*/
- "\e001=", /*=*/
- "\e201A", /*A*/
- .)b
- These entries show that all of these characters
- take one character width when output.
- The letter A is underlined in italic mode,
- but neither space nor equal sign is.
- .(b
- .ta 2i
- "\e001o\eb+", /*bullet*/
- "\e002[]", /*square*/
- "\e202f\^i", /*f\^i*/
- .)b
- The bullet character takes only one character position,
- but is created by outputing the letter
- .q o
- and overstriking it with a plus sign.
- The square character is approximated
- with two brackets;
- it takes two full character positions
- when output.
- The
- .q fi
- ligature
- is produced using the letters
- .q f
- and
- .q i
- (surprise!);
- it is underlined in italic mode.
- .(b
- "\e001\e241c\e202(\e241", /*alpha*/
- "\e001\e200B\e242\e302|\e202\e342", /*beta*/
- .)b
- The letters alpha and beta both take a single character position.
- The alpha is output by entering plot mode,
- moving left 1 terminal unit (1/60" if you recall),
- outputing the letter
- .q c ,
- moving right 2/60",
- outputing a left parenthesis,
- and finally moving left 1/60";
- it is critical that the net space moved
- be zero both horizontally and vertically.
- The beta first has a dummy 0200 character
- to enter plot mode but not output anything.
- It then outputs a
- .q B ,
- moves left 2/60",
- moves down 2/48",
- outputs a vertical bar
- (which is designed to partically overstrike the left edge of the
- .q B ,
- and finally move right 2/60" and up 2/48"
- to set us back to the right place.
- .sh 1 "INSTALLATION"
- .pp
- To install a terminal descriptor,
- make it up by editing an existing terminal descriptor.
- Assuming your terminal name is
- .i term ,
- call your new descriptor
- .b tab \c
- .i term \c
- .b .c .
- Then, execute the following commands:
- .(b
- cc -c tabterm.c
- strip tabterm.c
- cp tabterm.o /usr/lib/term/tabterm
- .)b
- The directory /usr/src/cmd/troff/term
- typically has a shell file to do this.
- .+c
- .ce 2
- APPENDIX
- .sp
- A Sample Table
- .sp 3
- This table describes the DTC 300S.
- .(l
- .re
- #define INCH 240
- /*
- DASI300S
- nroff driving tables
- width and code tables
- */
-
- struct {
- int bset;
- int breset;
- int Hor;
- int Vert;
- int Newline;
- int Char;
- int Em;
- int Halfline;
- int Adj;
- char *twinit;
- char *twrest;
- char *twnl;
- char *hlr;
- char *hlf;
- char *flr;
- char *bdon;
- char *bdoff;
- char *ploton;
- char *plotoff;
- char *up;
- char *down;
- char *right;
- char *left;
- char *codetab[256-32];
- int zzz;
- } t = {
- /*bset*/ 0,
- /*breset*/ 0177420,
- /*Hor*/ INCH/60,
- /*Vert*/ INCH/48,
- /*Newline*/ INCH/6,
- /*Char*/ INCH/10,
- /*Em*/ INCH/10,
- /*Halfline*/ INCH/12,
- /*Adj*/ INCH/10,
- /*twinit*/ "\e033\e006",
- /*twrest*/ "\e033\e006",
- /*twnl*/ "\e015\en",
- /*hlr*/ "\e033H",
- /*hlf*/ "\e033h",
- /*flr*/ "\e032",
- /*bdon*/ "",
- /*bdoff*/ "",
- /*ploton*/ "\e006",
- /*plotoff*/ "\e033\e006",
- /*up*/ "\e032",
- /*down*/ "\en",
- /*right*/ " ",
- /*left*/ "\eb",
- /*codetab*/
- "\e001 ", /*space*/
- "\e001!", /*!*/
- "\e001\e"", /*"*/
- "\e001#", /*#*/
- "\e001$", /*$*/
- "\e001%", /*%*/
- "\e001&", /*&*/
- "\e001'", /*' close*/
- "\e001(", /*(*/
- "\e001)", /*)*/
- "\e001*", /***/
- "\e001+", /*+*/
- "\e001,", /*,*/
- "\e001-", /*- hyphen*/
- "\e001.", /*.*/
- "\e001/", /*/*/
- "\e2010", /*0*/
- "\e2011", /*1*/
- "\e2012", /*2*/
- "\e2013", /*3*/
- "\e2014", /*4*/
- "\e2015", /*5*/
- "\e2016", /*6*/
- "\e2017", /*7*/
- "\e2018", /*8*/
- "\e2019", /*9*/
- "\e001:", /*:*/
- "\e001;", /*;*/
- "\e001<", /*<*/
- "\e001=", /*=*/
- "\e001>", /*>*/
- "\e001?", /*?*/
- "\e001@", /*@*/
- "\e201A", /*A*/
- "\e201B", /*B*/
- "\e201C", /*C*/
- "\e201D", /*D*/
- "\e201E", /*E*/
- "\e201F", /*F*/
- "\e201G", /*G*/
- "\e201H", /*H*/
- "\e201I", /*I*/
- "\e201J", /*J*/
- "\e201K", /*K*/
- "\e201L", /*L*/
- "\e201M", /*M*/
- "\e201N", /*N*/
- "\e201O", /*O*/
- "\e201P", /*P*/
- "\e201Q", /*Q*/
- "\e201R", /*R*/
- "\e201S", /*S*/
- "\e201T", /*T*/
- "\e201U", /*U*/
- "\e201V", /*V*/
- "\e201W", /*W*/
- "\e201X", /*X*/
- "\e201Y", /*Y*/
- "\e201Z", /*Z*/
- "\e001[", /*[*/
- "\e001\e\e", /*\e*/
- "\e001]", /*]*/
- "\e001^", /*^*/
- "\e001_", /*_ dash*/
- "\e001`", /*` open*/
- "\e201a", /*a*/
- "\e201b", /*b*/
- "\e201c", /*c*/
- "\e201d", /*d*/
- "\e201e", /*e*/
- "\e201f", /*f*/
- "\e201g", /*g*/
- "\e201h", /*h*/
- "\e201i", /*i*/
- "\e201j", /*j*/
- "\e201k", /*k*/
- "\e201l", /*l*/
- "\e201m", /*m*/
- "\e201n", /*n*/
- "\e201o", /*o*/
- "\e201p", /*p*/
- "\e201q", /*q*/
- "\e201r", /*r*/
- "\e201s", /*s*/
- "\e201t", /*t*/
- "\e201u", /*u*/
- "\e201v", /*v*/
- "\e201w", /*w*/
- "\e201x", /*x*/
- "\e201y", /*y*/
- "\e201z", /*z*/
- "\e001{", /*{*/
- "\e001|", /*|*/
- "\e001}", /*}*/
- "\e001~", /*~*/
- "\e000\e0", /*narrow sp*/
- "\e001-", /*hyphen*/
- "\e001o\eb+", /*bullet*/
- "\e002[]", /*square*/
- "\e001-", /*3/4 em*/
- "\e001_", /*rule*/
- "\e000\e0", /*1/4*/
- "\e000\e0", /*1/2*/
- "\e000\e0", /*3/4*/
- "\e001-", /*minus*/
- "\e202f\^i", /*fi*/
- "\e202f\^l", /*fl*/
- "\e202f\^f", /*ff*/
- "\e203f\^f\^i", /*ffi*/
- "\e203f\^f\^l", /*ffl*/
- "\e000\e0", /*degree*/
- "\e000\e0", /*dagger*/
- "\e000\e0", /*section*/
- "\e001'", /*foot mark*/
- "\e001'", /*acute accent*/
- "\e001`", /*grave accent*/
- "\e001_", /*underrule*/
- "\e001/", /*slash (longer)*/
- "\e000\e0", /*half narrow space*/
- "\e001 ", /*unpaddable space*/
- "\e001\e241c\e202(\e241", /*alpha*/
- "\e001\e200B\e242\e302|\e202\e342", /*beta*/
- "\e001\e200)\e201/\e241", /*gamma*/
- "\e001\e200o\e342<\e302", /*delta*/
- "\e001<\eb-", /*epsilon*/
- "\e001\e200c\e201\e301,\e241\e343<\e302", /*zeta*/
- "\e001\e200n\e202\e302|\e242\e342", /*eta*/
- "\e001O\eb-", /*theta*/
- "\e001i", /*iota*/
- "\e001k", /*kappa*/
- "\e001\e200\e\e\e304\e241'\e301\e241'\e345\e202", /*lambda*/
- "\e001\e200u\e242,\e202", /*mu*/
- "\e001\e241(\e203/\e242", /*nu*/
- "\e001\e200c\e201\e301,\e241\e343c\e241\e301`\e201\e301", /*xi*/
- "\e001o", /*omicron*/
- "\e001\e341-\e303\e"\e301\e"\e343", /*pi*/
- "\e001\e200o\e242\e302|\e342\e202", /*rho*/
- "\e001\e200o\e301\e202~\e341\e242", /*sigma*/
- "\e001\e200t\e301\e202~\e243~\e201\e341", /*tau*/
- "\e001v", /*upsilon*/
- "\e001o\eb/", /*phi*/
- "\e001x", /*chi*/
- "\e001\e200/-\e302\e202'\e244'\e202\e342", /*psi*/
- "\e001\e241u\e203u\e242", /*omega*/
- "\e001\e242|\e202\e343-\e303\e202`\e242", /*Gamma*/
- "\e001\e242/\e303-\e204-\e343\e\e\e242", /*Delta*/
- "\e001O\eb=", /*Theta*/
- "\e001\e242/\e204\e\e\e242", /*Lambda*/
- "\e000\e0", /*Xi*/
- "\e001\e242[]\e204[]\e242\e343-\e303", /*Pi*/
- "\e001\e200>\e302-\e345-\e303", /*Sigma*/
- "\e000\e0", /**/
- "\e001Y", /*Upsilon*/
- "\e001o\eb[\eb]", /*Phi*/
- "\e001\e200[]-\e302\e202'\e244`\e202\e342", /*Psi*/
- "\e001\e200O\e302\e241-\e202-\e241\e342", /*Omega*/
- "\e000\e0", /*square root*/
- "\e000\e0", /*terminal sigma*/
- "\e000\e0", /*root en*/
- "\e001>\eb_", /*>=*/
- "\e001<\eb_", /*<=*/
- "\e001=\eb_", /*identically equal*/
- "\e001-", /*equation minus*/
- "\e001=\eb~", /*approx =*/
- "\e000\e0", /*approximates*/
- "\e001=\eb/", /*not equal*/
- "\e002->", /*right arrow*/
- "\e002<-", /*left arrow*/
- "\e001|\eb^", /*up arrow*/
- "\e000\e0", /*down arrow*/
- "\e001=", /*equation equal*/
- "\e001x", /*multiply*/
- "\e001/", /*divide*/
- "\e001+\eb_", /*plus-minus*/
- "\e001U", /*cup (union)*/
- "\e000\e0", /*cap (intersection)*/
- "\e000\e0", /*subset of*/
- "\e000\e0", /*superset of*/
- "\e000\e0", /*improper subset*/
- "\e000\e0", /* improper superset*/
- "\e002oo", /*infinity*/
- "\e001\e200o\e201\e301`\e241\e341`\e241\e341`\e201\e301", /*partial derivative*/
- "\e001\e242\e\e\e343-\e204-\e303/\e242", /*gradient*/
- "\e001\e200-\e202\e341,\e301\e242", /*not*/
- "\e001\e200|'\e202`\e243\e306'\e241`\e202\e346", /*integral sign*/
- "\e000\e0", /*proportional to*/
- "\e000\e0", /*empty set*/
- "\e000\e0", /*member of*/
- "\e001+", /*equation plus*/
- "\e001r\ebO", /*registered*/
- "\e001c\ebO", /*copyright*/
- "\e001|", /*box rule */
- "\e001c\eb/", /*cent sign*/
- "\e000\e0", /*dbl dagger*/
- "\e000\e0", /*right hand*/
- "\e001*", /*left hand*/
- "\e001*", /*math * */
- "\e000\e0", /*bell system sign*/
- "\e001|", /*or (was star)*/
- "\e001O", /*circle*/
- "\e001|", /*left top (of big curly)*/
- "\e001|", /*left bottom*/
- "\e001|", /*right top*/
- "\e001|", /*right bot*/
- "\e001|", /*left center of big curly bracket*/
- "\e001|", /*right center of big curly bracket*/
- "\e001|", /*bold vertical*/
- "\e001|", /*left floor (left bot of big sq bract)*/
- "\e001|", /*right floor (rb of ")*/
- "\e001|", /*left ceiling (lt of ")*/
- "\e001|"}; /*right ceiling (rt of ")*/
- .)l
-