From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (kristaps@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id o64Ar4nA030544 for ; Sun, 4 Jul 2010 06:53:04 -0400 (EDT) Received: (from kristaps@localhost) by krisdoz.my.domain (8.14.3/8.14.3/Submit) id o64Ar464028192; Sun, 4 Jul 2010 06:53:04 -0400 (EDT) Date: Sun, 4 Jul 2010 06:53:04 -0400 (EDT) Message-Id: <201007041053.o64Ar464028192@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: kristaps@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Auto-margins. X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- Auto-margins. Documented in mandoc.1. Also bumped line-height and made sure header and footer accomodate for said line-height. Modified Files: -------------- mdocml: mandoc.1 term_ps.c Revision Data ------------- Index: mandoc.1 =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.1,v retrieving revision 1.68 retrieving revision 1.69 diff -Lmandoc.1 -Lmandoc.1 -u -p -r1.68 -r1.69 --- mandoc.1 +++ mandoc.1 @@ -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 . Index: term_ps.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/term_ps.c,v retrieving revision 1.26 retrieving revision 1.27 diff -Lterm_ps.c -Lterm_ps.c -u -p -r1.26 -r1.27 --- term_ps.c +++ term_ps.c @@ -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; -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv