© 1990-1997, William Chia-Wei Cheng
Tgif is an Xlib based interactive 2-D drawing facility under X11. Supports hierarchical construction of drawings and easy navigation between sets of drawings. It's also a hyper-graphics (or hyper-structured-graphics) browser on the World-Wide-Web.
tgif [-display displayname] [-fg <color>] [-bg <color>] [-bd <color>] [-rv] [-nv] [-bw] [-reqcolor] [-cwo] [-hyper] [geometry <geom>] [=<geom>] [<file> [.obj]]
or
tgif -print [-eps] [-p] [-ps] [-f] [-text] [-raw [+h]] [dosepsfilter] [-status] [-gray] [-color | -reqcolor] [-adobe | -adobe=<number>/<number>] [-page <number>] [-print_cmd "<command>"] [-one_file_per_page] [-pepsc] [-bop_hook "<string>"] [-eop_hook "<string>"] [-odir] [file1 file2 ...]
Tgif is an interactive drawing tool that allows the user to draw and manipulate objects in the X Window System. Tgif runs interactively in the first form. In the second form, tgif just prints files without opening windows or fonts, and it is compatible with the obsoleted prtgif.
In the first form, the command line arguments -fg, -bg, and -bd specify the foreground, background, and border colors, respectively. The command line argument file specifies a file or an Uniform Resource Locator (URL) of objects to be initially edited by tgif. Only HTTP or FTP URL's are supported. (For a more detailed description of URL and the World-Wide-Web, the reader is referred to [1].) If -rv (or -nv) is specified, tgif will come up in reverse-video (or normal-video) mode. If -bw is specified, tgif will come up in the black and white mode. Using -reqcolor has the same effect as setting the Tgif.PrintUsingRequestedColor X default to true (see the X Defaults section below). If -cwo is specified, only the canvas window (see tgif Subwindows section below) will be displayed. This has the same effect as setting the Tgif.CanvasWindowOnly X default to true. If -hyper is specified tgif will be started in the hyperspace mode (see Hyperspace section below). Tgif is purely based on Xlib. It is tested under X11R6, and it requires a 3 button mouse.
In the second form, tgif prints file1.obj, file2.obj, etc. (generated by tgif) into PostScript(TM) page description files and pipes them to lpr(1) if none of the -eps, -p, -ps, -f, or -text options are specified. In this case, any other unrecognized command line options are sent to lpr(1). A symbol file (see descriptions below) can also be printed by specifying the .sym extension explicitly.
In the second form, if the -eps or the -p option is specified, tgif generates an Encapsulated PostScript(TM) file in file.eps; this file is supposed to be included in a LaTeX file through the \psfig, \epsf, or \psfile construct (see the LaTex Figure Formats section below). If the -ps or the -f option is specified, it generates a PostScript file in file.ps; this file can be printed to a PostScript printer with lpr(1). If the -text option is specified, it generates a text file in file.txt; the text file contains all visible text and can be fed to a spell checker. (Note that if any of the -eps, -p, -ps, -f, or -text options are specified, any other command line options are ignored.) Using the -raw option causes the content of the files to be dumped to stdout. If -raw+h is used and if the file is an HTTP URL, the HTTP header is also dumped to stdout. Using the -dosepsfilter option makes tgif act as a filter for gettting rid of the DOS EPS Binary File Header and the trailing TIFF image in a DOS/Windows EPS file. Using the -status option inconjunction with either -raw or -raw+h causes a status line to be displayed in stderr. Using the -gray option has the same effect as setting the Tgif.UseGrayScale X default to true (see the X Defaults section below). To print in color, one can use either the -color or the -reqcolor option. The only difference between the two is that using -reqcolor has the same effect as setting the Tgif.PrintUsingRequestedColor X default to true (see the X Defaults section below). Using the -adobe or the -adobe=<number>/<number> option has the same effect as specifying the Tgif.UsePsAdobeString X default. Using the -page option causes a specified page to be printed. Using the -print_cmd option has the same effect as specifying the Tgif.PrintCommand X default. Using the -one_file_per_page option causes each page to be printed into a separate file. Using the -pepsc (PreserveEPSComment) option has the same effect as setting the Tgif.StripEPSComment X default to false. Using the -bop_hook and -fI-eop_hook options have the same effect as specifying the Tgif.PSBopHook and Tgif.PSEpsHook X defaults. If the -o option is not specified, the output file (eps, ps, or txt) goes into the same directory as the input file. If -odir is specified, the output file goes into the directory specified by dir.
Please note that only running tgif interactively can generate X11 bitmap (XBM), X11 pixmap (XPM), GIF, HTML, or color PostScript/EPS files.
Primitive objects supported by tgif are rectangles, ovals, rounded-corner rectangles, arcs, polylines, polygons, opensplines, closed-splines, text, X11 bitmaps, some specific forms of X11 pixmaps, and Encapsulated PostScript. Objects can be grouped together to form a grouped object. A primitive or a grouped object can be made into an icon object or a symbol object through user commands.
Tgif objects are stored in two types of files. A file with a .obj extension (referred to as an object file) is a file of objects, and a file with a .sym extension (referred to as a symbol file) specifies a ``building-block'' object. A teleport mechanism is provided to travel (or hyperjump) among the .obj files. A building-block object consists of the representation part and the definition part (which can be empty) of the object. Tgif supports the ``bottom-up'' construction of hierarchical drawings by providing the capability to ``instantiate'' a building-block object in a drawing. Tgif also supports the ``top-down'' specification of drawings by allowing the user to make any object a represen- tation of an un-specified subsystem. Both types of files are stored in the form of Prolog facts. Prolog code can be written to interpret the drawings! (It is left to the user to produce the code. See the Prolog/C Testdrive section for more details.) Prolog engines are referred to as drivers in the sections to follow. (Other types of drivers are also allowed, e.g., written in C.)
Text based attributes can be attached to any non-text object. Attributes specified in the representation part of a building-block object are non-detachable when such an object is instantiated. See the Attributes section for details.
Tgif can generate output in four different formats. By default, the output is in the PostScript format (color PostScript is supported), and it is generated into a file named /tmp/Tgifa* (produced by mktemp() calls) where * is a number; this file is piped to lpr(1). This takes place when the laser-printer icon is displayed in the Choice Window (see the tgif Subwindows section for the naming of tgif windows). This output can be redirected to a file with a .ps extension. This takes place when the PS icon is displayed in the Choice Window. When the LaTeX (or EPSI) icon is displayed in the Choice Window, the output is generated into a file with a .eps extension. This file is in the Encapsulated PostScript (or Encapsulated PostScript Interchange) format; it can be included in a LaTeX document with the \psfig or the \epsf construct; this will be discussed later. The only difference between the EPS and EPSI formats is that an EPSI file contains a preview bitmap. However, it takes time to generate the preview bitmap. If the EPS/EPSI file is to be incorporated into some tool that does not know how to use the preview bitmap, time can be saved by not using the EPSI format. When the T icon is displayed in the Choice Window, the output generated into a file with a .txt extension. This is a text file containing all visible text; it can be fed to a spell checker. When the x11bm (X11 bitmap) icon is displayed in the Choice Window and color output is not selected, tgif generates the output with the .xbm extension; the output is in the X11 bitmap format. However, if the x11bm icon is displayed in the Choice Window and color output is selected (through the ^#k keyboard command -- ^ denotes the <Control> and # denotes the <Meta> key), then tgif generates the output with the .xpm extension, and the output is in the X11 pixmap format (the version of this XPM format depends on the settings of the Tgif.XPmOutputVersion X default).
X11 bitmap files, certain forms of X11 pixmap files (such as the one generated by tgif; see the section on X11 Pixmap for details), GIF files, and Encapsulated PostScript (EPS) files can be imported into tgif and be represented as tgif primitive objects. Files in other raster formats (e.g, JPEG, TIFF, etc.) can also be imported into tgif if external tools can be used to convert them into X11 pixmap files. Please see the Import Raster Graphics section for details.
Tgif drawings are supposed to be printed on letter size paper (8.5in by 11in). Both landscape and portrait page styles are supported by tgif. Reduction (or magnification) can be controlled by the #% keyboard command to set the reduction/magnification. If the compiler flag -DA4PAPER is defined (in Imakefile or Makefile.noimake), then the output is supposed to be printed on A4 papers (which has approximate dimensions of 8.25in by 11.7in).
An object in an object (.obj) file can be a primitive object, a grouped object, or an icon object. A symbol (.sym) file can have any number of objects allowed in an object file and exactly one symbol object. (Recall that a symbol file specifies a building-block object.) The symbol object in a symbol file is the representation part of the building-block object, and the rest of the symbol file is the definition part of the building-block object. The symbol object is highlighted with a dashed outline to distinguish it from the rest of the objects. When a buildingblock object is instantiated, the symbol part of the file is copied into the graphics editor, and it becomes the icon for the building-block object.
All objects in tgif can be moved, duplicated, deleted, rotated, flipped, rotated, and sheared. However, in the non-stretchable text mode, text objects can not be stretched. For an text object, if it has not been stretched, rotated, or sheared, flipping it horizontally will cause the text justification to change and flipping it vertically has not effect.
Tgif supports 32 fill patterns, 32 pen patterns, 7 default line widths, 4 line styles (plain, head arrow, tail arrow, double arrows) for polylines and open-splines, 9 dash patterns, 3 types of text justifications, 4 text styles (roman, italic, bold, bold-italic), 11 default text sizes (8, 10, 12, 14, 18, and 24 for the 75dpi fonts and 11, 14, 17, 20, 25, and 34 for the 100dpi fonts), 5 default fonts (Times, Courier, Helvetica, New-Century-Schoolbook, Symbol), and 11 default colors (magenta, red, green, blue, yellow, pink, cyan, cadet-blue, white, black, dark-slate-gray). Additional line widths can be added through the use of Tgif.MaxLineWidths, Tgif.LineWidth#, Tgif.ArrowWidth#, and Tgif.ArrowHeight# X defaults. Additional text sizes can be added through the use of Tgif.FontSizes X default. Additional fonts can be added through the use of Tgif.AdditionalFonts X default. If the defaults fonts are not available, their replacement fonts can be specified by Tgif.HasAlternateDefaultFonts and related X defaults. Additional colors can be added through the use of Tgif.MaxColors, and Tgif.Color# X defaults. One can also select AddColor() from the Edit Menu to add a color.
Most commands in tgif can either be activated by a popup menu or by typing an appropriate non-alphanumeric key. All operations that change any object can be undone and the redone. Commands such as zoom, scroll, change fonts while no text objects are selected, etc. are not undoable. The undo/redo history buffer size can be set using the Tgif.HistoryDepth X default.
The tgif windows are described in this section.
Displays the current domain and the name of the file tgif is looking at. Mouse clicks and key presses have no effect.
This window is right under the Top Window. Pull-down menus can be activated from it with any mouse buttons. Key presses have no effect. If HideMenubar() is selected from the Layout Menu, this window becomes invisible. If ShowMenubar() is selected from the Layout Menu (which can be activated from the Canvas Window below), this window becomes visible. The View, Text, and Graphics pull-down menus are cascading menus and can not be pinned (see the Popup Menus subsection below for a description).
This is right under the Menubar Window and to the left. It displays tgif messages. Clicking the left mouse button in this window scrolls the messages towards the bottom, clicking the right mouse button scrolls towards the top, and clicking or dragging the middle mouse button scrolls to the location in the message history depending on where the mouse is clicked. If the <Shift> (or <Control>) key is held down when clicking the left/right mouse button, it scrolls right/left.
This is the window to the right of the Message Window, and it contains a collection of icons (not to be confused with the tgif icon objects) reflecting the current state of tgif. In top/bottom, left/right order, it displays the current drawing mode, the page style (portrait or landscape), edit (see below), print/export mode, zoom factor, move and stretch mode (constrained or unconstrained), radius for roundedcorner rectangles, text rotation, page number or row/column, page layout mode (stacked or tiled), horizontal alignment (L C R S -), vertical alignment (T M B S -), font, text size, vertical spacing between lines of text within the same text object, text justification, shape (see below), stretchable or non-stretchable text mode, dash pattern, line style, polyline, spline, or interpolated spline, line width, fill pattern, pen pattern, color, and special (see below). Key presses have no effect in this window. In addition to displaying the current state of tgif, the icons in the Choice Window can also be used to change the current state. Each icon is associated with a particular state variable of tgif. Clicking the left mouse button on top of an icon cycles the state variable associated with the icon forward; clicking the right mouse button cycles the state variable backwards. Dragging the middle mouse button on top of an icon usually generates a popup menu which corresponds to an entry in the Main Menu for the Canvas Window below. (The ``edit'', ``shape'', and ``special'' icons mentioned above are dummy icons that allow the ``edit'', ``shape'', and ``special'' menus to be accessed in the Choice Window. They do not respond to left and right mouse clicks.) The response to the dragging of the middle mouse button is different for the zoom, radius, and vertical spacing icons. Dragging the mouse left or up increases the zoom or decreases the radius or vertical spacing; dragging the mouse right or down has the opposite effect. If there are objects selected in the canvas window, then the action of the mouse will cause the selected objects to change to the newly selected mode; note that in this case, the current choice won't change if the middle mouse button is used (unless the Tgif.StickyMenuSelection X default is set to true). The settings of the horizontal and vertical alignments determine how objects (or vertices) align with each other when the ^l keyboard command is issued, how each individual object (or vertex) aligns with the grids when the ^t keyboard command is issued, how objects or vertices distribute spatially with respect to each other when the #l keyboard command is issued, and how each icon replaces the old icon when the ^#u keyboard command is issued. The horizontal alignments are left (L), center (C), right (R), space (S), and ignore (-). The vertical alignments are top (T), middle (M), bottom (B), space (S), and ignore (-). In aligning operations, the space (S) and the ignore (-) settings have the same effect. The space settings are used to distribute objects such that the gaps between any two neighboring objects are equal. In vertex mode, any non-ignore setting will cause the selected vertices to be spaced out evenly. The best way to understand them is to try them out. The text vertical spacing determines the vertical distance to advance when a carriage return is pressed during text editing. If the user tries to set the value too negative, such that the next line is exactly at the same position as the current line, such a setting will not be allowed (this distance depends on the current font and font size).
This is the drawing area. The effects of the actions of the mouse is determined by the current drawing mode. Normally, dragging the right mouse button will generate the Mode Menu. The drawing modes are (in order, as they appear in the Mode Menu) select, text, rectangle, oval, polyline (open-spline), polygon (closed-spline), arc, rounded-corner rectangle, freehand polyline (open-spline), select vertices, and rotate/shear. When drawing a rectangle, an oval, or a rounded-corner rectangle, if the <Shift> key is held down, a square, a circle, or a rounded-corner square is drawn. Dragging the middle mouse button will generate the Main Menu.
In the select mode, left mouse button selects, moves, stretches, and reshapes objects (double-click will ``de-select'' all selected objects in vertex mode). When an object is selected, it is highlighted by little squares (referred as handles here) at the corners/vertices (using the Tgif.HandleSize X default, the sizes of the handles can be customized). Dragging one of the handles stretches/reshapes the selected object.
If one wants to move a selected object, one should not drag the handles. Instead, one should drag other parts of the object. For example, if the object is a hollow rectangle (the fill is NONE and the pen is not NONE), in order to select the rectangle, one should to click on the outline of the rectangle with the left mouse button. If one would like to move the rectangle, one should drag the outline of the rectangle with the left mouse button. If the object is a filled rectangle (fill is not NONE), the one can click inside the rectangle to select it and drag anywhere inside the rectangle to move it.
Holding down the <Shift> key and clicking the left mouse on an object which is not currently selected will add the object to the list of already selected objects. The same action applied to an object which is already selected will cause it to be de-selected. When stretching objects (not reshaping poly-type objects), holding down the <Shift> key after stretching is initiated activates proportional stretching (basically, a scale operation is being performed). In nonstretchable text mode, text objects can not be stretched or scaled. Clicking the middle mouse button while the <Shift> key is held down will activate the teleport (or travel), the launch, or the execute inter- nal command mechanism. See the sections on Teleport/Hyperjump>Teleport/Hyperjump, Launch Applications, and Internal Commands for details. Teleporting has precedence over launching, which has precedence over executing an internal command. The arrow keys can also be used to move selected objects. However, if no objects are selected, using the arrow keys will scroll the drawing area by a small amount, and using the arrow keys when <Control> key is held down will scroll a screen full.
In the select vertices mode, left mouse button selects and moves vertices. Only the top-level polyline/openspline and polygon/closed-spline objects which are selected when the vertex mode is activated are eligible for vertex operations. In this mode, all eligible objects have their vertices highlighted with squares. When a vertex is selected (using similar mechanism as selecting objects described above), it is doubly highlighted with a '+' sign. Operations available to these doubly highlighted vertices are move, delete, align (with each other), distribute (space them equally), and align to grid. The arrow keys can also be used to move selected vertices.
Objects can be locked (through the #< keyboard command). Locked object are shown with gray handles, and they can not be moved, stretched, flipped, rotated, or sheared. When objects are grouped, the resulting grouped object will also be locked if any one of it's constituents is locked. Locked objects can have their properties, such as color, font, pen, etc., changed; furthermore, they can be deleted.
If the current move/stretch mode is of the constrained type (activated and deactivated by the #@ keyboard command), top-level polylines will have the following behavior. In a move operation, if both endpoints of a polyline lie inside the objects being moved, then the whole polyline is moved; otherwise, if only one endpoint falls inside the objects being moved, then that endpoint is moved. The vertex that is the neighbor of the moved endpoint may also be moved either horizontally or vertically. If the last line segment is horizontal or vertical, then the neighbor vertex may be moved so that the direction of the last line segment is maintained. In a stretch (not reshape) operation, if an endpoint of a polyline lies inside the objects being moved, that endpoint will be moved. The vertex that is the neighbor of the moved endpoint will also be moved in the same manner as described above.
When the drawing mode is set to text (a vertical-bar cursor is shown), clicking the left mouse button causes selected text to go into edit mode. Dragging the left mouse button or clicking the left mouse button while the <Shift> key is held down highlights substrings of the text. Double-clicking causes a word to be selected. In edit mode, key presses are treated as text strings being inputed, and arrow keys are used to move the current input position. If a key press is preceded by an <ESC> key, then the character's bit 7 is turned on. This allows non-ASCII (international) characters to be entered. One can use xfd(1) to see what the corresponding international character is for an ASCII character. For the Symbol font, symbols such as the integral, partial derivative, and copyright symbols can all be found in this range. There are some characters that are supported by X11 but not by PostScript; these characters are not accepted by tgif. If the text being edited is an attribute of a object, <Meta><Tab> will move the cursor to the next visible attribute and <Shift><Tab> will move the cursor to the previous visible attribute.
If the drawing mode is set to draw polygons (not closed-splines) and if the <Shift> key is held down, the rubber-banded polygon will be self-closing.
The freehand drawing mode can be used to draw polylines and open splines. All intermediate points are specified by moving the mouse (as opposed to clicking the mouse buttons as in the polyline mode). The second end point is specified by releasing the mouse button.
In all drawing modes (other than the text mode), pressing the <ESC> key cancels the drawing (creation) of the current object.
Middle mouse button always generates the main tgif popup menu. Holding down the <Shift> key and clicking the right mouse button will change the drawing mode to select. Key presses with the <Control> or <Meta> key held down (referred to as non-alphanumeric key presses since they can also generate control characters) are treated as commands, and their bindings are summarized in the next section. Users can also define single key commands to emulate the functions of the nonalphanumeric key commands. The Shortcuts section will describe the details.
Clicking the left mouse button in the vertical/horizontal scrollbar causes the canvas window to scroll down/right by a small distance; clicking the right mouse button has the reverse effect. (The scrollbars in the popup windows for selecting file names and domain names behave similarly.) Clicking with the <Shift> key held down will scroll a window full. Clicking or dragging the middle button will cause the page to scroll to the location which corresponds to the gray area in the scrollbars. (Tgif insists that the left top corner of the Canvas Window is at a distance that is a nonnegative multiple of some internal units from the left top corner of the actual page.)
They track the mouse location. Mouse clicks and key presses have no effect. When the page reduction/magnification is set at 100%, the markings in the rulers correspond to centimeters when the metric grid system is used, and they correspond to inches when the English grid system is used. When the page reduction/magnification is not set at 100%, the markings do not correspond to the above mentioned units any more (this is considered as a known bug).
This window is right below the Message Window and to the left of the horizontal ruler. When the Tgif.IntrCheckInterval X default has a positive value, an interrupt icon is visible when the Canvas Window is being redrawn. If the user clicks on this window when the interrupt icon is visible, tgif aborts the repainting of the objects. If this is done when a file is being opened (either through Open() or Push()), the drawing of objects is stopped, but the reading of the file continues (reading of the file is not aborted).
If tgif is currently in the hyperspace mode (please see the Hyperspace section below for more details), a space ship icon will be displayed when the interrupt icon is not being displayed. Clicking any button in this window will switch tgif in and out of the hyperspace mode.
The Page Control Window is to the left of the horizontal scrollbar. This window is empty is the current page mode is set to the tijled page mode. If the current page mode is set to the stacked page mode, each page has a tab in tabs subwindow of this window. Clicking the left mouse button on a tab goes to the corresponding page. Clicking the middle mouse button brings up the Page Menu. When there are too many pages in a drawing so that one can not see the tabs for all the pages, one can use the icons to the left side of the Page Control Window to scroll the tabs subwindow. Clicking on the first icon scrolls the tabs subwindow such that the first tab is visible. Clicking on the 4th icon scrolls the tabs subwindow such that the last tab is visible. Clicking on the 2nd icon scrolls the tabs subwindow towards the first tab by one tab and clicking on the 3rd icon scrolls the tabs subwindow towards the last tab by one tab.
This window is below the horizontal scrollbar. It shows what action will be taken if a mouse button is depressed. When a menu is pulled down or poped up, this window shows what action will be taken if a menu item is selected. It also displays miscellaneous status information. Mouse clicks and key presses have no effect. If HideStatus() is selected from the Layout Menu, this window becomes invisible. If ShowStatus() is selected from the Layout Menu, this window becomes visible.
By default, when this window is displaying mouse button status, right-handed mouse is assumed. Setting the Tgif.ReverseMouseStatusButtons X default to true will reverse the status (as if a left-handed mouse is used).
When a menu is poped up by a mouse drag, the menu can be pinned if it is dragged far enough horizontally (the distance is determined by the setting of the Tgif.MainMenuPinDistance X default). Clicking the right mouse button in a pinned menu will cause it to disappear. Dragging the left mouse button in a pinned menu will reposition the menu. Clicking the middle mouse button in it will activate the item right below the mouse.
Most operations that can be performed in tgif can be activated through non-alphanumeric keys (some operations can only be activated through popup menus or shortcut keys). This section summarizes the operations that can be activated by a key stroke with the <Control> and/or the <Meta> key held down. ``^'' denotes the <Control> key and ``#'' denotes the <Meta> key in the following description. (The ``keys.obj'' file, distributed with tgif, also summarizes the same information, but it is organized differently. This file can be viewed with tgif, and if installed properly, it can be found in the same directory as the ``tgificon.obj'' file, mentioned in the Files section of this document.)
^a | select all |
^b | send selected objects to the back |
^c | change domain |
^d | duplicate selected objects |
^e | save/restore drawing mode |
^f | send selected objects to the front |
^g | group selected objects (the grouped object will be brought to the front) |
^i | instantiate a building-block object |
^k | pop back to (or return to) a higher level and close the symbol file (reverse of ^v) |
^l | align selected objects according to the current alignment settings |
^n | open a new un-named object file |
^o | open an object file to edit |
^p | print the current page (or export in XBM, XPM, GIF, HTML, EPS, or PS formats) |
^q | quit tgif |
^r | redraw the page |
^s | save the current object/symbol file |
^t | align selected objects to the grid according to the current alignment |
^u | ungroup selected objects |
^v | push into (or edit) the definition part of a buildingblock (icon) object |
^w | change the drawing mode to text |
^x | delete all selected objects |
^y | copy selected objects into the cut buffer |
^z | escape to driver |
^, | scroll left |
^. | scroll right |
^- | print the current page with a specified command |
#a | attach selected text objects to a selected non-text object as attributes |
#b | escape to driver |
#c | rotate selected objects counter-clockwise |
#d | decrement the grid size |
#e | send a token on a selected polyline |
#f | flash a selected polyline |
#g | show/un-show grid points |
#h | flip the selected objects horizontally |
#i | increment the grid size |
#j | hide the attribute names of the selected objects |
#k | change the drawing mode to select |
#l | distribute selected objects according to the current alignment |
#m | move/justify an attribute of a selected object |
#n | show all the attribute names of the selected objects |
#o | zoom out |
#p | import a .obj or a .sym file into the current file |
#q | change the drawing mode to polyline/open-spline |
#r | change the drawing mode to rectangle |
#s | escape to driver |
#t | detach all the attributes of the selected objects |
#u | undo |
#v | flip the selected objects vertically |
#w | rotate the selected objects clockwise |
#x | escape to driver |
#y | escape to driver |
#z | zoom in |
#9 | create a user-specified arc (12 o'clock position is 0 degree) |
#0 | update the selected objects according to current settings |
#, | scroll up |
#. | scroll down |
#- | show all the attributes of the selected objects |
#[ | align the left sides of objects |
#= | align the horizontal centers of objects |
#] | align the right sides of objects |
#{ | align the top sides of objects |
#+ | align the vertical centers of objects |
#} | align the bottom sides of objects |
#" | make the selected polygon regular (fit the original bounding box) |
#% | set the percent print reduction (if < 100%) or magnification (if > 100%) |
#: | go to default zoom |
#` | zoom out all the way so that the whole page is visible |
#~ | saved selected objects in a new file |
#; | cut and/or magnify a selected bitmap/pixmap object |
#_ | abut selected objects horizontally |
#| | abut selected objects vertically |
## | break up text objects into single character text objects |
#^ | scroll to the origin set by SaveOrigin() |
#@ | toggle between constrained and unconstrained move (stretch) modes |
#$ | change the drawing mode to select vertices |
#& | align selected objects to the paper according to the current alignment |
#* | redo |
#( | import an Encapsulated PostScript file |
#) | scale selected objects by specifying X and Y scaling factors |
#< | lock the selected objects (can't be moved, stretched, flipped, or rotated) |
#> | unlock the selected objects |
^#a | add points to the selected poly or spline |
^#b | change the text style to bold |
^#c | change to center justified text |
^#d | delete points from the selected poly or spline |
^#e | change the drawing mode to rounded-corner rectangles |
^#f | reverse-video the selected bitmap objects |
^#g | toggle snapping to the grid points |
^#h | hide all attributes of the selected objects |
^#i | make the selected object iconic |
^#j | make the selected icon object a grouped object |
^#k | select color or black-and-white output |
^#l | change to left justified text |
^#m | make the selected object symbolic |
^#n | make the selected symbol object a grouped object |
^#o | change the text style to roman |
^#p | change the text style to bold-italic |
^#q | change the drawing mode to polygon/closed-spline |
^#r | change to right justified text |
^#s | save the file under a new name |
^#t | change the text style to italic |
^#u | update iconic representations of selected objects |
^#v | change the drawing mode to oval |
^#w | toggle between poly and spline |
^#x | cycle among the various output file formats |
^#y | paste from the cut buffer |
^#z | change the drawing mode to arcs |
^#. | import an X11 bitmap file |
^#, | import an X11 pixmap file |
^#- | toggle between English and Metric grid systems |
^#= | repeat the last Find command |
The user can define single character shortcut keys to emulate the function of the non-alphanumeric key presses to activate commands. This is done through the use of the Tgif.ShortCuts X default. (Please note that these shortcut keys are only active when the drawing mode is not set to the text mode.) The Tgif.ShortCuts consists of a list of items, each of which specifies the bindings between a key (may be case sensitive) and a command. The items are separated by blanks, and each item is interpreted as follows. It consists of two parts, KEY and COMMAND, which are concatenated together with a ':' character. The format of the KEY part is one of :<Key>x, !<Key>x, or <Key>x (here the character 'x' is used as an example; furthermore, the substring <Key> must be spelled exactly the way it appears here). The first 2 formats are equivalent, they specify the lower case x; the 3rd format specifies both the characters 'x' and 'X'. The COMMAND part is a string that matches strings in tgif's popup menus (exceptions are noted below). This is illustrated by the following example. In the Edit menu, two of the entries are,
"Delete ^x" "SelectAll ^a"
which means that <Control>x activates and Delete() command, and <Control>a activates the SelectAll() command. Therefore, both Delete() and SelectAll() are valid names for the COMMAND part of a shortcut specification. To complete the example, the following line can be used to bind the lower case 'x' to Delete() and 'a' or 'A' to SelectAll():
Tgif.ShortCuts: !<Key>x:Delete() \n\ <Key>a:SelectAll()
For more examples, please see the sample X defaults file, tgif.Xdefaults, included in the tgif distribution.
Here is a list of exceptions where the COMMAND does not match a command name in a menu entry. The left entry is a proper COMMAND name, and the right is a list of strings that's shown in popup menus which the COMMAND would correspond to.
CyclePrintFormat() | Printer, LaTeXFig, RawPSFile, XBitmap, TextFile, EPSI, GIF/ISMAP |
ToggleBW/ColorPS() | BlkWhtPS, ColorPS |
ToggleGridSystem() | EnglishGrid, MetricGrid |
ToggleMapShown() | ShowBit/Pixmap, HideBit/Pixmap |
ToggleUseGrayScale() | UseGrayScale, NoGrayScale |
ToggleMoveMode() | ConstMove, UnConstMove |
ToggleShowMeasurement() | ShowMeasurement, HideMeasurement |
ToggleLineType() | (advances between different curved shapes) |
ScrollPageUp() | (scroll up a window full) |
ScrollPageDown() | (scroll down a window full) |
ScrollPageLeft() | (scroll left a window full) |
ScrollPageRight() | (scroll right a window full) |
FreeHandMode() | (change the drawing mode to freehand poly/open-spline) |
CenterAnEndPoint() | (move an endpoint of a polyline object to the center of another object) |
ToggleNamedAttrShown(<x>=) | (toggle name shown for the attribute <x>) |
ToggleSmoothHinge() | (convert smooth to hinge and hinge to smooth points) |
ToggleShowMenubar() | ShowMenubar, HideMenubar |
ToggleShowStatus() | ShowStatus, HideStatus |
ToggleOneMotionSelMove() | OneMotionSelMove, ClickSelClickMove |
ToggleHyperSpace() | GoHyperSpace, LeaveHyperSpace |
ImportOtherFileType(<x>) | (import using a filter named <x>) |
BrowseOtherType(<x>) | (browse using a filter named <x>) |
In addition to the above list, the following are also valid COMMAND names (having the obvious meaning): ScrollLeft(), ScrollRight(), ScrollUp(), ScrollDown(), SelectMode(), DrawText(), DrawBox(), DrawOval(), DrawPoly(), DrawPolygon(), DrawRCBox(), DrawArc(), and SelectVertexMode().
In most X environments, only 256 colors can be displayed at once. In these environment, if an application needs 128 colors and another application needs a totally different 129 colors, both applications can not be displayed at once with all the colors they want. X solves the problem by allowing applications to use their own colormaps (known as private colormaps). Each private colormap can have at most 256 colors. There is also a shared colormap available for applications that do not wish to use private colormaps. The main problem with using private colormaps is that a user will see the the well-known colormap flashing phenomenon when he/she switchs in and out of applications that use private colormaps.
Tgif uses the shared colormap initially. When it needs more color than what is available in the shared colormap, it will use a private colormap automatically. When tgif no longer needs the extra colors, it does not automatically revert to using the shared colormap because it needs to be able to undo operations that use the extra colors. If one does no longer needs the objects in the undo buffer, one can select FlushUndoBuffer() from the Edit Menu to flush the undo buffer. At this point, tgif will attempt to use the shared colormap to avoid the colormap flashing problem. If one often uses XPM and GIF objects, one can bind the <Shift>f key to the FlushUndoBuffer() operation by setting the following X default and uses the <Shift>f key to regain entries in the colormap when an XPM/GIF object is deleted:
Tgif.ShortCuts: !<Key>F:FlushUndoBuffer()
Even when a private colormap is used, only 256 colors can be used at once. Therefore, it is not possible to import two 256-colors GIF files into the same drawing unless the colors are somehow reduced to fit in the 256-colors colormap. This can be done through dithering which is described in the Import Raster Graphics section below.
The native raster graphics formats that tgif supports are the XBM and XPM formats. In order to import color raster graphics file of another format, tgif can work with external tools that can convert non-XPM format files to an XPM files. A popular raster format conversion toolkit is the pbmplus(1) (also known as the netpbm(1)) toolkit. It can convert a GIF file (e.g., "foo.gif") to an XPM file (e.g., "foo.xpm") with the following command (giftopnm is in netpbm; an earlier version of it called giftoppm exists in pbmplus):
giftopnm foo.gif | ppmtoxpm > foo.xpm
When working with tgif, a GIF file name will be supplied by tgif and the output of ppmtoxpm will be directly read by tgif through a pipe; therefore, the previous sequence is replaced by an X default containing the following form (which happens to be the default setting for the Tgif.GifToXpm X default):
giftopnm %s | ppmtoxpm
The "%s" is to be replaced by a GIF file name. The above is referred to as a filter.
To be able to import other types of raster graphics files, one can use Tgif.MaxImportFilters and Tgif.ImportFilter# X resources to specify additional filters. The following example adds a JPEG filter:
Tgif.MaxImportFilters: 1 Tgif.ImportFilter0: \n\ JPEG-222 jpg;jpeg \n\ djpeg -gif -colors 222 %s | \n\ giftopnm | ppmtoxpm
The "JPEG-222" above is the name given to the filter (must not contain any space character). The "jpg;jpeg" are possible file extensions separated by semicolons. The rest is the filter specification. The djpeg(1) program is part of the libjpeg distribution. It can convert a JPEG file to a GIF file. The above filter also restrict the output to have a maximum of 222 colors. (The 222 is chosen arbitrarily. Many XPM files use some ``standard'' 32 colors, so one may want to leave room form them.)
To invoke a filter, one can select ImportOtherFile() or BrowseOther() commands from the File Menu. This will bring up a dialogbox listing the available filters by their names (e.g., "JPEG-222"). After selecting a filter, tgif continues in a similar manner as with invoking ImportXPixmap() or BrowseXPixmap() commands from the File Menu.
The above example is not suitable for the BrowseOther() command because only 256 colors can be used in a drawing (as explained in the Colors and Colormaps section above). In order for BrowseOther() to work well, one can use dithering to represent an image with a dithered image that only uses a set of standard colors. The example below uses ppmdither from the pbmplus/netpbm toolkit:
Tgif.MaxImportFilters: 2 Tgif.ImportFilter0: \n\ JPEG-222 jpg;jpeg \n\ djpeg -gif -colors 222 %s | \n\ giftopnm | ppmtoxpm Tgif.ImportFilter1: \n\ JPEG-dithered jpg;jpeg \n\ djpeg -gif %s | \n\ giftopnm | ppmdither | ppmtoxpm
If one is working with one JPEG image, one can select ImportOtherFile() then select "JPEG-222" to get as many as 222 colors. If one is browsing for JPEG images, one can select BrowseOther() then select "JPEG-dithered".
If an object contains an attribute (please see the Attributes sections below for details) whose name is the string "name" (case-sensitive), the value part of the attribute is the name of the object. Subobject of a composite object can be named using a path, e.g., <t>!<s1>!<s2>!..., where <t> is the name of a top-level object which directly contains <s1> which directly contains <s2>, etc.
The following is not fully supported, yet (only the #<page> form is supported at this time). Every object in a tgif file can be uniquely named using the notation #<page>!<path>, where <page> can be a string that specifies the name of a page or #<number> which specifies a page number. The <path> is described in the previous paragraph. If an object o1 is referenced by another object o2 within the same file (no file name or URL is specified before #) and <page> is omitted, then o1 must be on the same page as o2. If a file name or URL is specified before # and <page> is omitted, then o1 must be on the first page.
Attributes are text strings of the form name=value or value which are attached to either the current drawing or any non-text objects. An attribute attached to the current drawing is called a file attribute; otherwise, it is a regu- lar attribute. Attributes can be attached and detached from these objects except in the following case:
Attributes appearing in the symbol object in a building-block object file can not be detached when the building-block object is instantiated. These attributes are considered to be the ``inherited'' attributes of the icon object. (If it is really necessary to detach inherited attributes of an icon object, the icon object can be ``de-iconified'' by using UnMakeIconic() in the Special Menu to make it a grouped object; then the attributes can be detached.)
A file attribute is always invisible. For a regular attribute, the user has control over which part of the attribute is displayed. An entire attribute can be made invisible, or only its name can be made invisible (accomplished through the commands under the special menu, such as #m, #n, #j, #-, and ^#h).
Tgif provides the mechanism to travel between .obj and .sym files. If the middle mouse button is clicked on an object with the <Shift> key held down, tgif looks for an attribute named warp_to (by default) or href of that object. The only difference between warp_to and href is that ".obj" is automatically appended to the value of a warp_to attribute while the value of a href attribute is taken as is. (Please note that warp_to is obsolete now. It is still supported for the sake of compatibility.) If such an attribute is found, the value part of the attribute is interpreted as the name of a .obj file to travel to. (If tgif is in the hyper- space mode, then clicking the left mouse button has the same effect.) If there are multiple href attributes on the object, but are in different colors, tgif will use the one that has the same color as the current color appearing in the Choice Window. If the current file is modified, the user is prompted to save the file before traveling to the next file. If the value part of the href attribute starts with the '/' character, the value is treated as an absolute file name; otherwise, it is treated as a relative file name.
Tgif provides a hyperspace mode to facilitate traveling between .obj files. The hyperspace mode is entered when GoHyperSpace() is selected from the Navigate Menu. In hyperspace mode, the little window below the Message Window will show a little space ship. The hyperspace mode is also automatically entered when a remote URL is opened (unless the Tgif.AutoHyperSpaceOnRemote X default is set to false).
In the hyperspace mode, certain objects are considered hotlinks. When the cursor is placed on top of these object, it will change from a pointer to a hand to indicate that clicking on the left mouse button will invoke some actions. An object is a hot-link if it contains an attribute described in either the Teleport/Hyperjump, Launch Applications, or Internal Commands section.
The hyperspace mode is exited when the drawing mode is changed or the LeaveHyperSpace() is selected from the Navigate Menu.
Tgif provides the mechanism to launch applications. If the middle mouse button is clicked on an object with the <Shift> key held down, tgif looks for an attribute named launch (by default) of that object. If such an attribute is found, the value part of the attribute is interpreted as a sh(1) command to execute. Same color rule applies as described in the Teleport/Hyperjump section above. If the command ends with the '&' character, tgif forks itself (what actual happens depends on whether the _BACKGROUND_DONT_FORK compiler flag is defined or not at compile time) and the command is executed by the child process; otherwise, popen() is used to execute the command (in this case, if the command hangs, there is no way provided to terminate the command, and tgif will not be able to recover from it). Within the command, values of other attributes of the same object can be used. The syntax is: $(attr), where attr is the name of another attribute.
For example, if one wants to perform a man(1) function, one can draw a box; enter a line of text "title=tgif"; enter another line of text "launch=xterm -rw -e man $(title)"; select all three objects using ^a keyboard command; attach the text strings to the box using #a keyboard command; and launch the man(1) command by clicking the middle mouse button on the box (or the text strings) withe the <Shift> key held down. If one wants to be more fancy, the box can be replaced by an X11 pixmap object; the 'launch' attribute can be made invisible; and the 'title' attribute can be center justified and with its name hidden using the #m keyboard command.
By default, launching of an application is by default disabled in the hyperspace mode for security considerations (this can be overridden by the Tgif.AllowLaunchInHyperSpace X default setting). If a lunch command is encountered in the hyperspace mode, the command is displayed and the user is prompted to see if he/she wants to execute the command.
Tgif provides the mechanism to execute internal commands. If the middle mouse button is clicked on an object with the <Shift> key held down, tgif looks for an attribute named exec (by default) of that object. If such an attribute is found, the value part of the attribute is interpreted as a list of internal commands (separated by semicolor) to execute. Same color rule applies as described in the Teleport/Hyperjump section above. A command usually takes the form:
<cmd_name> ( <arg1>, <arg2>, ..., <argN> )
An argument of a command can be a string argument or a numeric argument. A string argument must be enclosed in double-quotes. A numeric argument can be a numerical value or a string of the form "$(x)", where x is the name of another attribute (this form is referred as the substitution form). A string argument can also contain substitution form. Please note that only one-level substitution are performed (the collection of internal commands should be viewed as a simple scripting language and not a declaration language).
When an attribute is referenced in an internal command, the attribute name can be in the form, <obj_name>.<string>, where <obj_name> must be in the form specified in the Object Names section above and <string> contains only alphanumeric characters and the underscore ('_') character.
The following internal commands are supported:
attr_list=last_name,first_name last_name=Cheng first_name=Bill final_url= exec=make_cgi_query(final_url, http://bourbon.cs.ucla.edu:8001/cgi-bin/testcgi, attr_list)
Executing this object will construct the following string in final_url:
http://bourbon:8001/cgi-bin/testcgi?last_name=Cheng&first_name=Bill
An subsequent hyperjump(final_url) command can be invoked to execute the corresponding "test-cgi" CGI server script with the last_name and first_name arguments.
For a detailed description of CGI scripts, the reader is referred to [2].
url=http://bourbon.cs.ucla.edu:8001/cgi-bin/echopost query=Hello World! result= exec=post_attr_and_get_cgi_result(url,query,result)
Executing this object will post "Hello World!" to the specified CGI script. In this case, the result of executing the script just echoes "Hello World!" back (along with some other bookkeeping information).
assign(<attr_name>,<min_val>); while($(<attr_name>) <= <max_val>,loop)
where loop has the following value:
exec(<cmd_attr_name>); inc(<attr_name>,<increment>)
Please note that <min_val>, <max_val>, and <increment> are only evaluated once prior the execution of this command.
Certain internal commands allow arithmetic expressions as arguments. Infix notation is used. Supported operators (and their precedences) are listed below.
? | 1 | if-then-else, e.g. <rel> ? <iftrue> : <else> |
: | 2 | if-then-else, e.g. <rel> ? <iftrue> : <else> |
|| | 3 | logical OR |
&& | 4 | logical AND |
| | 5 | bit-wise OR |
^ | 5 | bit-wise XOR |
& | 5 | bit-wise AND |
== | 6 | equal |
!= | 6 | not-equal |
> | 7 | greater than |
< | 7 | less than |
>= | 7 | greater than or equal to |
<= | 7 | less than or equal to |
<< | 8 | shift left |
>> | 8 | shift right |
+ | 9 | add |
- | 9 | subtract |
* | 10 | multiple |
/ | 10 | divide |
// | 10 | integer divide |
% | 10 | mod |
! | 11 | logical NOT |
~ | 11 | bit-wise invert/NOT |
) | 12 | closed parenthesis |
( | 13 | open parenthesis |
This section describes how to generate NCSA imagemap and CERN clickable image files. The Tgif.ImageMapFileFormat X default decides whether to generate a NCSA imagemap or a CERN clickable image file. Since the two formats are very similar, we will only discuss how to generate NCSA imagemap files. For more information about NCSA imagemap, please see [3]. For more information about CERN clickable image, please see [4].
The Tgif.GenerateImageMap X default should be set to ``true'' to enable the imagemap generation. When printing in the GIF format (see the Basic Functionalities section about printing), an XPM file (which will be removed at the end of this process) is generated first. (The value specified by the Tgif.InitExportPixelTrim X default is used to trim extra pixels. Using these values forms an escape mechanism to fix an idiosyncrasy that tgif can not figure out exactly how big the whole image is.)
The XPM version is specified by the Tgif.XPmOutputVersion X default unless the Tgif.UseXPmVersion1ForImageMap X default is set to ``true'', which forces the XPM1 format. Then the command specified by the Tgif.XpmToGif X default is executed to convert the XPM file into a GIF (Generic Interchange Format) file which can be used by software such as NCSA's Mosaic(1). The file extension for the GIF file is specified by the Tgif.GifFileExtension X default. Together with the GIF file, an imagemap file with file extension specified by the Tgif.ImageMapFileExtension X default is generated. The content of the imagemap is generated as follows.
Tgif first looks for a file attribute with attribute name href. The value of the attribute is written as the default URL. If such a file attribute can not be found, imagemap generation is aborted. If it is found, then all objects in the file are scanned. For an object having an attribute named href, the value of the attribute is written as the URL for a method line in the imagemap. If the object is neither a circle nor a poly/polygon, the rectangle method is used.
Some Microsoft Windows (TM) applications do not understand standard PostScript %%BeginPreview, %%EndImage, and %%EndPreview comments. This section describes how to generate an EPSI file which is understood by them. If the Tgif.TiffEPSI X default is set to ``true'' and one prints in the EPSI format, this feature will be invoked. In this case, the generated EPSI file will contain 30 bytes of binary information in the beginning of the file and a TIFF image (also binary) at the end of the file. This file also will not contain the %%BeginPreview, %%EndImage, and %%EndPreview comments. A file in this format is normally not considered to be a PostScript file except under Windows.
When this feature is enabled, tgif generates a normal EPSI file first, then dump the current content of the file into an X11 bitmap file. The command specified in Tgif.XbmToTiff is executed to generate a TIFF image which is then append at the end of the EPSI file.
Objects can be locked and unlocked using #< and #> keyboard commands. When a selected object is locked, it is shown with gray handles. A locked object can be moved, stretched, flipped, or rotated; however, its properties, such as fill pattern, width, etc., can be changed. Locked objects can also be deleted. When a locked object is grouped with other objects, the resulting grouped object is also locked. A locked object can be used as an anchor to align other objects; however, DistributeObjs() command will fail if any objects are locked. Locked objects do not participate in any operations in the select vertex mode.
Most operations can be undone and redone. The Tgif.HistoryDepth X default controls the size of the undo buffer. If it is set to -1, then the undo buffer's size is infinite. The undo buffer is flushed when the New() or Open() commands are executed (from the File Menu), when the FlushUndoBuffer() command is executed from the Edit Menu, or when Pop() is executed from a .sym file. If a private colormap is used (automatically done when new colors can not be allocated from the default colormap), executing FlushUndoBuffer() will attempt to reset the colormap (if the -DDONT_FREE_COLORMAP compile option is not used).
A domain is a collection of library symbols suitable for instantiations. A library is implemented as a directory of .sym files, and therefore, a domain is implemented as a search path. If there are symbols with the same file name which reside in different directories specified in the search path, then the one closer to the front of the search path will be made available for the user to instantiate.
The number of domains is specified by the MaxDomains X default, and the names of the domains are specified by the DomainPath# X default. The library search paths are specified by csh environment variables. See the section on X Defaults for more details.
When selecting a file name, a symbol name, or a domain name, tgif pops up a window with appropriate names for the user to choose from. The user can use mouse clicks to select an entry. Key strokes can also be used to specify the desired name; however, tgif attempts to match the key strokes with names in the selection on the fly. If a match can not be found, the key strokes are ignored. ^n, ^j, or the DownArrow key advances the selection down by 1 entry; ^p, ^k, or the UpArrow key advances the selection up by 1 entry. ^f, ^d, or the DownArrow key with <Control> key held down advances the selection down by 10 entries; ^b, ^u, or the UpArrow key with <Control> key held down advances the selection up by 10 entries. '$' will select the last entry, while '^' will select the first entry. ^w or ^y un-select the selected entry. If the selected entry is a directory, hitting <CR> will change directory; if not, hitting <CR> finishes the selection process and the selected entry is returned.
In selecting file names to open or import, typing '/' is interpreted as going to the root directory or specifying an URL. At this point, the automatic matching of key strokes is temporarily disabled until either a <TAB> or a <CR> is pressed. Also, clicking the middle mouse button in the file name area pastes from the clipboard.
The automatic appending of index.obj or .obj (introduced in version 2.16) is obsoleted and an URL is never modified.
The current selection is displayed near the top of the popup window. Back-space should be used with caution because it might change the current directory to the parent directory.
Encapsulated PostScript (EPS) files can be imported using the #( keyboard command. If the EPS file has a preview bitmap (can be generated using the pstoepsi tool), tgif will display it (HideBit/Pixmap() from the Layout Menu can be used to disable the displaying of bitmap/pixmaps). When the EPS object is saved in a .obj or .sym file, neither the preview bitmap, nor the PostScript content of the EPS file is saved. Therefore, when printing such a file (either from tgif or using prtgif), the EPS file must be present at the same place from which it was originally imported.
In addition to the Times, Courier, Helvetica, NewCentury, and Symbol fonts, additional fonts can be specified using the Tgif.AdditionalFonts X default. (The default screen fonts can also be replaced, please see Tgif.HasAlternateDefaultFonts in the X Defaults section for more details.) Each additional font requires 4 parts, one for each font style (in the order of Roman, Bold, Italic, and BoldItalic). Each part contains 3 strings. The first string specifies the family, weight, slant, and width of the font (please see the man pages for xfontsel(1) for more details; also there is a second form which is described below). The second string specifies the registry and encoding of the font (see xfontsel(1) again). (One can use xlsfonts(1) to see what fonts are available and pick out the just mentioned two strings from the output.) The third string specifies the PostScript font name.
For example, if one wants to use the X Lucida font to represent the PostScript ZapfChancery-MediumItalic font, one can set Tgif.AdditionalFonts as follows:
Tgif.AdditionalFonts: \n\ lucida-medium-r-normal \n\ iso8859-1 \n\ ZapfChancery-MediumItalic \n\ \n\ lucida-demibold-r-normal \n\ iso8859-1 \n\ ZapfChancery-MediumItalic \n\ \n\ lucida-medium-i-normal \n\ iso8859-1 \n\ ZapfChancery-MediumItalic \n\ \n\ lucida-demibold-i-normal \n\ iso8859-1 \n\ ZapfChancery-MediumItalic
The above maps all four font styles of the Lucida font to the ZapfChancery-MediumItalic font (similar to how Symbol font is handled).
The first string can also be specified in a second form which is identified by having "%d" as part of the string. For example, one can use "lucidasans-%d" as the first string. In this case, the actual X font used will be the specified string with "%d" replaced by the font size. The encoding string (second string) is ignored (but must be present). The font name prefix (please see Tgif.FontNamePrefix entry in the X Defaults section) is also ignored.
An object file can contain multiple pages. Two layout modes, stacked and tiled, for a multipage drawing are supported. In stacked layout mode, pages are considered to be stacked on top of each other, and therefore, an object can only appear on one page. In tiled layout mode, pages are tiled to form a large logical page; in this case, an object can exist on several physical pages simultaneously. Swiching between the two modes are considered rare events and can not be undone. Tgif does not allow switching from the tiled layout mode to the stacked mode when there exists an object that spans physical page boundaries because it can not decide which physical page the object belongs.
Page numbers are supported through the use of page numbering objects. A page number objecting is an object that contains an attribute whose name is !PAGE_NUM (the name is casesensitive) and the name part of that attribute is not shown (hiding an attribute name can be achieved by using the Move/JustifyAttr() command under the Special Menu). The value of the attribute determines how the page number is printed. If the value of the attribute contains a !(STACKED_PAGE_NUM) substring, that part of the substring will be replaced by the page number if the page layout mode is stacked. If the page layout mode is tiled, the string will be printed out as is. If the value of the attribute contains a !(STACKED_NUM_PAGES) substring, that part of the substring will be replaced by the number of pages if the page layout mode is stacked. If the value of the attribute contains a !(TILED_PAGE_ROW) or !(TILED_PAGE_COL) substring, that part of the substring will be replaced by the row number or the column number of the physical page if the page layout mode is tiled.
There are a few special attributes that tgif recognized. There are described in this section. They are all casesensitive.
When the ExportToTable() command is selected from the Special Menu, certain attributes of selected objects are written into a user-specified output file in a format which can be easily imported by a spreadsheet program or to be used by the MergeWithTable() command described in the next section. An output file contains columns of strings. Two columns are separated by a single <TAB> character. The first row of a output file contains the column names and all other rows contain values.
The names of the attributes to be written are specified by the file attribute named TABLE_ATTRS (which is denoted by !.TABLE_ATTRS here). The value of the TABLE_ATTRS file attribute is a list of comma-separated attribute names. When ExportToTable() command is executed, the attribute names specified by !.TABLE_ATTRS are written to the output file first. Then, for each selected object, every one of its attribute which appears in the list specified by !.TABLE_ATTRS are written to the output file in one line. If an object has no attributes that match the specification, no corresponding line is generated.
When the MergeWithTable() command is selected from the Special Menu, a selected object is merged (also known as mailmerged on PCs) with a table (data) file (in the same format as the output file described in the previous section) to generate a new multipage drawing having the stacked page layout mode.
The selected object contains formating informat, and it is also used as a template to be replicated for each data row in the table file. If an attribute of the replica matches the column name of the table, the attribute value is set to the value in the table file. The replicas are tiled horizontally first.
Eight attributes must be specified in the template object. They are all case-sensitive. The ones that measure distances can be specified in inches ("in"), centi-meters ("cm"), or pixels (if no units are specified).
After each replica is generated, filled with the data from the table file, and placed, its attribute named exec is executed (unless an attribute named EXEC_AFTER_MERGE is specified, in which case, the attribute named by the EXEC_AFTER_MERGE attribute is executed instead). If there is no attribute named by the EXEC_AFTER_MERGE attribute, nothing is executed. (Please see the Internal Commands section for details on command execution.) One can use the exec command to construct other attributes from the attributes associated with the data table. If an attribute whose name is empty and whose value is the string USER_PLACEMENT, the user will be asked to place the replica (object name will be displayed in the Status Window when the object is being placed). In this case, the 8 placement related attributes are ignored.
If an attribute whose name is empty and whose value is the string STRIP_DOUBLE_QUOTES, data fields surrounded by double-quotes are stripped.
When an URL names an HTTP server, the HTTP server sends the Content-type of the URL along with the remote file referenced by the URL to tgif. The Content-type contains information such as the type/subtype of the file plus some optional fields. If the file is not a tgif file, the following mechanism is used to view the file.
First, the X defaults are looked up to see if there is an external viewer specified for the file. Please see Tgif.@@@Viewer in the X Defaults section below for details. If there's no match, the type/subtype is matched against entries in the MIME-types file. The default MIME-types file is .mime.types in user's home directory. Please see Tgif.MimeTypesFile in the X Defaults section on how to override the default MIME-types file. The first field in each line of the MIME-types file specifies type/subtype information. If there is a type/subtype match in the MIME-types files, the MailCap files are consulted as follows.
A line in a MailCap file consists of fields separated by semi-colons. The first field specifies the type/subtype and the second field specifies a view command for viewing a file that matches the type/subtype. For tgif, the view command must contains a single %s substring to be replaced by local copy of the URL. Only the %t and the %{} optional fields are supported by tgif. The multipart MIME-type is not supported. The type/subtype information of the remote file is matches against the MailCap files. If a match is found, the corresponding view command is executed. If no match is found, but the type of the remote file is either applica- tion, audio, image, or video, the file is saved and no external viewer is launched. Otherwise, the remote file is assumed to be pure text and tgif will create a text object to view the text.
The MailCap files are the (colon-separated) files specified by the MAILCAP environment variable (if defined). If MAILCAP is not defined, the .mailcap file in the user's home directory is used.
MIME is the Multipurpose Internet Mail Extensions specified in RFC1521, and MAILCAP is specified in RFC1524.
Here are the steps for defining a building-block object, to be used in a hierarchical design.
Tgif can only import X11 pixmaps that satisfy the constraints described here. The format of the X11 pixmap must be either 1 (XPM1) or 3 (XPM3). Only a subset of the XPM3 format is supported, namely, the key field for the color specification must be 'c' (for color visuals). Tools that generate XPM1 format files are (they might have been upgraded to support XPM3), pbmplus (or netpbm), which is a set of bitmap and pixmap conversion freeware (together with xv, the colors for pixmap objects can be manipulated), and xgrabsc, another freeware; also, xloadimage can display XPM1 files. Tools that can generate XPM3 format files are, for example, xsnap(1) and sxpm(1). For each color specified in the color string, a color cell is allocated. If the allocation fails, the current color will be used for that color string. If the first color character is a back-quote (`) or a space, then the corresponding color is substituted with the background color of the tgif window if the Tgif.GuessXPmBgColor X default is set to ``true''. (This design choice is made because the pixmap will then look ``right'' on both regular and reverse video.) The following is an example of a very small pixmap file (in XPM1 format).
#define arrow_format 1 #define arrow_width 5 #define arrow_height 3 #define arrow_ncolors 3 #define arrow_chars_per_pixel 1 static char *arrow_colors[] = { "`", "Black", "a", "red", "b", "yellow" }; static char *arrow_pixels[] = { "`a```", "aabbb", "`a```" };
Here we show how to make a figure for a LaTeX file, first with the \psfig (or \epsf) special construct, then with the psfile special construct. (The author does not recommend the psfile construct.) An example of both can be found in ``example.tex'' which is included with the tgif distribution.
To print a tgif file to be included in a LaTeX document with the \psfig or \epsf special construct (files generated will be in the Encapsulated PostScript format), first select LaTeX format in the panel window (click the left mouse button on the laser printer icon), then type ^p to generate the Encapsulated PostScript file. If the file name is ``an-srflip-flop.obj'', then the LaTeX figure file generated will be named ``an-sr-flip-flop.eps''. This file can be included in a LaTeX document as follows,
\input{psfig} \begin{figure*}[htb] \centerline{\psfig{figure=an-sr-flip-flop.eps}} \caption{An SR flip-flop. \label{fig:an-sr-flip-flop}} \end{figure*}
An alternative way is to use the \epsf construct as follows,
\input{epsf} \begin{figure*}[htb] \centerline{\epsffile{an-sr-flip-flop.eps}} \caption{An SR flip-flop. \label{fig:an-sr-flip-flop}} \end{figure*}
The \centerline command above centers the picture. If one has multiple tgif figures in one's LaTeX document, one only have to include the psfig macro (\input{psfig} or \input{epsf}) once, right after the \begin{document} statement.
If Encapsulated PostScript is not available, the psfile special construct can be used as described here. In this case, since LaTeX doesn't not know where the bounding box of the drawing is, it takes some practice to get this just right. Here is something that seems to work. First, center the picture on the page (e.g., the width of a portrait style page is 8.5 inch, so the center of the page is at the 4.25 inch mark), and make the top object in the picture about 1/4 inch away from the top of the page. Select the LaTeX format in the panel window, then print in the LaTeX format. As with the psfig construct, a file with the .eps extension will be generated. This file can be included in a LaTeX document as follows,
\begin{figure*}[htb] \special{psfile="an-sr-flip-flop.eps" hoffset=-40} \rule{0in}{1.1in} \caption{An SR flip-flop. \label{fig:an-sr-flip-flop}} \end{figure*}
The \rule{0in}{1.1in} above specifies an invisible box of 1.1 inches high, which is the total height of the picture in an-sr-flip-flop.
Times-Roman Times-Bold Times-Italic Times-BoldItalic Courier-Roman Courier-Bold Courier-Oblique Courier-BoldOblique Helvetica-Roman Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique NewCenturySchlbk-Roman NewCenturySchlbk-Bold NewCenturySchlbk-Italic NewCenturySchlbk-BoldItalic Symbol
The corresponding value of the X default must contain "%d" as part of the string, and the "%d" string will be replaced by the font size when the font is requested. For example, The following lines will use the Times New Roman screen font instead of the Times screen font, if Tgif.HasAlternateDefaultFonts is ``true'':
Tgif.Times-Roman: *-times new roman-medium-r-*--%d-* Tgif.Times-Bold: *-times new roman-bold-r-*--%d-* Tgif.Times-Italic: *-times new roman-medium-i-*--%d-* Tgif.Times-BoldItalic: *-times new roman-bold-i-*--%d-*
Please note that certain X servers require the righthand-side font specifications to have all the dashes in place.
DEFAULT:/tmp/tgif/symbols:.
cat /somewhere/sansfex.pfa %s | lpr -Pmyprinter
userdict /STRING known { STRING } if
This option should only be used if one is very familiar with PostScript. (Setting STRING to "tgif-bop-hook" is recommanded since it would not have a name conflict with existing software, such as dvips(1).)
userdict /STRING known { STRING } if
This option should only be used if one is very familiar with PostScript. (Setting STRING to "tgif-eop-hook" is recommanded since it would not have a name conflict with existing software, such as dvips(1).)
Tgif.gzViewer: NONE
STRING can also contain the string %S (S is capitalized), this indicates that %S is to be replaced by the URL. For example, if one wishes to view .html files using xmosaic, one can use:
Tgif.htmlViewer: xmosaic %S
Another form of STRING contains the string %s (S is lower-case), this indicates that the remote file is to be retrieved into a user specified directory and view by a tool. For example, if one wishes to view .gif files using xv, one can use:
Tgif.gifViewer: xv %s
Please note that this mechanism has precedence over the mechanism described in the MIME Types and Mailcaps section above.
%%DocumentPaperSizes: a4
The default is false.
$tgifPATH/tgificon.obj contains the default tgif icon. $tgifPATH/keys.obj contains a summary of the nonalphanumeric key bindings.
In the tgif distribution, there are three Prolog files which illustrate a simple Prolog driver. tgif.pl contains predicates for parsing tgif files (both .obj and .sym). frontend.pl contains predicates for talking to Prolog engines, such as that of Quintus and SISCtus, through the foreign function interface. To use frontend.pl, frontend11.o needs to be built (which requires the frontend11.o entry to be uncommented from the makefiles). Finally, testdrive.pl contains a program which will print out the ID files of all objects in the current drawing, if tgif is escaped with the Solve() (or #s) command. This is also a good way of finding out the structure of a tgif file (especially because the structure is not documented due to the complexity introduced to keep tgif compatible with files created by older versions). A very simple C driver, testdrive.c, is also provided with the tgif distribution which perform the same function as the Prolog driver. The extra code present in this file (and not present in tgif.c) is used to illustrate how the in-memory objects and attributes can be traversed.
latex(1L), lpr(1), env(1), X(1), dvips(1), csh(1), pbmplus(1), netpbm(1), djpeg(1), bitmap(1), XPM(1), xfontsel(1), xlsfonts(1), xgrabsc(1), xloadimage(1), xsnap(1), sxpm(1), xv(1), pstoepsi(1), Mosaic(1), bggen(1), rand(3C)
When any of the ``escape to driver'' commands are (accidentally) executed, the current content of the drawing is saved into ``tmpmodel.obj'' if the drawing indicates that it is a .obj file; then tgif escapes to the driver and returns right away. If the drawing indicates that it is a .sym file, then the content is saved into ``tmpmodel.sym'', but tgif does not return to the driver.
The paste operation works on a cut buffer generated by tgif or by non-tgif tools (such as xterm). If the cut buffer is not generated by tgif, its content is treated as a collection of ASCII character strings, which is inserted into the current drawing as a text object (current settings for text objects are used to create the text object). If the cut buffer is generated by tgif, then all the current settings are ignored.
The font sizes are the screen font sizes (which correspond to the X fonts that are used to draw the text on the screen). They appear smaller on the printout. When a 24 point text is printed, it would correspond to about a 13.5 point PostScript text. This is because tgif treats 128 pixels as an inch, and PostScript treats 72 points as an inch.
Because characters supported by X11 and PostScript are different, not all the characters, especially in the range 128 to 255 (or \200 to \377), which are supported by X11, but are not accepted by tgif. Furthermore, in order to print the supported subset or these characters, character codes must be re-encoded. Therefore, if one would like to hack tgif to support other personalized fonts, one should be careful about the re-encoding mechanism. The grids are not absolute; they are specified as screen pixels, and they scale with the current zoom. For example, if the grid is set at 16 pixels at maximum zoom, and if the user zooms out once, objects can be drawn, moved, or stretched at 16 screen pixel increments, but this corresponds to 32 pixels in the real coordinate system.
If the vertical text spacing is set to negative values, highlighted text will look a little strange due to XOR operations. If the vertical text spacing is set to be greater than 100 or less than -100, the panel window will not be cleared properly; to clear the panel window, the user may have to close the tgif window and then open it again.
As described in the tgif Subwindows section, in constrained move mode, if both endpoints of a not-selected polyline lie inside the object being moved, then the whole polyline is moved. This may look strange sometimes because, for example, if one starts with a line segment pointing to an object, just moving the object will caused the line segment to be ``stretched''; however, if one eventually moves the object so that the other endpoint is also inside the object, any future movement of the object will cause the whole line segment to move (instead of just moving the original endpoint). The moving of the vertex which is the neighbor of a moved endpoint may also look strange at times. At this point, one should switch to the unconstrained move mode.
Another idiosyncrasy with respect to the constrained move is that right after duplicating an object, the constrained move is disabled temporarily because it is assumed that at this point the user would want to move the new object to a desirable position, and only after this new object is ``settled down'', the constrained move will be re-enabled. Settling down is signified by doing something other than moving the new object.
Locked objects can be deleted.
Under the Edit Menu, PasteFromFile() reads a file into the drawing. Pasting from a file is different from the normal pasting operation where copying is performed in something like xterm because tabs are automatically converted to spaces. Tabs are ignored when pasting from a file.
When printing a multipage drawing, all pages (even the ones that contains no objects) will be printed. Using the PrintOnePage() command under the Page Menu one can print the selected page (in stacked page layout mode, this is the current page; in tiled page layout mode, the user is prompted to select a visible page).
Since tgif is using its own icon window, it may confuse certain window managers. If the effect is undesirable, one can set both the Tgif.NoTgifIcon and the Tgif.UseWMIconPixmap X defaults to true.
There seems to be a problem with printing Courier fonts with a non-solid pen on the Apple LaserWriter. (Printing single character does seem to work fine.) As pointed out by the PostScript reference manual, Courier is a ``stroked font'', and it is usually ``difficult'' to construct character paths for such types of fonts. However, Courier fonts work fine with ghostscript and dxpsview. It's not clear how this problem can be fixed. The author recommends avoiding Courier fonts when printing in color if a non-solid pen is desired.
Arcs with arrow tips don't look very sharp (the tip is not pointed as in open-splines with arrow tips).
At high magnifications, stretching arcs may cause anomalous behavior due to round off errors.
When page reduction/magnification is not set at 100%, the markings in the Ruler Windows do not correspond to real measurements. behavior due to round off errors.
Copying/pasting large objects might not work because tgif does not use the ``selection'' mechanism (yet).
If and when tgif crashes, it will try to save the current content of the drawing in a file called ``EmergencySave.obj'' (or ``EmergencySave.sym'' if the current drawing specifies a symbol object). Often, the drawing can be restored by loading the ``EmergencySave.obj'' file. Nevertheless, if the cause of the crash is that some objects are corrupted (due to programming bugs), then the ``EmergencySave.obj'' file may also be corrupted.
When launching an application, if the command does not end with the '&' character and the command does not terminate, tgif also hangs. In this case, kill(1) should be used to send HUP signal to the tgif process if one wants to save the content of tgif in ``EmergencySave.obj''.
The file exec.c may not compile properly on AIX machines. One might have to add -D_BSD to the DEFINES in either the Imakefile or Makefile.noimake.
William Cheng ("Author") grants to the party hereby receiving "tgif" ("Recipient") a non-exclusive, royalty-free license limited to copy, display, and distribute without charging for a fee, and produce derivative works of "tgif", provided that the above copyright notice appears in all copies made of "tgif" and both the copyright notice and this license appear in supporting documentation, and that the name of Author not be used in advertising or publicity pertaining to "tgif". All other rights (including, but not limited to, the right to sell "tgif", the right to sell derivative works of "tgif", and the right to distribute "tgif" for a fee) are reserved by the Author.
"Tgif" is provided "as is" without express or implied warranty. Author does not and cannot warrant the performance of "tgif" or the results that may be obtained by its use or its fitness for any specific use by Recipient or any third party. In no event shall Author become liable to Recipient or any other party, for any loss or damages, consequential or otherwise, including but not limited to time, money, or goodwill, arising from use or possession, authorized or not, of "tgif" by Recipient or any other party. PostScript is a trademark of Adobe Systems Incorporated.
The current status of tgif can be obtained from tgif's World-Wide-Web home page at http://bourbon.cs.ucla.edu:8001/tgif/.
William Chia-Wei Cheng, (email: william@cs.UCLA.edu, homepage: http://bourbon.cs.ucla.edu:8001/william/)