groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Groff] RfH: numeric expression expected (got `n')


From: Werner LEMBERG
Subject: Re: [Groff] RfH: numeric expression expected (got `n')
Date: Sun, 24 Feb 2008 10:54:19 +0100 (CET)

> I have a problem with man-pages written by the PSI3 projects.  Man
> throws a warning about a macro the manpage authors wrote.
>
> However I don't know GROFF well enough to track the issue down.  All
> I can say is, that the warning is thrown for lines with the .pN
> macro, which is defined earlier.  You can take a look yourself at
> http://debian.wgdd.de/temp/cints.1.

Uuuh, there are many problems in it.  The serious ones start with `*'.

  * Are you aware that the man page starts with almost a complete set
    of (probably proprietary) man macros?  They also cause a quite
    ugly layout if processed for a TTY.

  * Don't use empty lines in the input!  They normally cause an empty
    line in the output too, and in most situations you don't want
    this.  For example, the vertical spacing before starting a new
    section should be handled by the man macros, not by the user.

    If you need something for structuring, just use a period starting
    a line, followed by nothing:

      .foo
      .
      .bar

  . The included man macros sometimes introduce comments with

      '     #

    However, a macro `#' hasn't been defined.  This is a harmless
    legacy problem, but groff's `-ww' switch warns about it.

  . This code makes me shudder (besides creating warning messages):

      .if !'\*(Lv'ADVANCED' .ig
      .ds pT \*(Lv \*(OS USERS
      ..
      .if '\*(Lv'ADVANCED' .ig
      .ds pT \*(OS USERS
      ..

    It should be replaced with

      .ie '\*(Lv'ADVANCED' \
      .  ds pT \*(Lv \*(OS USERS
      .el \
      .  ds pT \*(OS USERS

  . There is a (harmless) spurious call to `.iS' before it gets
    defined.

  . You've commented out the definition of the `.}C' macro but there
    is still a (harmless) call to it.

  . groff emits warnings about `diversion stack underflow'.  They are
    harmless.  It would be necessary to slightly rewrite the old man
    macros to get rid of them.

  * The definition of the `.sL' macro is buggy.  Since it starts a
    diversion, the current partial line must be output first.  The
    normal action is to use `.br' right before calling `.di foo'.

  * Before this line

      .pN INPUT   "   Input file"

    you must insert `.sL' to actually start a list.

  * Similarly, after the

      .pN FILE35     "   All one-electron integrals"

    you must insert `.eL' to end a list.

  . You've commented out the definition of `.}M', but you are still
    using it.

  . Finally, your very problem.  Right after the beginning of the
    definition of `.pN' you say

      .ta 2.5in

    This must be

      .ta 2.5i

    of course, and the warning disappears.

Attached is a new version of the man page which fixes some of the
mentioned issues.


       Werner
.ds OS UNIX
.
.\"     @(#)tmac.an 1.37 90/02/04 SMI;
.ds ]W Psi Release 3.0
'       # month name
.  \".if "\nd"0" .nr m \n(mo-1
.  \".if "\nm"0" .ds ]m January
.  \".if "\nm"1" .ds ]m February
.  \".if "\nm"2" .ds ]m March
.  \".if "\nm"3" .ds ]m April
.  \".if "\nm"4" .ds ]m May
.  \".if "\nm"5" .ds ]m June
.  \".if "\nm"6" .ds ]m July
.  \".if "\nm"7" .ds ]m August
.  \".if "\nm"8" .ds ]m September
.  \".if "\nm"9" .ds ]m October
.  \".if "\nm"10" .ds ]m November
.  \".if "\nm"11" .ds ]m December
'       # set the date
.  \".if n \{.nr m \nm+1
.  \".   ie \nd .ds ]W Modified \nm/\nd/\ny
.  \".   el .ds ]W Printed \n(mo/\n(dy/\n(yr\}
.  \".if t \{.ie \nd .ds ]W \*(]m \nd, 19\ny
.  \".   el .ds ]W \*(]m \n(dy, 19\n(yr\}
'       # end of commented out chunk
.if t .tr *\(**
.ie n \{\
.       ds lq \&"\"
.       ds rq \&"\"
.\}
.el \{\
.       ds rq ''
.       ds lq ``
.\}
.de UC
.  \".if t \{\
.  \".  ie "\\$1"" .ds ]W 3rd Berkeley Distribution
.  \".  ie "\\$1"4" .ds ]W \\$1th Berkeley Distribution
.  \".  el .ds ]w \\$2 \\$1 BSD
.  \".\}
..
'       # reset the basic page layout
.de }E
.}f
.in \\n()Ru+\\n(INu
.ll \\n(LLu
..
'       # default tabs
.de DT
'ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i
..
'       # set type font and size
.de }f
.ps 10
.ft 1
..
'       # handle the head of the page
.de }H
.ev 1
.  \".}C
'sp .5i
.ft 1
.ps 10
.tl \\*(]H\\*(]D\\*(]H
'sp .5i
.ev
.ns
..
'       # handle the foot of the page
.de }F
.ev 1
.ft 1
.ps 10
'sp .5i
.if !\\nD .tl \\*(]W\\*(]L\\*(PN%
.if  \\nD .if o .tl \\*(]W\\*(]L\\*(PN%
.if  \\nD .if e .tl \\*(PN%\\*(]L\\*(]W
.if !\\nX 'bp
.if \\nX .if \\n%>=\\nX \{\
.ds PN \\n%
.pn 1
.af % a
.nr X 0
'bp 1\}
.if \\nX .if \\n%<\\nX 'bp
.ev
..
'       # the cut mark -- we don't need this -- Henry
.  \".if n .ig
.  \".de }C
.  \".po .1i
.  \".tl '-'
.  \".po
.  \"..
'       # the final cut mark -- we don't need this -- Henry
.  \".de }M
.  \".}N
.  \".wh -1p }C
.  \".ll \\n(LLu
.  \"..
'       # no runout unless there was a .TH
.de }K
.}N
.pl 1
.ll \\n(LLu
..
.em }K
'       # set title and heading
.de TH
.PD
.DT
.if n .nr IN .5i
.if t .nr IN .5i
.ll 6.5i
.nr LL \\n(.l
.ds ]H \\$1\|(\|\\$2\|)
.ds ]D MISC. REFERENCE MANUAL PAGES
.if '\\$2'1' .ds ]D PSI COMMANDS FOR \\*(pT
.if '\\$2'2' .ds ]D PSI COMMON INPUT FOR \\*(pT
.if '\\$2'3' .ds ]D PSI PROCEDURES FOR \\*(pT
.if '\\$2'4' .ds ]D PSI EXAMPLES FOR \\*(pT
.if '\\$2'5' .ds ]D PSI LIBRARY
.if !'\\$4''  .ds ]W \\$4
.if !'\\$5''  .ds ]D \\$5
.wh 0 }H
.if t .wh -1i }F
.if n .wh -1.167i }F
.  \".em }M
.if !\\n(nl .if !\\nP .nr P 1
.if !\\n(nl .if \\nP .pn \\nP
.if \\nX .if \\nP>=\\nX \{\
.ds PN \\nP
.pn 1
.af % a
.nr X 0 \}
.if !\\n(nl .if \\nP .nr P 0
.if  \\nC .if \\n(nl .bp
.if  !\\nC .if \\n(nl .bp 1
.ds ]L Last change: \\$3
.}E
.DT
.nr )I .5i
.nr )R 0
.  \".if n .na
.mk ka
.if !'\\n(ka'-1' .bp
..
'       # IX - Make an Index Entry
.de IX
.if \\nF .tm .IE\tENTRY\t\\$1\t\\$2\t\\$3\t\\$4\t\\$5\t\\$6\t\\*(PN\\n%
..
'       # TX - Resolve a Title Reference
.de TX
.ds Tx "UNKNOWN TITLE ABBREVIATION: \\$1
.if '\\$1'GSBG' .ds Tx "Getting Started 
.if '\\$1'SUBG' .ds Tx "Customizing SunOS
.if '\\$1'SHBG' .ds Tx "Basic Troubleshooting
.if '\\$1'SVBG' .ds Tx "SunView User's Guide
.if '\\$1'MMBG' .ds Tx "Mail and Messages
.if '\\$1'DMBG' .ds Tx "Doing More with SunOS
.if '\\$1'UNBG' .ds Tx "Using the Network
.if '\\$1'GDBG' .ds Tx "Games, Demos & Other Pursuits
.if '\\$1'CHANGE' .ds Tx "SunOS 4.1 Release Manual
.if '\\$1'INSTALL' .ds Tx "Installing SunOS 4.1
.if '\\$1'ADMIN' .ds Tx "System and Network Administration
.if '\\$1'SECUR' .ds Tx "Security Features Guide
.if '\\$1'PROM' .ds Tx "PROM User's Manual
.if '\\$1'DIAG' .ds Tx "Sun System Diagnostics
.if '\\$1'SUNDIAG' .ds Tx "Sundiag User's Guide
.if '\\$1'MANPAGES' .ds Tx "SunOS Reference Manual
.if '\\$1'REFMAN' .ds Tx "SunOS Reference Manual
.if '\\$1'SSI' .ds Tx "Sun System Introduction
.if '\\$1'SSO' .ds Tx "System Services Overview
.if '\\$1'TEXT' .ds Tx "Editing Text Files
.if '\\$1'DOCS' .ds Tx "Formatting Documents
.if '\\$1'TROFF' .ds Tx "Using \&\fBnroff\fP and \&\fBtroff\fP
.if '\\$1'INDEX' .ds Tx "Global Index
.if '\\$1'CPG' .ds Tx "C Programmer's Guide
.if '\\$1'CREF' .ds Tx "C Reference Manual
.if '\\$1'ASSY' .ds Tx "Assembly Language Reference
.if '\\$1'PUL' .ds Tx "Programming Utilities and Libraries
.if '\\$1'DEBUG' .ds Tx "Debugging Tools
.if '\\$1'NETP' .ds Tx "Network Programming
.if '\\$1'DRIVER' .ds Tx "Writing Device Drivers
.if '\\$1'STREAMS' .ds Tx "STREAMS Programming
.if '\\$1'SBDK' .ds Tx "SBus Developer's Kit
.if '\\$1'WDDS' .ds Tx "Writing Device Drivers for the SBus
.if '\\$1'FPOINT' .ds Tx "Floating-Point Programmer's Guide
.if '\\$1'SVPG' .ds Tx "SunView\ 1 Programmer's Guide
.if '\\$1'SVSPG' .ds Tx "SunView\ 1 System Programmer's Guide
.if '\\$1'PIXRCT' .ds Tx "Pixrect Reference Manual
.if '\\$1'CGI' .ds Tx "SunCGI Reference Manual
.if '\\$1'CORE' .ds Tx "SunCore Reference Manual
.if '\\$1'4ASSY' .ds Tx "Sun-4 Assembly Language Reference
.if '\\$1'SARCH' .ds Tx "\s-1SPARC\s0 Architecture Manual
.       # non-Sun titles
.if '\\$1'KR' .ds Tx "The C Programming Language
\fI\\*(Tx\fP\\$2
..
'       # section heading
.de SH
.}X 0
.nr )E 2
\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
..
'   # sub section heading
.de SS
.}X .25i "" ""
.nr )E 2
\&\\$1 \|\\$2 \|\\$3 \|\\$4 \|\\$5 \|\\$6
.br
..
'       # subroutine for section heading
.de }X
.}E
.ti \\$1
.sp \\n()Pu
.ne 2
.nr )R 0
.fi
.it 1 }N
.SM
.B
..
'       # end of SH (cf }X above and }N below)
.de }2
.nr )E 0
.}E
.nr )I .5i
.ns
..
'       # italic
.de I
.ft 2
.it 1 }N
.if !"\\$1"" \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
..
'       # bold
.de B
.ft 3
.it 1 }N
.if !"\\$1"" \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
..
'       # small
.de SM
.ps 9
.it 1 }N
.if !"\\$1"" \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
..
'       # combinations of Roman, italic, bold
.de RI
.}S 1 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
..
.de VS
'if '\\$1'4' .mc \s12\(br\s0
..
.de VE
'mc
..
.de RB
.}S 1 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
..
.de IR
.}S 2 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
..
.de IB
.}S 2 3 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
..
.de BR
.}S 3 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
..
.de BI
.}S 3 2 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
..
'       # make special case of shift out of italic
.de }S
.ds ]F
.if "\\$1"2" .if !"\\$5"" .ds ]F\^
.ie !"\\$4"" .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" 
"\\$9"
.el \\$3
.}f
..
'       # small and boldface
.de SB
\&\fB\s-1\&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6\s0\fR
..
'       # paragraph
.de LP
.PP
..
.de PP
.sp \\n()Pu
.ne 2
.}E
.nr )I .5i
.ns
..
'       # paragraph distance
.de PD
.if t .nr )P .4v
.if n .nr )P 1v
.if !"\\$1"" .nr )P \\$1v
..
'       # hanging indent
.de HP
.sp \\n()Pu
.ne 2
.if !"\\$1"" .nr )I \\$1n
.ll \\n(LLu
.in \\n()Ru+\\n(INu+\\n()Iu
.ti \\n()Ru+\\n(INu
.}f
..
'       # indented paragraph
.de IP
.TP \\$2
\&\\$1
..
'       # hanging label
.de TP
.if !"\\$1"" .nr )I \\$1n
.sp \\n()Pu
.in \\n()Ru
.nr )E 1
.ns
.it 1 }N
.di ]B
..
'       # end of TP (cf }N below)
.de }1
.ds ]X \&\\*(]B\\
.nr )E 0
.if !"\\$1"" .nr )I \\$1n
.}f
.ll \\n(LLu
.in \\n()Ru+\\n(INu+\\n()Iu
.ti \\n(INu
.ie !\\n()Iu+\\n()Ru-\w\\*(]Xu-3p \{\\*(]X
.br\}
.el \\*(]X\h|\\n()Iu+\\n()Ru\c
.}f
..
'       # handle end of 1-line features
.de }N
.if \\n()E .br
.di
.if "\\n()E"0" .}f
.if "\\n()E"1" .}1
.if "\\n()E"2" .}2
.nr )E 0
..
'       # increase relative indent
.de RS
.nr ]\\n+()p \\n()I
.nr )\\n()p \\n()R
.ie !"\\$1"" .nr )R +\\$1n
.el .nr )R +\\n()I
.nr )I .5i
.}E
..
'       # decrease relative indent
.de RE
.if !"\\$1"" \{.ie "\\$1"0" .nr )p 1 1
.               el .nr )p \\$1 1\}
.ds ]i \\*(]I\\n()p
.ds ]r \\*(]R\\n()p
.nr )I \\*(]i
.nr )R \\*(]r
.if \\n()p .nr )p -1
.}E
..
.nr )p 0 1
.ds ]I \\\\n(]
.ds ]R \\\\n()
.bd S 3 3
.if t .ds R \(rg
.if n .ds R (Reg.)
.ds S \s10
.hy 14
.
.ie '\*(Lv'ADVANCED' \
.       ds pT \*(Lv \*(OS USERS
.el \
.       ds pT \*(OS USERS
.
.ds ]W Psi Release 3.0
.
.\" This is used to ignore blanks on a line
.\" Its purpose is to make the troff input look prettier.
.de __
\\$1
..
.
.\" Start List
.de sL                  \" .sL: start an optional list
.br
.di dL
.LP   \" This resets some things, apparently
.nf
..
.
.\" End List
.de eL                  \" .eL: end an optional list under heading $1
.di
.fi
.\" The number 40 on the following line must be change if sL or eL are changed
.if \\n(dn>40  \{\
.\"SH \\$1 -- \\n(dn \" Use this line for debugging
.SH \\$1
.nf
.dL
.fi
.\}
..
.
.\" The input skip string, used to space headings.
.ds sS \0\0\0\0\0\0\0
.
.\" Input Section Header
.de iS
.LP
.nf
\\$1
.fi
..
.
.\" Input Line
.de iL
.IP "\\$1" 7
.if !'\\$2'' \{\
\\$2
.\}
..
.
.\" Input Option
.de iO
.IP "\\*(sS\\$1" 14
.if !'\\$2'' \{\
\\$2
.\}
..
.
.\" Input Option Value
.de iV
.IP "\\*(sS\\*(sS\\$1" 21
.if !'\\$2'' \{\
\\$2
.\}
..
.
.\" Start CMS
.de sC
.if !'\\*(OS'CMS' .ig eC
..
.\" End Advanced with .eC
.
.\" Start UNIX
.de sU
.if !'\\*(OS'UNIX' .ig eU
..
.\" End Advanced with .eU
.
.\" Start Advanced
.de sA
.if !'\\*(Lv'ADVANCED' .ig eA
..
.\" End Advanced with .eA
.
.\" Start Beginner
.de sB
.if !'\\*(Lv'' .ig eB
..
.\" End Beginner with .eB
.
.\" Psi Name
.de pN                  \" .pN: convert a generic file name to a specific name
.ta 2.5i
.if '\*(OS'CMS' \{\
. ds pO \\$1
. if '\\$1'OUTPUT' .ds pO             \" Unix only
. if '\\$1'BASIS' .ds pO BASIS DATA
. if '\\$1'PBASIS' .ds pO PBASIS DATA
. if '\\$1'HVIB_IN'  .ds pO HVIB15
. if '\\$1'HVIB_OUT' .ds pO FILE15
. if '\\$1'FILE91A' .ds pO FILE91
. if '\\$1'FILE92A' .ds pO FILE92
. if !'\\*(pO'' \\$3\\*(pO\\$2
.\}
.if '\*(OS'UNIX' \{\
. ds pO \\$1
. if '\\$1'INPUT' .ds pO input.dat
. if '\\$1'LMO' .ds pO lmo.dat
. if '\\$1'CONTOUR' .ds pO contour.ps
. if '\\$1'CMO' .ds pO cmo.dat
. if '\\$1'BASIS' .ds pO basis.dat
. if '\\$1'PBASIS' .ds pO pbasis.dat
. if '\\$1'RESUL1' .ds pO resul1.dat
. if '\\$1'RESUL2' .ds pO resul2.dat
. if '\\$1'RESUL3' .ds pO             \" CMS only
. if '\\$1'SLOFILE' .ds pO            \" CMS only
. if '\\$1'INTDERO' .ds pO            \" CMS only
. if '\\$1'MAKEFT' .ds pO resul3.dat
. if '\\$1'INTDER1' .ds pO intder1.dat
. if '\\$1'INTDIFO' .ds pO intdifo.dat
. if '\\$1'IDER'   .ds pO ider.dat
. if '\\$1'OPDM48' .ds pO file51.dat
. if '\\$1'HVIB_IN' .ds pO file15.dat
. if '\\$1'HVIB_OUT' .ds pO file16.dat
. if '\\$1'FILE12A' .ds pO file12a.dat
. if '\\$1'FILE16A' .ds pO file16a.dat
. if '\\$1'FILE21A' .ds pO file21a.dat
. if '\\$1'FILE11' .ds pO file11.dat
. if '\\$1'FILE12' .ds pO file12.dat
. if '\\$1'FILE13' .ds pO file13.dat
. if '\\$1'FILE14' .ds pO file14.dat
. if '\\$1'TOTAL15' .ds pO total15.dat
. if '\\$1'TOTAL20' .ds pO total20.dat
. if '\\$1'FILE15' .ds pO file15.dat
. if '\\$1'FILE16' .ds pO file16.dat
. if '\\$1'FILE17' .ds pO file17.dat
. if '\\$1'FILE18' .ds pO file18.dat
. if '\\$1'FILE19' .ds pO file19.dat
. if '\\$1'FILE20' .ds pO file20.dat
. if '\\$1'FILE21' .ds pO file21.dat
. if '\\$1'FILE22' .ds pO file22.dat
. if '\\$1'FILE23' .ds pO file23.dat
. if '\\$1'FILE24' .ds pO file24.dat
. if '\\$1'FILE25' .ds pO file25.dat
. if '\\$1'FILE91A' .ds pO file91a.dat
. if '\\$1'FILE92A' .ds pO file92a.dat
. if '\\$1'CHECK' .ds pO tape3.dat
. if '\\$1'OUTPUT' .ds pO output.dat\" Unix only
. if '\\$1'FILE6' .ds pO              \" CMS only
. if '\\$1'BMAT' .ds pO input.dat
. if '\\$1'INTCO' .ds pO intco.dat
. if '\\$1'GEOM' .ds pO geom.dat
. if '\\$1'FCONST' .ds pO fconst.dat
. if !'\\*(pO'' \\$3\\*(pO\\$2
.\}
..                      \" End of .pN macro definition
.
.
.
.TH cints 1 " 04 Jan, 2000" "\*(]W" "\*(]D"
.  \"
.  \" Notice of Document Modification
.  \"
.  \"   man page updated by Edward Valeev, 4 Jan 00
.  \"
.  \"
.SH NAME
.B cints 
\- One- and Two-Electron (Derivative) Integrals Program
.
.SH DESCRIPTION
.LP
The program
.B cints
computes (derivative) integrals of some one- and two-electron operators which 
appear in 
quantum chemical theories
over symmetry-adapted cartesian and spherical harmonics Gaussian functions.
.
.SH DOCUMENTATION
.LP
Man-page is no longer supported. HTML-based documentation is 
in index.html.
.
.sL
.pN INPUT   "   Input file"
.pN FILE30  "   Checkpoint file"
.pN FILE31
.eL "FILES REQUIRED"
.
.sL
.pN 
.eL "TEMPORARY FILES USED"
.
.sL
.pN OUTPUT
.pN FILE33     "   Electron repulsion integrals"
.pN FILE35     "   All one-electron integrals"
.eL
.
.
.SH INPUT FORMAT
Input for this program is read from the file
.pN INPUT . 
Most of the keywords are not neccessary for routine
task. The following keywords are valid:
.
.IP "\fBPRINT =\fP \fIinteger\fP"
Determines amount of information to be printed. Defaults to 0.
.
.IP "\fBCUTOFF =\fP \fIintegral\fP"
The negative of the exponent of the cutoff imposed on two-electron integrals.
Default is 15 which results in two-electron integrals of greater than 1e-15
magnitude to be stored in FILE33.
.
.IP "\fBS_FILE =\fP \fIinteger\fP"
The file number to store overlap integrals. Defaults to 35.
.
.IP "\fBT_FILE =\fP \fIinteger\fP"
The file number to store kinetic energy integrals. Defaults to 35.
.
.IP "\fBV_FILE =\fP \fIinteger\fP"
The file number to store nuclear attraction integrals. Defaults to 35.
.
.IP "\fBERI_FILE =\fP \fIinteger\fP"
The file number to store electron repulsion integrals. Defaults to 33.
.
.\" EOF

reply via email to

[Prev in Thread] Current Thread [Next in Thread]