*print.txt*     For Vim version 7.2.  Last change: 2008 Apr 30


		  VIM REFERENCE MANUAL    by Bram Moolenaar


Printing						*printing*

1. Introduction				|print-intro|
2. Print options			|print-options|
3. PostScript Printing			|postscript-printing|
4. PostScript Printing Encoding		|postscript-print-encoding|
5. PostScript CJK Printing		|postscript-cjk-printing|
6. PostScript Printing Troubleshooting	|postscript-print-trouble|
7. PostScript Utilities			|postscript-print-util|
8. Formfeed Characters			|printing-formfeed|

{Vi has None of this}
{only available when compiled with the |+printer| feature}

==============================================================================
1. Introduction						*print-intro*

On MS-Windows Vim can print your text on any installed printer.  On other
systems a PostScript file is produced.  This can be directly sent to a
PostScript printer.  For other printers a program like ghostscript needs to be
used.

Note: If you have problems printing with |:hardcopy|, an alternative is to use
|:TOhtml| and print the resulting html file from a browser.

					*:ha* *:hardcopy* *E237* *E238* *E324*
:[range]ha[rdcopy][!] [arguments]
			Send [range] lines (default whole file) to the
			printer.

			On MS-Windows a dialog is displayed to allow selection
			of printer, paper size etc.  To skip the dialog, use
			the [!].  In this case the printer defined by
			'printdevice' is used, or, if 'printdevice' is empty,
			the system default printer.

			For systems other than MS-Windows, PostScript is
			written in a temp file and 'printexpr' is used to
			actually print it.  Then [arguments] can be used by
			'printexpr' through |v:cmdarg|.  Otherwise [arguments]
			is ignored.  'printoptions' can be used to specify
			paper size, duplex, etc.

:[range]ha[rdcopy][!] >{filename}
			As above, but write the resulting PostScript in file
			{filename}.
			Things like "%" are expanded |cmdline-special|
			Careful: An existing file is silently overwritten.
			{only available when compiled with the |+postscript|
			feature}
			On MS-Windows use the "print to file" feature of the
			printer driver.

Progress is displayed during printing as a page number and a percentage.  To
abort printing use the interrupt key (CTRL-C or, on MS-systems, CTRL-Break).

Printer output is controlled by the 'printfont' and 'printoptions' options.
'printheader' specifies the format of a page header.

The printed file is always limited to the selected margins, irrespective of
the current window's 'wrap' or 'linebreak' settings.  The "wrap" item in
'printoptions' can be used to switch wrapping off.
The current highlighting colors are used in the printout, with the following
considerations:
1) The normal background is always rendered as white (i.e. blank paper).
2) White text or the default foreground is rendered as black, so that it shows
   up!
3) If 'background' is "dark", then the colours are darkened to compensate for
   the fact that otherwise they would be too bright to show up clearly on
   white paper.

==============================================================================
2. Print options					*print-options*

Here are the details for the options that change the way printing is done.
For generic info about setting options see |options.txt|.

							*pdev-option*
'printdevice' 'pdev'	string	(default empty)
			global
This defines the name of the printer to be used when the |:hardcopy| command
is issued with a bang (!) to skip the printer selection dialog.  On Win32, it
should be the printer name exactly as it appears in the standard printer
dialog.
If the option is empty, then vim will use the system default printer for
":hardcopy!"

							*penc-option* *E620*
'printencoding' 'penc'	String	(default empty, except for:
					Windows, OS/2: cp1252,
					Macintosh: mac-roman,
					VMS: dec-mcs,
					HPUX: hp-roman8,
					EBCDIC: ebcdic-uk)
			global
Sets the character encoding used when printing.  This option tells VIM which
print character encoding file from the "print" directory in 'runtimepath' to
use.

This option will accept any value from |encoding-names|.  Any recognized names
are converted to VIM standard names - see 'encoding' for more details.  Names
not recognized by VIM will just be converted to lower case and underscores
replaced with '-' signs.

If 'printencoding' is empty or VIM cannot find the file then it will use
'encoding' (if VIM is compiled with |+multi_byte| and it is set an 8-bit
encoding) to find the print character encoding file.  If VIM is unable to find
a character encoding file then it will use the "latin1" print character
encoding file.

When 'encoding' is set to a multi-byte encoding, VIM will try to convert
characters to the printing encoding for printing (if 'printencoding' is empty
then the conversion will be to latin1).  Conversion to a printing encoding
other than latin1 will require VIM to be compiled with the |+iconv| feature.
If no conversion is possible then printing will fail.  Any characters that
cannot be converted will be replaced with upside down question marks.

Four print character encoding files are provided to support default Mac, VMS,
HPUX, and EBCDIC character encodings and are used by default on these
platforms.  Code page 1252 print character encoding is used by default on
Windows and OS/2 platforms.

							*pexpr-option*
'printexpr' 'pexpr'	String	(default: see below)
			global
Expression that is evaluated to print the PostScript produced with
|:hardcopy|.
The file name to be printed is in |v:fname_in|.
The arguments to the ":hardcopy" command are in |v:cmdarg|.
The expression must take care of deleting the file after printing it.
When there is an error, the expression must return a non-zero number.
If there is no error, return zero or an empty string.
The default for non MS-Windows or VMS systems is to simply use "lpr" to print
the file: >

    system('lpr' . (&printdevice == '' ? '' : ' -P' . &printdevice)
	. ' ' . v:fname_in) . delete(v:fname_in) + v:shell_error

On MS-Dos, MS-Windows and OS/2 machines the default is to copy the file to the
currently specified printdevice: >

    system('copy' . ' ' . v:fname_in . (&printdevice == ''
		? ' LPT1:' : (' \"' . &printdevice . '\"')))
		. delete(v:fname_in)

On VMS machines the default is to send the file to either the default or
currently specified printdevice: >

    system('print' . (&printdevice == '' ? '' : ' /queue=' .
		&printdevice) . ' ' . v:fname_in) . delete(v:fname_in)

If you change this option, using a function is an easy way to avoid having to
escape all the spaces.  Example: >

	:set printexpr=PrintFile(v:fname_in)
	:function PrintFile(fname)
	:  call system("ghostview " . a:fname)
	:  call delete(a:fname)
	:  return v:shell_error
	:endfunc

Be aware that some print programs return control before they have read the
file.  If you delete the file too soon it will not be printed.  These programs
usually offer an option to have them remove the file when printing is done.
							*E365*
If evaluating the expression fails or it results in a non-zero number, you get
an error message.  In that case Vim will delete the file.  In the default
value for non-MS-Windows a trick is used: Adding "v:shell_error" will result
in a non-zero number when the system() call fails.

This option cannot be set from a |modeline| or in the |sandbox|, for security
reasons.

							*pfn-option* *E613*
'printfont' 'pfn'	string	(default "courier")
			global
This is the name of the font that will be used for the |:hardcopy| command's
output.  It has the same format as the 'guifont' option, except that only one
font may be named, and the special "guifont=*" syntax is not available.

In the Win32 GUI version this specifies a font name with its extra attributes,
as with the 'guifont' option.

For other systems, only ":h11" is recognized, where "11" is the point size of
the font.  When omitted, the point size is 10.

							*pheader-option*
'printheader' 'pheader'  string  (default "%<%f%h%m%=Page %N")
			 global
This defines the format of the header produced in |:hardcopy| output.  The
option is defined in the same way as the 'statusline' option.  If Vim has not
been compiled with the |+statusline| feature, this option has no effect and a
simple default header is used, which shows the page number.  The same simple
header is used when this option is empty.

							*pmbcs-option*
'printmbcharset' 'pmbcs'  string (default "")
			  global
Sets the CJK character set to be used when generating CJK output from
|:hardcopy|.  The following predefined values are currently recognised by VIM:

		Value		Description ~
  Chinese	GB_2312-80
  (Simplified)	GBT_12345-90
		MAC		Apple Mac Simplified Chinese
		GBT-90_MAC	GB/T 12345-90 Apple Mac Simplified
				  Chinese
		GBK		GBK (GB 13000.1-93)
		ISO10646	ISO 10646-1:1993

  Chinese	CNS_1993	CNS 11643-1993, Planes 1 & 2
  (Traditional)	BIG5
		ETEN		Big5 with ETen extensions
		ISO10646	ISO 10646-1:1993

  Japanese	JIS_C_1978
		JIS_X_1983
		JIS_X_1990
		MSWINDOWS	Win3.1/95J (JIS X 1997 + NEC +
				  IBM extensions)
		KANJITALK6	Apple Mac KanjiTalk V6.x
		KANJITALK7	Apple Mac KanjiTalk V7.x

  Korean	KS_X_1992
		MAC		Apple Macintosh Korean
		MSWINDOWS	KS X 1992 with MS extensions
		ISO10646	ISO 10646-1:1993

Only certain combinations of the above values and 'printencoding' are
possible.  The following tables show the valid combinations:

				euc-cn	 gbk	ucs-2	utf-8 ~
  Chinese	GB_2312-80	   x
  (Simplified)	GBT_12345-90	   x
		MAC		   x
		GBT-90_MAC	   x
		GBK			   x
		ISO10646			  x	  x

				euc-tw	 big5	ucs-2	utf-8 ~
  Chinese	CNS_1993	   x
  (Traditional)	BIG5			   x
		ETEN			   x
		ISO10646			  x	  x

				euc-jp	 sjis	ucs-2	utf-8 ~
  Japanese	JIS_C_1978	   x	   x
		JIS_X_1983	   x	   x
		JIS_X_1990	   x		  x	  x
		MSWINDOWS	   x
		KANJITALK6	   x
		KANJITALK7	   x

				euc-kr	 cp949	ucs-2	utf-8 ~
  Korean	KS_X_1992	   x
		MAC		   x
		MSWINDOWS		   x
		ISO10646			  x	  x

To set up the correct encoding and character set for printing some
Japanese text you would do the following; >
	:set printencoding=euc-jp
	:set printmbcharset=JIS_X_1983

If 'printmbcharset' is not one of the above values then it is assumed to
specify a custom multi-byte character set and no check will be made that it is
compatible with the value for 'printencoding'.  VIM will look for a file
defining the character set in the "print" directory in 'runtimepath'.

							*pmbfn-option*
'printmbfont' 'pmbfn'	string (default "")
			global
This is a comma-separated list of fields for font names to be used when
generating CJK output from |:hardcopy|.  Each font name has to be preceded
with a letter indicating the style the font is to be used for as follows:

  r:{font-name}		font to use for normal characters
  b:{font-name}		font to use for bold characters
  i:{font-name}		font to use for italic characters
  o:{font-name}		font to use for bold-italic characters

A field with the r: prefix must be specified when doing CJK printing.  The
other fontname specifiers are optional.  If a specifier is missing then
another font will be used as follows:

  if b: is missing, then use r:
  if i: is missing, then use r:
  if o: is missing, then use b:

Some CJK fonts do not contain characters for codes in the ASCII code range.
Also, some characters in the CJK ASCII code ranges differ in a few code points
from traditional ASCII characters.  There are two additional fields to control
printing of characters in the ASCII code range.

  c:yes			Use Courier font for characters in the ASCII
  c:no (default)	code range.

  a:yes			Use ASCII character set for codes in the ASCII
  a:no (default)	code range.

The following is an example of specifying two multi-byte fonts, one for normal
and italic printing and one for bold and bold-italic printing, and using
Courier to print codes in the ASCII code range but using the national
character set: >
	:set printmbfont=r:WadaMin-Regular,b:WadaMin-Bold,c:yes
<
							*popt-option*
'printoptions' 'popt'	string (default "")
			global
This is a comma-separated list of items that control the format of the output
of |:hardcopy|:

  left:{spec}		left margin (default: 10pc)
  right:{spec}		right margin (default: 5pc)
  top:{spec}		top margin (default: 5pc)
  bottom:{spec}		bottom margin (default: 5pc)
			{spec} is a number followed by "in" for inches, "pt"
			for points (1 point is 1/72 of an inch), "mm" for
			millimeters or "pc" for a percentage of the media
			size.
			Weird example:
			    left:2in,top:30pt,right:16mm,bottom:3pc
			If the unit is not recognized there is no error and
			the default value is used.

  header:{nr}		Number of lines to reserve for the header.
			Only the first line is actually filled, thus when {nr}
			is 2 there is one empty line.  The header is formatted
			according to 'printheader'.
  header:0		Do not print a header.
  header:2  (default)	Use two lines for the header

  syntax:n		Do not use syntax highlighting.  This is faster and
			thus useful when printing large files.
  syntax:y		Do syntax highlighting.
  syntax:a  (default)	Use syntax highlighting if the printer appears to be
			able to print color or grey.

  number:y		Include line numbers in the printed output.
  number:n  (default)	No line numbers.

  wrap:y    (default)	Wrap long lines.
  wrap:n		Truncate long lines.

  duplex:off		Print on one side.
  duplex:long (default)	Print on both sides (when possible), bind on long
			side.
  duplex:short		Print on both sides (when possible), bind on short
			side.

  collate:y  (default)	Collating: 1 2 3, 1 2 3, 1 2 3
  collate:n		No collating: 1 1 1, 2 2 2, 3 3 3

  jobsplit:n (default)	Do all copies in one print job
  jobsplit:y		Do each copy as a separate print job.  Useful when
			doing N-up postprocessing.

  portrait:y (default)	Orientation is portrait.
  portrait:n		Orientation is landscape.
						*a4* *letter*
  paper:A4   (default)	Paper size: A4
  paper:{name}		Paper size from this table:
			{name}	    size in cm	     size in inch ~
			10x14	    25.4  x 35.57    10    x 14
			A3	    29.7  x 42	     11.69 x 16.54
			A4	    21	  x 29.7      8.27 x 11.69
			A5	    14.8  x 21	      5.83 x  8.27
			B4	    25	  x 35.3     10.12 x 14.33
			B5	    17.6  x 25	      7.17 x 10.12
			executive   18.42 x 26.67     7.25 x 10.5
			folio	    21	  x 33	      8.27 x 13
			ledger	    43.13 x 27.96    17    x 11
			legal	    21.59 x 35.57     8.5  x 14
			letter	    21.59 x 27.96     8.5  x 11
			quarto	    21.59 x 27.5      8.5  x 10.83
			statement   13.97 x 21.59     5.5  x  8.5
			tabloid     27.96 x 43.13    11    x 17

  formfeed:n (default)	Treat form feed characters (0x0c) as a normal print
			character.
  formfeed:y		When a form feed character is encountered, continue
			printing of the current line at the beginning of the
			first line on a new page.

The item indicated with (default) is used when the item is not present.  The
values are not always used, especially when using a dialog to select the
printer and options.
Example: >
	:set printoptions=paper:letter,duplex:off

==============================================================================
3. PostScript Printing					*postscript-printing*
						*E455* *E456* *E457* *E624*
Provided you have enough disk space there should be no problems generating a
PostScript file.  You need to have the runtime files correctly installed (if
you can find the help files, they probably are).

There are currently a number of limitations with PostScript printing:

- 'printfont' - The font name is ignored (the Courier family is always used -
  it should be available on all PostScript printers) but the font size is
  used.

- 'printoptions' - The duplex setting is used when generating PostScript
  output, but it is up to the printer to take notice of the setting.  If the
  printer does not support duplex printing then it should be silently ignored.
  Some printers, however, don't print at all.

- 8-bit support - While a number of 8-bit print character encodings are
  supported it is possible that some characters will not print.  Whether a
  character will print depends on the font in the printer knowing the
  character.  Missing characters will be replaced with an upside down question
  mark, or a space if that character is also not known by the font.  It may be
  possible to get all the characters in an encoding to print by installing a
  new version of the Courier font family.

- Multi-byte support - Currently VIM will try to convert multi-byte characters
  to the 8-bit encoding specified by 'printencoding' (or latin1 if it is
  empty).  Any characters that are not successfully converted are shown as
  unknown characters.  Printing will fail if VIM cannot convert the multi-byte
  to the 8-bit encoding.

==============================================================================
4. Custom 8-bit Print Character Encodings	*postscript-print-encoding*
								*E618* *E619*
To use your own print character encoding when printing 8-bit character data
you need to define your own PostScript font encoding vector.  Details on how
to define a font encoding vector is beyond the scope of this help file, but
you can find details in the PostScript Language Reference Manual, 3rd Edition,
published by Addison-Wesley and available in PDF form at
http://www.adobe.com/.  The following describes what you need to do for VIM to
locate and use your print character encoding.

i.   Decide on a unique name for your encoding vector, one that does not clash
     with any of the recognized or standard encoding names that VIM uses (see
     |encoding-names| for a list), and that no one else is likely to use.
ii.  Copy $VIMRUNTIME/print/latin1.ps to the print subdirectory in your
     'runtimepath' and rename it with your unique name.
iii. Edit your renamed copy of latin1.ps, replacing all occurrences of latin1
     with your unique name (don't forget the line starting %%Title:), and
     modify the array of glyph names to define your new encoding vector.  The
     array must have exactly 256 entries or you will not be able to print!
iv.  Within VIM, set 'printencoding' to your unique encoding name and then
     print your file.  VIM will now use your custom print character encoding.

VIM will report an error with the resource file if you change the order or
content of the first 3 lines, other than the name of the encoding on the line
starting %%Title: or the version number on the line starting %%Version:.

[Technical explanation for those that know PostScript - VIM looks for a file
with the same name as the encoding it will use when printing.  The file
defines a new PostScript Encoding resource called /VIM-name, where name is the
print character encoding VIM will use.]

==============================================================================
5. PostScript CJK Printing			*postscript-cjk-printing*
							*E673* *E674* *E675*

VIM supports printing of Chinese, Japanese, and Korean files.  Setting up VIM
to correctly print CJK files requires setting up a few more options.

Each of these countries has many standard character sets and encodings which
require that both be specified when printing.  In addition, CJK fonts normally
do not have the concept of italic glyphs and use different weight or stroke
style to achieve emphasis when printing.  This in turn requires a different
approach to specifying fonts to use when printing.

The encoding and character set are specified with the 'printencoding' and
'printmbcharset' options.  If 'printencoding' is not specified then 'encoding'
is used as normal.  If 'printencoding' is specified then characters will be
translated to this encoding for printing.  You should ensure that the encoding
is compatible with the character set needed for the file contents or some
characters may not appear when printed.

The fonts to use for CJK printing are specified with 'printmbfont'.  This
option allows you to specify different fonts to use when printing characters
which are syntax highlighted with the font styles normal, italic, bold and
bold-italic.

No CJK fonts are supplied with VIM.  There are some free Korean, Japanese, and
Traditional Chinese fonts available at:

  http://examples.oreilly.com/cjkvinfo/adobe/samples/

You can find descriptions of the various fonts in the read me file at

  http://examples.oreilly.com/cjkvinfo/adobe/00README

Please read your printer documentation on how to install new fonts.

CJK fonts can be large containing several thousand glyphs, and it is not
uncommon to find that they only contain a subset of a national standard.  It
is not unusual to find the fonts to not include characters for codes in the
ASCII code range.  If you find half-width Roman characters are not appearing
in your printout then you should configure VIM to use the Courier font the
half-width ASCII characters with 'printmbfont'.  If your font does not include
other characters then you will need to find another font that does.

Another issue with ASCII characters, is that the various national character
sets specify a couple of different glyphs in the ASCII code range.  If you
print ASCII text using the national character set you may see some unexpected
characters.  If you want true ASCII code printing then you need to configure
VIM to output ASCII characters for the ASCII code range with 'printmbfont'.

It is possible to define your own multi-byte character set although this
should not be attempted lightly.  A discussion on the process if beyond the
scope of these help files.  You can find details on CMap (character map) files
in the document 'Adobe CMap and CIDFont Files Specification, Version 1.0',
available from http://www.adobe.com as a PDF file.

==============================================================================
6. PostScript Printing Troubleshooting		*postscript-print-trouble*
									*E621*
Usually the only sign of a problem when printing with PostScript is that your
printout does not appear.  If you are lucky you may get a printed page that
tells you the PostScript operator that generated the error that prevented the
print job completing.

There are a number of possible causes as to why the printing may have failed:

- Wrong version of the prolog resource file.  The prolog resource file
  contains some PostScript that VIM needs to be able to print.  Each version
  of VIM needs one particular version.  Make sure you have correctly installed
  the runtime files, and don't have any old versions of a file called prolog
  in the print directory in your 'runtimepath' directory.

- Paper size.  Some PostScript printers will abort printing a file if they do
  not support the requested paper size.  By default VIM uses A4 paper.  Find
  out what size paper your printer normally uses and set the appropriate paper
  size with 'printoptions'.  If you cannot find the name of the paper used,
  measure a sheet and compare it with the table of supported paper sizes listed
  for 'printoptions', using the paper that is closest in both width AND height.
  Note: The dimensions of actual paper may vary slightly from the ones listed.
  If there is no paper listed close enough, then you may want to try psresize
  from PSUtils, discussed below.

- Two-sided printing (duplex).  Normally a PostScript printer that does not
  support two-sided printing will ignore any request to do it.  However, some
  printers may abort the job altogether.  Try printing with duplex turned off.
  Note: Duplex prints can be achieved manually using PS utils - see below.

- Collated printing.  As with Duplex printing, most PostScript printers that
  do not support collating printouts will ignore a request to do so.  Some may
  not.  Try printing with collation turned off.

- Syntax highlighting.  Some print management code may prevent the generated
  PostScript file from being printed on a black and white printer when syntax
  highlighting is turned on, even if solid black is the only color used.  Try
  printing with syntax highlighting turned off.

A safe printoptions setting to try is: >

	:set printoptions=paper:A4,duplex:off,collate:n,syntax:n

Replace "A4" with the paper size that best matches your printer paper.

==============================================================================
7. PostScript Utilities				*postscript-print-util*

7.1 Ghostscript

Ghostscript is a PostScript and PDF interpreter that can be used to display
and print on non-PostScript printers PostScript and PDF files.  It can also
generate PDF files from PostScript.

Ghostscript will run on a wide variety of platforms.

There are three available versions:

- AFPL Ghostscript (formerly Aladdin Ghostscript) which is free for
  non-commercial use.  It can be obtained from:

    http://www.cs.wisc.edu/~ghost/

- GNU Ghostscript which is available under the GNU General Public License.  It
  can be obtained from:

    ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/gnu/

- A commercial version for inclusion in commercial products.

Additional information on Ghostscript can also be found at:

  http://www.ghostscript.com/

Support for a number of non PostScript printers is provided in the
distribution as standard, but if you cannot find support for your printer
check the Ghostscript site for other printers not included by default.


7.2 Ghostscript Previewers.

The interface to Ghostscript is very primitive so a number of graphical front
ends have been created.  These allow easier PostScript file selection,
previewing at different zoom levels, and printing.  Check supplied
documentation for full details.

X11

- Ghostview.  Obtainable from:

    http://www.cs.wisc.edu/~ghost/gv/

- gv.  Derived from Ghostview.  Obtainable from:

    http://wwwthep.physik.uni-mainz.de/~plass/gv/

  Copies (possibly not the most recent) can be found at:

    http://www.cs.wisc.edu/~ghost/gv/

OpenVMS

- Is apparently supported in the main code now (untested).  See:

    http://wwwthep.physik.uni-mainz.de/~plass/gv/

Windows and OS/2

- GSview.  Obtainable from:

    http://www.cs.wisc.edu/~ghost/gsview/

DOS

- ps_view.  Obtainable from:

    ftp://ftp.pg.gda.pl/pub/TeX/support/ps_view/
    ftp://ftp.dante.de/tex-archive/support/ps_view/

Linux

- GSview.  Linux version of the popular Windows and OS/2 previewer.
  Obtainable from:

    http://www.cs.wisc.edu/~ghost/gsview/

- BMV.  Different from Ghostview and gv in that it doesn't use X but svgalib.
  Obtainable from:

    ftp://sunsite.unc.edu/pub/Linux/apps/graphics/viewers/svga/bmv-1.2.tgz


7.3 PSUtils

PSUtils is a collection of utility programs for manipulating PostScript
documents.  Binary distributions are available for many platforms, as well as
the full source.  PSUtils can be found at:

  http://knackered.org/angus/psutils

The utilities of interest include:

- psnup.     Convert PS files for N-up printing.
- psselect.  Select page range and order of printing.
- psresize.  Change the page size.
- psbook.    Reorder and lay out pages ready for making a book.

The output of one program can be used as the input to the next, allowing for
complex print document creation.


N-UP PRINTING

The psnup utility takes an existing PostScript file generated from VIM and
convert it to an n-up version.  The simplest way to create a 2-up printout is
to first create a PostScript file with: >

	:hardcopy > test.ps

Then on your command line execute: >

	psnup -n 2 test.ps final.ps

Note: You may get warnings from some Ghostscript previewers for files produced
by psnup - these may safely be ignored.

Finally print the file final.ps to your PostScript printer with your
platform's print command.  (You will need to delete the two PostScript files
afterwards yourself.)  'printexpr' could be modified to perform this extra
step before printing.


ALTERNATE DUPLEX PRINTING

It is possible to achieve a poor man's version of duplex printing using the PS
utility psselect.  This utility has options -e and -o for printing just the
even or odd pages of a PS file respectively.

First generate a PS file with the 'hardcopy' command, then generate a new
files with all the odd and even numbered pages with: >

	psselect -o test.ps odd.ps
	psselect -e test.ps even.ps

Next print odd.ps with your platform's normal print command.  Then take the
print output, turn it over and place it back in the paper feeder.  Now print
even.ps with your platform's print command.  All the even pages should now
appear on the back of the odd pages.

There a couple of points to bear in mind:

1. Position of the first page.  If the first page is on top of the printout
   when printing the odd pages then you need to reverse the order that the odd
   pages are printed.  This can be done with the -r option to psselect.  This
   will ensure page 2 is printed on the back of page 1.
   Note: it is better to reverse the odd numbered pages rather than the even
   numbered in case there are an odd number of pages in the original PS file.

2. Paper flipping.  When turning over the paper with the odd pages printed on
   them you may have to either flip them horizontally (along the long edge) or
   vertically (along the short edge), as well as possibly rotating them 180
   degrees.  All this depends on the printer - it will be more obvious for
   desktop ink jets than for small office laser printers where the paper path
   is hidden from view.


==============================================================================
8. Formfeed Characters					*printing-formfeed*

By default VIM does not do any special processing of |formfeed| control
characters.  Setting the 'printoptions' formfeed item will make VIM recognize
formfeed characters and continue printing the current line at the beginning
of the first line on a new page.  The use of formfeed characters provides
rudimentary print control but there are certain things to be aware of.

VIM will always start printing a line (including a line number if enabled)
containing a formfeed character, even if it is the first character on the
line.  This means if a line starting with a formfeed character is the first
line of a page then VIM will print a blank page.

Since the line number is printed at the start of printing the line containing
the formfeed character, the remainder of the line printed on the new page
will not have a line number printed for it (in the same way as the wrapped
lines of a long line when wrap in 'printoptions' is enabled).

If the formfeed character is the last character on a line, then printing will
continue on the second line of the new page, not the first.  This is due to
VIM processing the end of the line after the formfeed character and moving
down a line to continue printing.

Due to the points made above it is recommended that when formfeed character
processing is enabled, printing of line numbers is disabled, and that form
feed characters are not the last character on a line.  Even then you may need
to adjust the number of lines before a formfeed character to prevent
accidental blank pages.

==============================================================================
 vim:tw=78:ts=8:ft=help:norl:
