t5.c 2.1 KB

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