t5.c (1746B)
1 #include "a.h" 2 3 /* 4 * 5. Vertical spacing. 5 */ 6 7 /* set vertical baseline spacing */ 8 void 9 vs(int v) 10 { 11 if(v == 0) 12 v = getnr(L(".v0")); 13 nr(L(".v0"), getnr(L(".v"))); 14 nr(L(".v"), v); 15 } 16 17 void 18 r_vs(int argc, Rune **argv) 19 { 20 if(argc < 2) 21 vs(eval(L("12p"))); 22 else if(argv[1][0] == '+') 23 vs(getnr(L(".v"))+evalscale(argv[1]+1, 'p')); 24 else if(argv[1][0] == '-') 25 vs(getnr(L(".v"))-evalscale(argv[1]+1, 'p')); 26 else 27 vs(evalscale(argv[1], 'p')); 28 } 29 30 /* set line spacing */ 31 void 32 ls(int v) 33 { 34 if(v == 0) 35 v = getnr(L(".ls0")); 36 nr(L(".ls0"), getnr(L(".ls"))); 37 nr(L(".ls"), v); 38 } 39 void 40 r_ls(int argc, Rune **argv) 41 { 42 ls(argc < 2 ? 0 : eval(argv[1])); 43 } 44 45 /* .sp - space vertically */ 46 /* .sv - save a contiguous vertical block */ 47 void 48 sp(int v) 49 { 50 Rune buf[100]; 51 double fv; 52 53 br(); 54 fv = v * 1.0/UPI; 55 if(fv > 5) 56 fv = eval(L("1v")) * 1.0/UPI; 57 runesnprint(buf, nelem(buf), "<p style=\"margin-top: 0; margin-bottom: %.2fin\"></p>\n", fv); 58 outhtml(buf); 59 } 60 void 61 r_sp(int argc, Rune **argv) 62 { 63 if(getnr(L(".ns"))) 64 return; 65 if(argc < 2) 66 sp(eval(L("1v"))); 67 else{ 68 if(argv[1][0] == '|'){ 69 /* XXX if there's no output yet, do the absolute! */ 70 if(verbose) 71 warn("ignoring absolute .sp %d", eval(argv[1]+1)); 72 return; 73 } 74 sp(evalscale(argv[1], 'v')); 75 } 76 } 77 78 void 79 r_ns(int argc, Rune **argv) 80 { 81 USED(argc); 82 USED(argv); 83 nr(L(".ns"), 1); 84 } 85 86 void 87 r_rs(int argc, Rune **argv) 88 { 89 USED(argc); 90 USED(argv); 91 nr(L(".ns"), 0); 92 } 93 94 void 95 t5init(void) 96 { 97 addreq(L("vs"), r_vs, -1); 98 addreq(L("ls"), r_ls, -1); 99 addreq(L("sp"), r_sp, -1); 100 addreq(L("sv"), r_sp, -1); 101 addreq(L("os"), r_nop, -1); 102 addreq(L("ns"), r_ns, 0); 103 addreq(L("rs"), r_rs, 0); 104 105 nr(L(".v"), eval(L("12p"))); 106 nr(L(".v0"), eval(L("12p"))); 107 nr(L(".ls"), 1); 108 nr(L(".ls0"), 1); 109 }