Copyright (C) 1990, 1991 Free Software Foundation, Inc.
Written by James Clark (jjc@jclark.uucp)
This file is part of groff.
groff is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any later
groff is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
You should have received a copy of the GNU General Public License along
with groff; see the file LICENSE. If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
.if !\n(.g .ab These ms macros require groff.
. ab The groff ms macros do not work in compatibility mode.
.\" Enable warnings. You can delete this if you want.
.\" See if already loaded.
.tm \\n(.F:\\n(.c: macro error: \\$*
.tm \\n(.F:\\n(.c: macro warning: \\$*
.ab \\n(.F:\\n(.c: fatal macro error: \\$*
.@error sorry, \\$0 not implemented
.\" a non-empty environment
.ds REFERENCES References
.ds TOC Table of Contents
.ds DY \n[dy] \*[MO] \n[*year]
.tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[PN]
.\" print an error message and then try to recover
.@error \\$@ (recovering)
. \"@warning automatically terminating diversion \\n(.z
. ie d @div-end!\\n(.z .@div-end!\\n(.z
. \" ensure that we don't loop forever
. if \\n[*pop-count]>20 .@fatal recovery failed
.\" ****************************
.\" ******** module cov ********
.\" ****************************
.\" Cover sheet and first page.
.de cov*err-not-after-first-page
.@error \\$0 is not allowed after the first page has started
.de cov*err-not-before-tl
.@error \\$0 is not allowed before TL
.@error \\$0 is not allowed more than once
.@error \\$0 is not allowed after first AB, LP, PP, IP, SH or NH
.als AU cov*err-not-before-tl
.als AI cov*err-not-before-tl
.als AB cov*err-not-before-tl
.als RP cov*err-not-after-first-page
.ie \\n[cov*rp-format] \{\
.wh 0 cov*first-page-init
.\" This handles the case where FS occurs before TL or LP.
.\" released paper format
.if \\n[.$] .if '\\$1'no' .nr cov*rp-no 1
.als TL cov*err-not-again
.di cov*au-div!\\n[cov*n-au]
.ie !\\n[cov*n-au] .@error AI before AU
. di cov*ai-div!\\n[cov*n-au]
.als AB cov*err-not-after-ab
.ie '\\n(.z'cov*ab-div' \{\
. als AE cov*err-not-again
.\" nr cov*ab-height \\n[dn]
.el .@error AE without AB
. ie \\n[cov*rp-format] .cov*rp-print
. if \\n[cov*rp-format] \{\
. @warning RP format but no TL
.nr cov*page-length \\n[.p]
.if \\n[cov*fn-height] \{\
. sp |(u;\\n[cov*page-length]-\\n[FM]\
-\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl])
. ie \\n[cov*rp-no] .rm cov*fn-div
. rn cov*fn-div fn@overflow-div
.\" If anything was printed below where the footer line is normally printed,
.\" then that's an overflow.
.if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] .@error cover sheet overflow
.pl \\n[cov*page-length]u
.if !\\n[cov*rp-no] .cov*tl-au-print
.while \\n[cov*i]<=\\n[cov*n-au] \{\
. ie d cov*ai-div!\\n[cov*i] \{\
.\" start of footnote on cover
.if !\\n[cov*fn-height] .ns
.ie \\n[.$] .FP "\\$1" no
.\" end of footnote on cover
.ie '\\n(.z'cov*fn-div' \{\
. nr cov*fn-height +\\n[dn]
.el .@error FE without matching FS
.\" ***************************
.\" ******** module pg ********
.\" ***************************
.\" Page-level formatting.
.\" > 0 if we have a footnote on the current page
.ds pg*OH '\\*[LH]'\\*[CH]'\\*[RH]'
.ds pg*EH '\\*[LH]'\\*[CH]'\\*[RH]'
.ds pg*OF '\\*[LF]'\\*[CF]'\\*[RF]'
.ds pg*EF '\\*[LF]'\\*[CF]'\\*[RF]'
.ie \\n%=1 .if \\n[pg*P1] .tl \\*[pg*OH]
.wh -\n[FM]u/2u pg*footer
.if !'\\n(.z'' .error-recover MC while diversion open
.ie \\n[pg@ncols]>1 .pg@super-eject
. \" flush out any floating keeps
. while \\n[kp@tail]>\\n[kp@head] \{\
. nr pg@colw \\n[LL]*7/15
. nr pg*gutw \\n[LL]-(2*\\n[pg@colw])
. nr pg@colw (n;\\$1)<?\\n[LL]
. ie \\n[.$]<2 .nr pg*gutw \\n[MINGW]
. el .nr pg*gutw (n;\\$2)
. nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1
. nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1)
.nr pg@fn-colw \\n[pg@colw]*5/6
.ch pg*footer -\\n[FM]u/2u
.nr pg@fn-bottom-margin 0
.\" Handle footnote overflow before floating keeps, because the keep
.\" might contain an embedded footnote.
.\" move pg@bottom and pg*footer out of the way
.ch pg@bottom \\n[.p]u*2u
.ch pg*footer \\n[.p]u*2u
.if \\n[pg@fn-flag] .fn@bottom-hook
.ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col
.po (u;\\n[pg*saved-po]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num]))
.\"po +(u;\\n[pg@colw]+\\n[pg*gutw])
.\" Make sure we don't exit if there are still floats or footnotes left-over.
.ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\
. \" Switching environments ensures that we don't get an unnecessary
. \" blank line at the top of the page.
. if r pg*next-number \{\
. if d pg*next-format \{\
. af PN \\*[pg*next-format]
.\" pg@begin number format
. nr pg*next-number (;\\$1)
. ie \\n[.$]>1 .ds pg*next-format \\$2
.\" print the footer line
.\" flush out any keeps or footnotes
.if !'\\n(.z'' .@error-recover diversion open while ejecting page
.\" Make sure we stay in the end macro while there is still footnote overflow
.\" left, or floating keeps.
.while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\
.\" ***************************
.\" ******** module fn ********
.\" ***************************
.ds * \\*[par@sup-start]\En+[fn*text-num]\\*[par@sup-end]
.ie \\n[.$] .fn*do-FS "\\$1" no
. ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num]
.\" Second argument of `no' means don't embellish the first argument.
.if \\n[fn*open] .@error-recover nested FS
. \" Ensure that the first line of the footnote is on the same page
. \" as the reference. I think this is minimal.
. ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD]
. el .nr fn*need +\\n[fn@sep-dist]
. ne \\n[fn*need]u+\\n[.V]u>?0
.ie !\\n[fn*open] .@error FE without FS
.\" called at the top of each column
.nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin]
.ch pg@bottom \\n[fn*page-bottom-pos]u
.if \\n[fn@have-overflow] \{\
.\" This is called at the bottom of the column if pg@fn-flag is set.
.nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v]
.nr fn@bottom-pos -\\n[.v]
.ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\
. rn fn@div fn@overflow-div
. if \\n[fn*max-width]>\\n[pg@fn-colw] \
. nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v
. wh \\n[fn@bottom-pos]u fn*catch-overflow
. if '\\n(.z'fn@overflow-div' \{\
. nr fn@have-overflow \\n[dn]>0
.als @div-end!fn*embed-div @div-end!fn@div
. if !\\n[pg@fn-flag] .ns
. nr fn*page-bottom-pos -\\n[dn]
. nr fn*max-width \\n[fn*max-width]>?\\n[dl]
. if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist]
. nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos]
. ch pg@bottom \\n[fn*page-bottom-pos]u
. ie '\\n(.z'fn*embed-div' \{\
. rn fn*embed-div fn*embed-div!\\n[fn*embed-count]
\!. fn*embed-start \\n[fn*embed-count]
' sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V])
. @error-recover unclosed diversion within footnote
.\" It's important that fn@print-sep use up exactly fn@sep-dist vertical space.
.\" ***************************
.\" ******** module kp ********
.\" ***************************
.if !'\\n(.z'' .@error-recover KF while open diversion
.ie '\\n(.z'kp*div' .kp*end
. ie '\\n(.z'kp*fdiv' .kp*fend
. el .@error KE without KS or KF
.ie '\\n(.z'' .ds@need \\$1
.\" end non-floating keep
.ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\
. rn kp*fdiv kp*div!\\n[kp@tail]
. nr kp*ht!\\n[kp@tail] 0\\n[dn]
.\" top of page processing for KF
.if !\\n[kp*doing-top] \{\
.\" If the first keep won't fit, only force it out if we haven't had a footnote
.\" and we're at the top of the page.
.nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom])
.while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\
. ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\
. \" It's important to advance kp@head before bringing
. \" back the keep, so that if the last line of the
. \" last keep springs the bottom of page trap, a new
. \" page will not be started unnecessarily.
. rn kp*div!\\n[kp@head] kp*temp
.\" ***************************
.\" ******** module ds ********
.\" ***************************
.\" Displays and non-floating keeps.
.ds*end!\\n[\\n[.ev]:ds-type]
.if \\n[\\n[.ev]:ds-type] \{\
. @error automatically terminating display
.ie \\n[\\n[.ev]:ds-type] .DE
.@error DE without DS, ID, CD, LD or BD
.ie \\n[.$] .in +(n;\\$1)
.als ds*end!1 ds*common-end
. in (u;\\n[.l]-\\n[dl]/2)
.el .@error-recover mismatched DE
. while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\
.el .@error-recover mismatched DE
. in (u;\\n[.l]-\\n[dl]/2)
.el .@error-recover mismatched DE
.\" ****************************
.\" ******** module par ********
.\" ****************************
.\" Paragraph-level formatting.
.\" If it's too big to be in points, treat it as units.
.ie (p;\\$1)>=40p .vs (u;\\$1)
.\" happens when the first page begins
.if !rFL .nr FL \\n[LL]*5/6
.if !rVS .nr VS \\n[PS]+2
.if !dFAM .ds FAM \\n[.fam]
.if !rFPS .nr FPS \\n[PS]-2
.if !rFVS .nr FVS (p;\\n[FPS]+2)
.if !rFPD .nr FPD \\n[PD]/2
.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
. ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
. ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri])
.in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli])
.\" This can be redefined by the user.
.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
.par*start \\n[QI] \\n[QI]
.par*start \\n[\\n[.ev]:PI] 0
.if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2)
.par*start \\n[\\n[.ev]:ai] 0
. \" Divert the label so as to freeze any spaces.
. ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c
.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
.nr \\n[.ev]:li +\\n[\\n[.ev]:ai]
.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
. nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]]
. nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]]
. nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]]
. nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]]
. nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]]
.el .@error unbalanced \\$0
.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li]
.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri]
.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai]
.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli]
.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri]
.nr \\n[.ev]:ai \\n[\\n[.ev]:PI]
.\" Postpone the drawing of the box until we're in the top-level diversion,
.\" in case there's a footnote inside the box.
.ie '\\n(.z'par*box-div' \{\
. par*box-draw \\n[.i]u \\n[.l]u
.el .@error B2 without B1
.ie '\\n[.z]'' .mk par*box-top
. nr par*box-vpt \\n[.vpt]
\D'l (u;\\n[.l]-\\n[.i]) 0'\
\D'l 0 |\\n[par*box-top]u'\
\D'l -(u;\\n[.l]-\\n[.i]) 0'\
\D'l 0 -|\\n[par*box-top]u'
.el \!.par*box-draw \\$1 \\$2
.\" Keep together the heading and the first two lines of the next paragraph.
.ne 3v+\\n[\\n[.ev]:PD]u+\\n(.Vu
.\" TL, AU, and AI are aliased to these in cov*ab-init.
. nr par*prev-font \\n[.f]
\&\\$3\f[\\*[par*font-name!\\$0]]\\$1\f[\\n[par*prev-font]]\\$2
.el .ft \\*[par*font-name!\\$0]
\Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2
\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
.\" The first time UX is used, put a registered mark after it.
\s[\\n[.s]*8u/10u]UNIX\s0\\$1\\*[par*ux-rg]
.ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m'
.ds par@sup-end \v'-.7m\s0+.9m'
.\" FF is the footnote format
.\" This can be redefined. It gets a second argument of `no' if the first
.\" argument was supplied by the user, rather than automatically.
.if !d par*fp!\\n[FF] \{\
. @error unknown footnote format `\\n[FF]'
.ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1"
.el .par*fp!\\n[FF] "\\$1"
\&\\*[par@sup-start]\\$1\\*[par@sup-end]\ \c
.@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2)
.@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2)
.\" ***************************
.\" ******** module nh ********
.\" ***************************
.\" nh*hl is the level of the last heading
. @error missing arguments to .NH S
. if \\n[nh*hl]-\\n[nh*ohl]>1 \
. @warning .NH \\n[nh*ohl] followed by .NH \\n[nh*hl]
. while \\n[nh*hl]>\\n[nh*ohl] \{\
.while \\n[nh*i]<\\n[nh*hl] \{\
.\" ****************************
.\" ******** module toc ********
.\" ****************************
.\" Table of contents generation.
. if d toc*num .toc*end-entry
. ie '\\$1'no' .ds toc*num
.el .@error XA without XS
. if d toc*num .toc*end-entry
.el .@error XS without XE
.char \[toc*leader-char] .\h'1m'
.ta (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R
.\" print the table of contents on page i
.\" ****************************
.\" ******** module eqn ********
.\" ****************************
.ie '\\$1'L' .nr eqn*type 0
. ie '\\$1'I' .nr eqn*type 1
. if !'\\$1'C' .ds eqn*num "\\$1
.\" Note that geqn mark and lineup work correctly in centered equations.
.ie !'\\n(.z'eqn*div' .@error-recover mismatched EN
. if !'\\*[eqn*num]'' .nr eqn*have-num 1
. if \\n[dl]:\\n[eqn*have-num] \{\
. ds@need \\n[dn]u-1v+\n[.V]u
. ta (u;\\n[.l]-\\n[.i])R
\\*[eqn*div]\t\\*[eqn*num]
. ie \\n[eqn*type]=1 .ta \\n[DI]u \
. el .ta (u;\\n[.l]-\\n[.i]/2)C \
\t\\*[eqn*div]\t\\*[eqn*num]
. ta (u;\\n[.l]-\\n[.i])R
.\" ****************************
.\" ******** module tbl ********
.\" ****************************
.\" The break is necessary in the case where the first page has not yet begun.
.if '\\$1'H' .di tbl*header-div
.if \\n[tbl*have-header] \{\
. ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl*print-header
.ie '\\n[.z]'tbl*header-div' \{\
. ie \\n[dn]+\\n[FM]+\\n[HM]+2v>=\\n[.p] \{\
. @error ridiculously long table header
. nr tbl*header-ht \\n[dn]
.el .@error-recover .TH without .TS H
.de @div-end!tbl*header-div
.ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE
.if \\n[tbl*have-header] \{\
.\" ****************************
.\" ******** module pic ********
.\" ****************************
.ie \\n[.$]<2 .@error bad arguments to PS (not preprocessed with pic?)
. in +(u;\\n[.l]-\\n[.i]-\\$2/2)
.\" ****************************
.\" ******** module ref ********
.\" ****************************
.rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V
.ds ref*spec!0 Q A T S V N P I C D O
.ds ref*spec!1 Q A T J S V N P I C D O
.ds ref*spec!2 Q A T S V P I C D O
.ds ref*spec!3 Q A T B E S V P I C D O
.ds ref*spec!4 Q A T R G P I C D O
.ie d ref*spec!\\$1 .ref*build \\*[ref*spec!\\$1]
. @error unknown reference type `\\$1'
. ref*build \\*[ref*spec!0]
.\" start of reference number
.ds [. \\*[par@sup-start]
.\" end of reference number
.\" period before reference
.\" period after reference
.\" comma before reference
.\" comma after reference
.\" start collected references
.als ref*print ref*end-print
.\" end collected references
.als ref*print ref*normal-print
.ie d [F .FS "\\*([.\\*([F\\*(.]"
.als ref*print ref*normal-print
.rm ref*string ref*post-punct
.nr ref*suppress-period 1
. ie d ref*add-\\$1 .ref*add-\\$1
.\" now add a final period
. if !\\n[ref*suppress-period] .as ref*string .
. if d ref*post-punct \{\
. as ref*string "\\*[ref*post-punct]
.ref*field T , "\\*Q" "" "\\*U"
.if r [T .nr ref*suppress-period \\n([T
.ie \\n([P>0 .ref*field P , "pp. "
.ref*field J , \fI "" \fP
.ref*field B "" "in \fI" "" \fP
.ie r [O .nr ref*suppress-period \\n([O
.el .nr ref*suppress-period 1
.if r [A .nr ref*suppress-period \\n([A
.\" First argument is the field letter.
.\" Second argument is the punctuation character to use to separate this field
.\" from the previous field.
.\" Third argument is a string with which to prefix this field.
.\" Fourth argument is a string with which to postfix this field.
.\" Fifth argument is a string to add after the punctuation character supplied
. ie d ref*post-punct \{\
. as ref*string "\\$2\\*[ref*post-punct] \"
. el .as ref*string "\\$2 \"
.as ref*string "\\$3\\*([\\$1\\$4
.if \\n[.$]>4 .ds ref*post-punct "\\$5
.nr ref*suppress-period 0
.\" ****************************
.\" ******** module acc ********
.\" ****************************
.\" Accents and special characters.
.if !c\(rg .char \(rg (R)
.if !c\(ah .char \(ah \v'-.55m'\s[\En[.s]/2u]v\s0\v'.55m'
.if !c\(ad .char \(ad \v'-.55m'\s[\En[.s]*7u/10u].\h'.05m'.\s0\v'.55m'
.if !c\(a- .char \(a- \v'-.55m'\D'l .25m 0'\v'.55m'
.if !c\(ao .char \(ao \v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s0\v'.55m'
.if !c\(ac .char \(ac \s[\En[.s]*8u/10u]\v'.05m',\v'-.05m'\s0
.if !c\(ho .char \(ho \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0
.if !c\(-D .char \(-D \Z'\v'-.1m'-'D
.if !c\(Sd .char \(Sd \Z'\v'-.3m'\h'.2m'-'\(pd
.if !c\(TP .char \(TP I\h'-.25m'\v'-.33m'\s[\En[.s]*6u/10u]\v'.33m'D\
.if !c\(Tp .char \(Tp \zlp
.if !c\(ss .char \(ss \(*b
.if !c\(AE .char \(AE A\h'-.3m'E
.if !c\(ae .char \(ae a\h'-.19m'e
.if !c\(OE .char \(OE O\h'-.25m'E
.if !c\(oe .char \(oe o\h'-.14m'e
.if !c\(r? .char \(r? \Z'\h'.1m'\v'-.15m'\s[\En[.s]*7u/10u]i\s0\v'.15m''\
\v'.15m'\s[\En[.s]*7u/10u]c\s0\v'-.15m'
.if !c\(r! .char \(r! \h'.1m'\Z'\v'-.4m'\s[\En[.s]*8u/10u].\s0\v'.4m''\
\s[\En[.s]*8u/10u]\v'.4m'\(or\v'-.4m'\s0\h'.1m'
.\" The idea of this definition is for the top of the 3 to be at the x-height.
.\" A yogh really ought to have a little line going north-west from the top
.if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\
\v'\w'3'*0+\En[rst]u'3\s0'\h'\w'\s[\En[.s]*8u/10u]3'u'
.ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\
\h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2'
.ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2'
.ds \\$1 \Z'\h'(u;-\En[.w]-\w'\\$2'/2)'\
\v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$2'
.ds \\$1 \Z'\h'(u;\w'x'-\w'\\$2'/2)'\\$2'
.\" improved accent marks
.acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0
.char \[hooko] o\\\\*[hook]
.ds D- \(-D\" Icelandic uppercase eth
.ds d- \(Sd\" Icelandic lowercase eth
.ds Th \(TP\" Icelandic uppercase thorn
.ds th \(Tp\" Icelandic lowercase thorn
.ds 8 \(ss\" German double s
.ds Ae \(AE\" AE ligature
.ds ae \(ae\" ae ligature
.ds Oe \(OE\" OE ligature
.ds oe \(oe\" oe ligature
.ds ? \(r?\" upside down ?
.ds ! \(r!\" upside down !
.\" Make sure that no blank lines creep in at the end of this file.