source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Auto-margins.
@ 2010-07-04 10:53 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-07-04 10:53 UTC (permalink / raw)
  To: source

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2010-07-04 10:53 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-04 10:53 mdocml: Auto-margins kristaps

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).