From 2bf37620ef83f5dee8d8b36139c6392f41502252 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Sun, 4 Jul 2010 10:53:04 +0000 Subject: Auto-margins. Documented in mandoc.1. Also bumped line-height and made sure header and footer accomodate for said line-height. --- mandoc.1 | 9 ++++++--- term_ps.c | 53 ++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/mandoc.1 b/mandoc.1 index 2b58da07..855e6a84 100644 --- a/mandoc.1 +++ b/mandoc.1 @@ -1,4 +1,4 @@ -.\" $Id: mandoc.1,v 1.68 2010/07/01 14:23:45 kristaps Exp $ +.\" $Id: mandoc.1,v 1.69 2010/07/04 10:53:04 kristaps Exp $ .\" .\" Copyright (c) 2009 Kristaps Dzonsons .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: July 1 2010 $ +.Dd $Mdocdate: July 4 2010 $ .Dt MANDOC 1 .Os .Sh NAME @@ -303,7 +303,10 @@ PostScript Level-2 pages may be generated by .Fl T Ns Cm ps . Output pages default to letter sized and are rendered in the Times font -family, 11-point. +family, 11-point. Margins are calculated as the maximum of either space +left by page width minus text width (65 +.Sq m +characters), or given default margins of 2 cm. .Pp Special characters are rendered as in .Sx ASCII Output . diff --git a/term_ps.c b/term_ps.c index f98279f1..e78274f0 100644 --- a/term_ps.c +++ b/term_ps.c @@ -1,4 +1,4 @@ -/* $Id: term_ps.c,v 1.26 2010/07/02 10:53:28 kristaps Exp $ */ +/* $Id: term_ps.c,v 1.27 2010/07/04 10:53:04 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -33,6 +33,11 @@ #include "main.h" #include "term.h" +#define MINMARGIN_MM 20 /* Minimum 2cm margins. */ +#define MINMARGIN_PNT 56.68 +#define DEFPAGEX_MM 216 /* Default page size is US-letter. */ +#define DEFPAGEY_MM 279 + /* Convert PostScript point "x" to an AFM unit. */ #define PNT2AFM(p, x) /* LINTED */ \ (size_t)((double)(x) * (1000.0 / (double)(p)->engine.ps.scale)) @@ -388,7 +393,7 @@ void * ps_alloc(char *outopts) { struct termp *p; - size_t pagex, pagey, margin, lineheight; + size_t pagex, pagey, margin, lineheight, m1, m2; const char *toks[2]; const char *pp; char *v; @@ -405,8 +410,6 @@ ps_alloc(char *outopts) p->type = TERMTYPE_PS; p->width = ps_width; - p->engine.ps.scale = 11; - toks[0] = "paper"; toks[1] = NULL; @@ -421,13 +424,10 @@ ps_alloc(char *outopts) break; } - margin = PNT2AFM(p, 72); - lineheight = PNT2AFM(p, 12); - /* Default to US letter (millimetres). */ - pagex = 216; - pagey = 279; + pagex = DEFPAGEX_MM; + pagey = DEFPAGEY_MM; /* * The ISO-269 paper sizes can be calculated automatically, but @@ -451,21 +451,48 @@ ps_alloc(char *outopts) pagey = 356; } else if (2 != sscanf(pp, "%zux%zu", &pagex, &pagey)) fprintf(stderr, "%s: Unknown paper\n", pp); + } else if (NULL == pp) + pp = "letter"; + + /* Enforce minimum page size >= (2 times) min-margin. */ + + if ((2 * MINMARGIN_MM) >= pagex) { + fprintf(stderr, "%s: Insufficient page width\n", pp); + pagex = DEFPAGEX_MM; + } else if ((2 * MINMARGIN_MM >= pagey)) { + fprintf(stderr, "%s: Insufficient page length\n", pp); + pagey = DEFPAGEY_MM; } + /* + * This MUST be defined before any PNT2AFM or AFM2PNT + * calculations occur. + */ + + p->engine.ps.scale = 11; + /* Remember millimetres -> AFM units. */ pagex = PNT2AFM(p, ((double)pagex * 2.834)); pagey = PNT2AFM(p, ((double)pagey * 2.834)); - assert(margin * 2 < pagex); - assert(margin * 2 < pagey); + /* + * Calculate margins. First get the minimum text width: either + * page minus margins or width of 65 'm' characters. Set total + * margins to page size minus text width. + */ + + m1 = ps_width(p, 'm') * 65; + m2 = pagex - (2 * PNT2AFM(p, MINMARGIN_PNT)); + margin = (pagex - (m1 < m2 ? m1 : m2)) / 2; + + lineheight = PNT2AFM(p, 16); p->engine.ps.width = pagex; p->engine.ps.height = pagey; - p->engine.ps.header = pagey - (margin / 2); + p->engine.ps.header = pagey - (margin / 2) - (lineheight / 2); p->engine.ps.top = pagey - margin; - p->engine.ps.footer = (margin / 2); + p->engine.ps.footer = (margin / 2) - (lineheight / 2); p->engine.ps.bottom = margin; p->engine.ps.left = margin; p->engine.ps.lineheight = lineheight; -- cgit v1.2.3-56-ge451