From 88b6e082d043240d201195487eb7efaad3ce8cb8 Mon Sep 17 00:00:00 2001 From: Karchnu Date: Mon, 11 Oct 2021 05:57:55 +0200 Subject: [PATCH] First commit. --- .source-highlight_groff-output-definition | 71 ++++ Makefile | 8 + Makefile.in | 74 ++++ are-you.pdf | Bin 0 -> 38918 bytes bibliography | 13 + bin/ghighlight | 286 +++++++++++++++ bin/utf8-to-ms.sh | 147 ++++++++ header.ms | 21 ++ macros.ms | 186 ++++++++++ main.ms | 412 ++++++++++++++++++++++ 10 files changed, 1218 insertions(+) create mode 100644 .source-highlight_groff-output-definition create mode 100644 Makefile create mode 100644 Makefile.in create mode 100644 are-you.pdf create mode 100644 bibliography create mode 100755 bin/ghighlight create mode 100755 bin/utf8-to-ms.sh create mode 100644 header.ms create mode 100644 macros.ms create mode 100644 main.ms diff --git a/.source-highlight_groff-output-definition b/.source-highlight_groff-output-definition new file mode 100644 index 0000000..b7adfd8 --- /dev/null +++ b/.source-highlight_groff-output-definition @@ -0,0 +1,71 @@ +extension "groff" +doctemplate +" +.MT 0 +$header +.TL +$title +.AU \"\" +.ND +.SA 0 +.DS I +" +".DE +$footer +" +end + +nodoctemplate +" +" +" +" +end + +bold "\f[CB]$text\fP" +italics "\f[CI]$text\fP" +underline "\f[CI]$text\fP" +fixed "\fC$text\fP" +color "\m[$style]$text\m[]" + +anchor "$infilename : $linenum - $text" +reference "$text \(-> $infile:$linenum, page : $infilename:$linenum" + +#lineprefix "\fC\(em\fP " +#lineprefix "\fC\n(ln\fP " + +lineprefix "" + + +colormap +"green" "green" +"red" "red" +"darkred" "darkred" +"blue" "blue" +"brown" "brown" +"pink" "pink" +"yellow" "yellow" +"cyan" "cyan" +"purple" "purple" +"orange" "orange" +"brightorange" "brightorange" +"brightgreen" "brightgreen" +"darkgreen" "darkgreen" +"black" "black" +"teal" "teal" +"gray" "gray" +"darkblue" "darkblue" +default "black" +end + +translations +"\\" "\\\\" +##"\n" " \\\\\n" +##" " "\\ " +##"\t" "\\ \\ \\ \\ \\ \\ \\ \\ " +"\t" " " +"|" "|" +"---" "\(em" +"--" "\(mi" +end + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8e6ef23 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +SRC ?= main +ODIR ?= /tmp/ +export ODIR SRC + +include Makefile.in + +upload: + scp $(SRC).pdf tacos:/var/www/htdocs/t.karchnu.fr/doc/ diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..385d368 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,74 @@ +SRC ?= haskelltut + +ODIR ?= . + +BIBLIOGRAPHY ?= bibliography +ALLSRC = $(shell find . -name "*.ms") + +SOELIM_OPTS ?= +SOELIM = soelim $(SOELIM_OPTS) + +SPECHAR = ./bin/utf8-to-ms.sh + +PRECONV_OPTS ?= -e utf-8 +PRECONV = preconv $(PRECONV_OPTS) + +EQN_OPTS ?= -Tpdf +EQN = eqn $(EQN_OPTS) + +# source-highlight stuff +# GH_INTRO: instructions before each source code provided by source-highlight +# GH_OUTRO: ------------ after ---- ------ ---- -------- -- ---------------- +# GH_INTRO/GH_OUTRO: values are separated by ';' +# +GH_INTRO := .b1;.nr DI 0;.DS I;.fam C +GH_OUTRO := .fam;.DE;.b2 +# +export GH_INTRO +export GH_OUTRO +# +# SHOPTS: cmd line parameter given to source-highlight +SHOPTS = --outlang-def=.source-highlight_groff-output-definition +export SHOPTS + +# ghighlight brings `source-highlight` to troff +GHIGHLIGHT_OPTS ?= +GHIGHLIGHT = ./bin/ghighlight $(GHIGHLIGHT_OPTS) + +GRAP_OPTS ?= +GRAP = grap $(GRAP_OPTS) + +PIC_OPTS ?= -Tpdf +PIC = pic $(PIC_OPTS) + +# -P => move ponctuation after reference +# -S => label and bracket-label options +# -e => accumulate (use a reference section) +# -p bib => bibliography file +REFER_OPTS ?= -PS -e -p $(BIBLIOGRAPHY) +REFER = refer $(REFER_OPTS) + +# -k => iconv conversion (did it ever worked?) +# -ms => ms macro +# -U => unsafe (because of PDF inclusion) +# -Tpdf => output device is PDF +# -mspdf => include PDF (so, images converted in PDF) in the document +GROFF_OPTS ?= -ms -t -Tpdf -U -mspdf -mpdfmark +GROFF = groff $(GROFF_OPTS) + +$(SRC).pdf: + cat $(SRC).ms |\ + $(SOELIM) |\ + $(SPECHAR) |\ + $(PRECONV) |\ + $(EQN) |\ + $(GHIGHLIGHT) |\ + $(GRAP) |\ + $(PIC) |\ + $(REFER) |\ + $(GROFF) > $(ODIR)/$@ + +# Keep options in memory for the recursive 'make' call +export SOELIM_OPTS PRECONV_OPTS EQN_OPTS GHIGHLIGHT_OPTS GRAP_OPTS PIC_OPTS REFER_OPTS +serve: + find . -name "*.ms" | entr gmake -B $(SRC).pdf diff --git a/are-you.pdf b/are-you.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cdda867419c9a3e390c8abf29f6276ac9a3cff23 GIT binary patch literal 38918 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

# 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 wg`sP3j;ye7#p~v7D>2xZv2+ z9y)xFp&?mVBC{ChuGG)3S)x8XMt?sGLsD0T@fcW%VK(v*(Z;UB&A#Fro%z-@l<0@Q zzkrA^i65`X)G3v`>9NHmeKRA89ggg$ps6FD!uD?Ld4yl{8?n$@^!2kHBOF&1B+Gc56c$Ph=JD~WxC6XXi#v{_h7geCURtX?BqqgS$WN&w>v*I za3SYBN$FnhK(HQ0`$=|v-pgjxe-yOK(y}M5USun?0FMlVd}0A>(yT3m;qs0akqOgf z?;l1uKWbbJyX6%Jh*I0~a65`#EMjg{LhJ#1SLQb}m*%XbF)@$1=+0y$zem|s0!lCK z27EbEKbr}g?ct=48_PY=0|&Q4aa0T@QlH-JIMo@HgJn^)VV_Uw8LpU&O$(Nf#&?N@ zHHpn~8vq+*v?17BObY%l{*2{2;_m}I8`L!!02+_*6}6s36aQUb^Sa^W9W!`W4MR|u z&@hb8Z4Khd;?{~WWh&6x-3fannShKrcqWX-QOe0(!+679O&PbbsAlw1UdzYwlgXu$ z9rhw?GT8w&x7S*C84zD^{kq1|{_*8t9lA9=k|iEjcIDqxRHel~ST;_ECBq&bVL5RV z(_;Osl-$h1^G6G~WCJa_0SxIPb>oA?9TMm^R(Er@PWnEXUu;#a+MeSQj;8%bHB*M> zuYqFem_`;Z;@q}$XLQ_kcUl16Icv@UfWf=^r(r`D=(r(KNq=;&0qA&+PVj9SdzkIQ zEK3|tSYvaX{2>)blxH@wQ{KICVGZ#URpOv1n2cst;~ z=lI1zXs_jaL*tTJ9l4CUahFVKm|;DXMRLt(t;+Ea0CVmn0<5Nru~I)xozMwmFmBD1&Mn z3t3WkO%|NTPO0dTTw!kO^t(s)`J8W8u}i&iTa_S?+r3Z_cTc&rQNb<^FA@2NKFe4z zL&|O9!Gb-*oIZN#K9XOSkp>f@!}yok+;n#5znh~Y@2oU*jm$ceCEL6ir?HVsnZl0! z1&%s)J{8jv*ETR)Noe1ktj$mV#-b{Gq1d7W$i}M9^<8QsQ`lkmAaEmJ^r;y#b957( zx`%4CbR%%F^;?e)g)`K13WO>Sl0;WboK4n^ApDkQX-Q}SF|8kkQ{?4}cMqZqE}Ohd zzkTh+Zwek}VA$@*mkEWzjIE)N8(kM_TXzHERe#6+KO?v7$*kx10$KX#xiX3U--Qhr zSZ3wdmwBL-E4Ne0#8>0^8;8=$Y_ppe5JwAV?DJW&7tIo<9*6h^!|EOZl-RkJ(5p{W z+i#M>FD z;!piK&`V^ykpmQ#xd1VtJvtE$X#A8h(v45KRekD?_Po<%^G~3-(AR=}Xd?{cj}shB zHgaFo>=`cM6k0SGQ0rsR;9!PivCJFl}_8cghw^fIqv zL)|V%e~F_g=cXAGz>L(HSVsPf<9)NweVjr?y;HUFoW5xe5>+jpJWKug)$?(!S>oPd zrwgvD$VH%I&FDg=Dy0GEGD|8NinZF$=vV6F&V31xWC)*kI2r3ORfvwhf?{X3R72B< zj;3lwA(t|HsVOJo$>OZ*E}K zdF6HTLG~LZ6e?{2_#)a8E2EEGWTjIOTWMkb`V71Le>Y8n}MX-nU8$q(B6yakcWV{}-*dwcKL z*$OpLNjl5++woAng-|Tp$1LBP-X)txN^=)Gi0qb$H03jAxk%4%+DFIZjDGTEMo-z< z*UhWW*cBn9VXH>Qee{=K<)nSiHwtN8$Mmdo+=Z#wODwjNuAu8I($X&yZ}}_dOZ9~W z>#EE+=s2T#{y1M;=)G(e4>GXbG?L`11C$~~%=bWxY;<|+u{6{y4mZRdeGQ|A)1GMt z>gvuOEC8q2*7z8FWuiu>id)y+*98TWFCrs7CzZ**A7o0g6*A=v7gXsBnrH_2$6q<+ zS>lU?!kM+S3wEzrMAQ!l`jrvIoQO_RCxz zG5Tp9^jvk$m8np9vR8lsf7b;uEAr)jzn-z(!2Ct~+(&g6Rl&=mBB$4)<$opaDJm3p zX}LLNXL6l<4DV?Q1CRV#t3%%?@1h*|Z6lYpa3cESuNSu+(B~xn;pX3WL3Pr%X5*F|qckPh?ouindd$r#vbx z7Ij$|R2k&2cb9S6NF6;lF{ocasM=+I;p?oz!cqhb?#ai8vKHGOd1=dodVldSWCuDn zCq-m=`Dw|KIDdM~t>b3}7U5K6JyUgToY0WZ%XRh^$A)6oPWKwdzNglqQ zlscGM1E#M9;SGDdv8#`oJVY9^v*ru>m94eMWsU(Yge~Ihb(Ha7KI6G;PvO}W>H z8E9?boE>UCkTw$a2KlxJ=r;TH%E!lbc~~x7aaN|ZNoB4i;Q;bpKDJi1=NRVPL@Xqd zLH7k*M;!8^V@Q?77~7>6LwTrcUf2aAcT4tJS3+KPtq;n4WEa8uoZMngmS8o#@%>q-V{4T)dWa`{;n6dAhKe8RsZ}6 zY0O)uquoW4N|m!aUz{j$n&y6(j`9hJ+%QG%gXy_(I<1D9nCtqv zC{d}E;fCgUY~OpuoRYfT(ez(K$Nv+(K;o!uR$Xw8(a@jnG%i(6x(1Go&J;V5&8J?r zTs((7--=Vhzd7}4e=NU>NEo9ZP zX`&c*BA9?%Vx9=bhF!MT&%MsjwSuP&MvZK4c6 z(Ec#ShKdH$joiyfjXL5uljYLP(}=_A|%nW2qY3on?frJcEXLV*l9NU$nAMEj|XrkQ}ZHrYx9~GqI(_NS-zKb z61--}xer>)7k1UA1GTLQG`5M-9Vb>eY{53=KkOTHq^jmxdpEQb$-Eh~q_e52a3Y+W zwn=uz_qz1z30p`(1uC7tE!{FG zC^F5Z?rYLBT72~%PqdNxnTuqIwpG@ibA3spf{e* z=sp5T3_HPd)gud8Rc$z>j03n*UkuS6ldEE;+-7DX%BduwTyfyEEq&&*oi=985W)7*hYx>d>Pm>`0#n!@b5@K2&Y z+HCf%FnDQYJtg~>h)A_h1OmdH-vT29O{D|X(txlBLc>KlkYM+d20a?qyO`&Xw9x~9 z1Ad3i^t7T79G-B+Bb;|8a>=4^I^lz8<%_M_dMZPJLzPUoOXTxEq=8u8t2dj<;CjDB z{8G#;3B%sv5Ija;l_n1KvY<0$<_2ge)`UJ=^juLjvs)g^y81Q-D(kdSRL5k zsHZ5&^ki=ef^c<7-ZY#O{?rr5tz9&o>#eNOHp@JE3}y=q^oNbq&Ub6}pwg60rS}Gg zx7}3ei5}7i(soPOghNI&9SUs8y70!ryGPrZnvYh_|RgE1pFh$0p%nEm0`q6dP*76i&IEc^s{+lIMXV3Fd*TGx!u z7Nsf6Y0Z3cdL7(&accH#l>AFp7PTxNBILUpd~V+|N=;drfbHU^2!AJ1`Qs2zOurk+ z#A<4j?yjF7bK+=f$Sx!LIac4bhn&;|8f{vd;Lb%2Cc}^Bj-$rbjajv2#37tk_zyQ! z?!EKV?Id4X@g|+xA0TEQDD=xg4~dr9$cWpykvyl7a4N)pSbAzmW&(%4r%9S2b_`cg z?Sn2rSSv4er*F@0wU}S2|Le>6W5_dKH&c9UlH}=xgzGy28m5B=aodFrQts5k=@tgN zCUk1QnGhwfEpQ{mM#*CFl9}Nq5xU50ZxyC4q;sY3DpWNLV$GDw=vN)jNestC&2}8B z{ZhRC!8-U$)j}yR@7lQcv?Nbwa{6g+)o}V_FEC9Htq<`)vg+sh*79YYFVdSh<}**; zEIww+GHpVJ*8n(|%`ZoY6*9LZ2$q?A_CrLsib9aVQ>pKCC+3%zKFpV7NaM_@zWL_L zXx_>(wY0V0f@Uz%wZ*B!*-HvcVMTCtp)fEc|=B|^3c`s^ftw%faG2Hj;V~zJ3Vfr%Bw_WLJ z^fU;q#K)fiUN09q)Qa#{WrtH(M}vyJAYAWUVxc1+^bn%Z-~0%$^6go;G4G+p6T^}lYqI| z>%eHTF!3R3kPHWVzImUY!jwb&VRU09Ec_V(jpsu;1|23pYR-*vg}^oi^AW&+KWnN^ zn3&O`cZ==3=H3eD9-SnIm^|Z7fxExMG7#cFDmzp)oF{xA*I52zLQTG1j0M~G*PN}b zqzDqN*EX~F#a)}6^cTj*6qT|;ag?cS3M#!o7QN&jM<>zH(yJ~Hl@9!U=TuQ!Ju4)o zAI%*0$d{uCUQlDs(juz!VPbrdc0i6|(t}!zX=veq^j*l59ql0CVKHwLY>lbznHgV- zo!}EAWi0GKUSpT@Wj3`#w*^v_{2lB|ZKi_AZji7eEYhXWVKRXp(@86f?Gx)~xQyK) z^)$*((h)WBewtoK=KbaGnN)m}qm?Em3=B(XQ@Ur@$Uh!^=U{$Z;>YS?G8D~7%z(eC z#pNq7VO17jCHWefRsT%}1bAtCLa$IFs!3|wXw(mQcm>aq#f226jGf-DoSo^&JHD7} z@<>vj7#`j&KC~yuhIYoVe>AjkSEN=9_)BkpPnyXtBdx zRmthMCS^z0Mzsh$m(uWlO$t%C`>w0fnyN6n4K?yBp>62t9QO1xZcS&|5RjSc9|iet z40P&{1@Yc3Lq#iSSoON1nJ$g{BwG)8moq`{$fqCmVpZ(`*Va9%fJ~>dhu7b(%m^WiZ8jzm{!+LW;Gq>cqZJ-J?y`o=>GyS;r@rCqDBgONJ3*%(Otx`r<2HpBqIf_4*6hh&iE}bmu z78oGvW4d4Zlln71*y0bN7ur7dcJ0Lm7l*CAfoDgw{5{Guc&3 zn^dpzx~%1$4UGB=*jggxOHBJ%)deqi^mf+ocVl2))Q4&R_@4&KtR7?`=wTvA%!;?A z8-1K&lT!U0$UQx+0R3;jv0dx>`0B5>-v#YkSW15N?b536FYad{KvNjFONb1xV9vQKSaqDc)X`US_ z3D}Hx(t)xQ9xXiwKxqT$P-wk~U3=kf>3aO{l|o@c(4OW~OVQ3T&EwSf(|*Mc2J&o? zRarusMCHH+f03T|Eso>pR6>o*KK8!CBGB_Bv7~oHO$ZV%Jy3RN)iq~sA#v$55f`zx zILSb*-9c#F$Ac?c#Js~1M8fXobKwd!#Fdc#3FFBKps`r~{IKQL-&n(D1~*{TQLD54 z%VKQ|YFFra-)(XxAr5w!7vGC(aDYDboa-UOv~p|ph!#7my?IZUEOxBzwKtao!6&|U zhCk~s;l~Ego~vz#P>aq0!R&Ypk;{r85tKI}JE6L|=^DY=h*ZgC8bCT{k(d~R5&BGR z>-OWVfC9f?LrmzmjnBEjzmyx8T>Aet5?Q`j$PFYsbPJWp(HMiF-e9@xu28gbAU^*$ zP2j(CHt=E>>we=6>)^|2_)}iSh~lw}t$C|8*&bWA6z9T76J{|9=kg|JNZYsi(Y3Ah5fY zE3+9huY$b3f)&uo(ux`Il-CGk>2Ax+&nNPfSH%isW9!Z=F7%XF-U;mFs^|O}XoVTV ze94EWyzfEoZaP-3@=gxUPL5WN?#yCOc{QvYZT|hVz<*Ye`9Dg#@^C2oHT=$ub?l6? z#n>{^Xm&HGkYuKWnVQO$VFqIxWJ!?}eGl-DIqN-B?X5|%g8TRke8E_*FvZ&E!Wf5*VolXA`Mp&(S}Ai6cTB=ehtoy zVrgkW;+Ohs3Jp&O6| zSD;Fu%6gzWjIu0rB*@XwcUOFogK^W|M%C2o?!yDoSxS>=d!65>CmQTKk2!yv);_S^ z{>ypw!I*JQtBkPkv*#qKfKaX|3$xs!J=Zx&+c!f?Z+SK(6Qwz(fA5rG`4OEM^pKpS zI;t}kVxhA2j!tEox#PI^fX?lhH-iD2&zPFtO<*%hUa&rCTD8-uFPvY7Hcv2ri;tmQ zQSQGqZrVNKR{qAiIOa6DwF>BCDpOUlF~>ER`#K z;oifN*LP9j?WFa^}Yl8{QdAEUq1(oxFKznM2}`%L~?`>jXpU(?q_cGD1#q$aMj(`xwQ?iS8!WPZ;k{( z09`+g!s-v>`ycMR_9-s;I#;e>aE2wO$oz*dn$K#($we{R4KCJ-HO8xd&-B*b8g5;fnUlKDMnemcii_eq-rSe*q%Uh zdwUzZLZrCAqEB=mHxVJDbnw3J;D;cqkc(t{mm5wvquBZhEvGZ`7QJI*%tq&%;TO=E zqNa{X-jp!h32mpKm6#~(lX7;NDuEm#3;J`5PJ1R8mK#bdW+cIeJw$n^f@Emcm%|j+ zKrf?f^~o0|k=605oGlIYs|hV7cl^&u&L8;J_m7vo*;>vvnxS!Z99>HT$fU~KxC+~D z6V1#E9t;tw>{DTC*rf2ovK?xpn=^|^H-f9Wb0Rn4{$92+RI0dtQff$Wu*cZOMkHhgIE7#rJTaE(du+l;=7) zpEz!T&@MBU&xTS_9k2r(?ry_~53N_GwPIgyV;FX(>kj`tZ>}DH<4!x_*$3!djDSslf@XTk2#8h2CDYi@*7@KuviUlb%oa$WVxK~)5A!Vy+Hrl!;Q@4+Pgy2 z0~7M=i)Ey{ZT9LEV+tyLJW@=FGW2x6ZW_Nxpmhj&qLr66coidfRnhKHqTEH_Mn9#Z zqB7bnBsig?#8V?))s$}Y*Q!5w#q?}r?7@rQ#8XD{%h-=-%5;IGr{@9?qR=gPY%TM? z6pcRAq+2G<-y$uTb<{pvT3a`?A^+u`fSowmC?Ueh##_}pSX0hbcLn+J3h+0b#2vu5 z0h6p8YXC!rIX!t!iW>n4>;!fTuMlm8u_li>N9PC%wWNMtKlZ|?L&f=+r z@UzL2_8eD6NZRWn$!a82Fw0-*W%9?ZH&D;+u538lzyA*wW$jqb(w^9NbGrdb zIUOe(Io&fY;?}>qpYe@6o=|(7&u+Y6@uUW&Vx*JJ*ta9QJ#X-M(KTs$WV>1a)OwdX zY;~+hOtbNjJzE;_Hd*Y!;59k4&cj}YA2TmgkNW(Bk3CsKSxC8OXbD!WcA{GChv?gkfaDvpS!{IH_v~ ziGLbeEa6Y|FI3{+Qb~VDHTy|jvyB@b$U$0SFeEGnV}=9wL<|OJ3(hIv+z#A>k1?2a zpt}W4bvTz7Y|9GgAW^pFI1CPp#ejDl9!J0$!`C?Q*#C9SDU8RC@CKbU$}c=TWRLlp zHQXSUF9+PX-T|h(FkfT%&nLJyjN=2xAhBflqV&H8l0+opiAW#h4{Xt5FAikzPmBnf z{UsO{Oa2AJgHcO)crtiem&6hW=y3lC#)136*v#g>P`-3RtBV4p$_ z_TeG1i^T#qGISm<9J$yTfpe-Y($$hkz>(N&4v9^~Vktf(43@$ovvFiB+YC?i@*$Er zW;ic14#k_mVUvkoYzmR=<;}*j*<=n2&t_w=>yZC{3irjL*%QtR3;$j+crqSOh8r4g IbhLy26GB*d&;S4c literal 0 HcmV?d00001 diff --git a/bibliography b/bibliography new file mode 100644 index 0000000..4fac476 --- /dev/null +++ b/bibliography @@ -0,0 +1,13 @@ +%K a-universe-from-nothing +%A Lawrence Krauss +%T a Universe from Nothing +%D 2012 +%I Simon & Schuster + +%K learnhaskell +# \o = following symbols are overlapping in the same space +# \[ah] = caron accent +%A Miran Lipova\o'c\[ah]'a +%T Learn You a Haskell for Great Good! +%D 2011 +%I No Starch Press diff --git a/bin/ghighlight b/bin/ghighlight new file mode 100755 index 0000000..d3903d7 --- /dev/null +++ b/bin/ghighlight @@ -0,0 +1,286 @@ +#! /usr/bin/env perl + +# ghighlight - A simple preprocessor for adding code highlighting in a groff file + +# Copyright (C) 2014-2018 Free Software Foundation, Inc. + +# Written by Bernd Warken . + +my $version = '0.9.0'; + +# This file is part of 'ghighlight', which is part of 'groff'. + +# 'groff' is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +# 'groff' is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You can find a copy of the GNU General Public License in the internet +# at . + +######################################################################## + +use strict; +use warnings; +#use diagnostics; + +# current working directory +use Cwd; + +# $Bin is the directory where this script is located +use FindBin; + +# open3 for a bidirectional communication with a child process +use IPC::Open3; + + +######################################################################## +# system variables and exported variables +######################################################################## + +$\ = "\n"; # final part for print command + +######################################################################## +# read-only variables with double-@ construct +######################################################################## + +our $File_split_env_sh; +our $File_version_sh; +our $Groff_Version; + +my $before_make; # script before run of 'make' +{ + my $at = '@'; + $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}"; +} + +my %at_at; +my $file_perl_test_pl; +my $groffer_libdir; + +if ($before_make) { + my $highlight_source_dir = $FindBin::Bin; + $at_at{'BINDIR'} = $highlight_source_dir; + $at_at{'G'} = ''; +} else { + $at_at{'BINDIR'} = '@BINDIR@'; + $at_at{'G'} = '@g@'; +} + + +######################################################################## +# options +######################################################################## + +foreach (@ARGV) { + if ( /^(-h|--h|--he|--hel|--help)$/ ) { + print q(Usage for the 'ghighlight' program:); + print 'ghighlight [-] [--] [filespec...] normal file name arguments'; + print 'ghighlight [-h|--help] gives usage information'; + print 'ghighlight [-v|--version] displays the version number'; + print q(This program is a 'groff' preprocessor that handles highlighting source code ) . + q(parts in 'roff' files.); + exit; + } elsif ( /^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/ ) { + print q('ghighlight' version ) . $version; + exit; + } +} + +my $macros = "groff_mm"; +if ( $ENV{'GHLENABLECOLOR'} ) { + $macros = "groff_mm_color"; +} +######################################################################## +# input +######################################################################## + +my $source_mode = 0; + +my @lines = (); + + +sub getTroffLine { + my ($opt) = @_; + if ($opt =~ /^ps=([0-9]+)/) {".ps $1"} + elsif ($opt =~ /^vs=(\S+)/) {".vs $1"} + else { print STDERR "didn't recognised '$opt'"; ""} +} + +sub getTroffLineOpposite { + my ($opt) = @_; + if ($opt =~ /^ps=/) {".ps"} + elsif ($opt =~ /^vs=/) {".vs"} + else { print STDERR "didn't recognised '$opt'"; ""} +} + +# language for codeblocks +my $lang = ''; +my @options = (); +foreach (<>) { + chomp; + s/\s+$//; + my $line = $_; + my $is_dot_Source = $line =~ /^[.']\s*(``|SOURCE)(|\s+.*)$/; + + unless ( $is_dot_Source ) { # not a '.SOURCE' line + if ( $source_mode ) { # is running in SOURCE mode + push @lines, $line; + } else { # normal line, not SOURCE-related + print $line; + } + next; + } + + + ########## + # now the line is a '.SOURCE' line + + my $args = $line; + $args =~ s/\s+$//; # remove final spaces + $args =~ s/^[.']\s*(``|SOURCE)\s*//; # omit .source part, leave the arguments + + my @args = split /\s+/, $args; + + ########## + # start SOURCE mode + + $lang = $args[0] if ( @args > 0 && $args[0] ne 'stop' ); + + if ( @args > 0 && $args[0] ne 'stop' ) { + # For '.``' no args or first arg 'start' means opening 'SOURCE' mode. + # Everything else means an ending command. + + shift @args; + @options = @args; + + if ( $source_mode ) { + # '.SOURCE' was started twice, ignore + print STDERR q('.``' starter was run several times); + next; + } else { # new SOURCE start + $source_mode = 1; + @lines = (); + next; + } + } + + ########## + # now the line must be a SOURCE ending line (stop) + + unless ( $source_mode ) { + print STDERR 'ghighlight.pl: there was a SOURCE ending without being in ' . + 'SOURCE mode:'; + print STDERR ' ' . $line; + next; + } + + $source_mode = 0; # 'SOURCE' stop calling is correct + + my $shopts = $ENV{"SHOPTS"} || ""; + + ########## + # Run source-highlight on lines + # Check if language was specified + my $cmdline = "source-highlight -f $macros $shopts --output STDOUT"; + if ($lang ne '') { + $cmdline .= " -s $lang"; + } + + # Start `source-highlight` + my $pid = open3(my $child_in, my $child_out, my $child_err, $cmdline) + or die "open3() failed $!"; + + # Provide source code to `source-highlight` in its standard input + print $child_in $_ for @lines; + close $child_in; + + if (my $v = $ENV{"GH_INTRO"}) { + print for split /;/, $v; + } + + for (@options) { + my $l = getTroffLine $_; + print $l if ($l ne ""); + } + + # Print `source-highlight` output + while (<$child_out>) { + chomp; + print; + } + close $child_out; + + for (reverse @options) { + my $l = getTroffLineOpposite $_; + print $l if ($l ne ""); + } + + if (my $v = $ENV{"GH_OUTRO"}) { + print for split /;/, $v; + } + + my @print_res = (1); + + # Start argument processing + + # remove 'stop' arg if exists + # shift @args if ( $args[0] eq 'stop' ); + + # if ( @args == 0 ) { + # # no args for saving, so @print_res doesn't matter + # next; + # } + # my @var_names = (); + # my @mode_names = (); + + # my $mode = '.ds'; + # for ( @args ) { + # if ( /^\.?ds$/ ) { + # $mode = '.ds'; + # next; + # } + # if ( /^\.?nr$/ ) { + # $mode = '.nr'; + # next; + # } + # push @mode_names, $mode; + # push @var_names, $_; + # } + + # my $n_vars = @var_names; + + # if ( $n_vars < $n_res ) { + # print STDERR 'ghighlight: not enough variables for Python part: ' . + # $n_vars . ' variables for ' . $n_res . ' output lines.'; + # } elsif ( $n_vars > $n_res ) { + # print STDERR 'ghighlight: too many variablenames for Python part: ' . + # $n_vars . ' variables for ' . $n_res . ' output lines.'; + # } + # if ( $n_vars < $n_res ) { + # print STDERR 'ghighlight: not enough variables for Python part: ' . + # $n_vars . ' variables for ' . $n_res . ' output lines.'; + # } + + # my $n_min = $n_res; + # $n_min = $n_vars if ( $n_vars < $n_res ); + # exit unless ( $n_min ); + # $n_min -= 1; # for starting with 0 + + # for my $i ( 0..$n_min ) { + # my $value = $print_res[$i]; + # chomp $value; + # print $mode_names[$i] . ' ' . $var_names[$i] . ' ' . $value; + # } +} + + +1; +# Local Variables: +# mode: CPerl +# End: diff --git a/bin/utf8-to-ms.sh b/bin/utf8-to-ms.sh new file mode 100755 index 0000000..70337db --- /dev/null +++ b/bin/utf8-to-ms.sh @@ -0,0 +1,147 @@ +#!/bin/sh + +# This program isn't by any mean complete. +# Most of text markers, accents and ligatures are handled. +# However, nothing else currently is. +# Please, do provide more translations. + +# Convert input into hexadecimal and a single byte per line. +to_hex_one_column() xxd -p -c 1 + +# Reverse hexadecimal to original value. +from_hex() xxd -p -r + +regroup_lines() awk ' + BEGIN { + line_start=1 + } + + { + if (line_start == 1) + line = $1; + else + line = line " " $1; + + line_start = 0; + if ($1 == "0a") { + print line; + line_start = 1 + } + } + + END { + if (line_start == 0) + print line + } + ' + +accents() sed \ + -e "s/c3 81/5c 5b 27 41 5d/g"\ + -e "s/c3 89/5c 5b 27 45 5d/g"\ + -e "s/c3 8d/5c 5b 27 49 5d/g"\ + -e "s/c3 93/5c 5b 27 4f 5d/g"\ + -e "s/c3 9a/5c 5b 27 55 5d/g"\ + -e "s/c3 9d/5c 5b 27 59 5d/g"\ + -e "s/c3 a1/5c 5b 27 61 5d/g"\ + -e "s/c3 a9/5c 5b 27 65 5d/g"\ + -e "s/c3 ad/5c 5b 27 69 5d/g"\ + -e "s/c3 b3/5c 5b 27 6f 5d/g"\ + -e "s/c3 ba/5c 5b 27 75 5d/g"\ + -e "s/c3 bd/5c 5b 27 79 5d/g"\ + -e "s/c3 84/5c 5b 3a 41 5d/g"\ + -e "s/c3 8b/5c 5b 3a 45 5d/g"\ + -e "s/c3 8f/5c 5b 3a 49 5d/g"\ + -e "s/c3 96/5c 5b 3a 4f 5d/g"\ + -e "s/c3 9c/5c 5b 3a 55 5d/g"\ + -e "s/c3 a4/5c 5b 3a 61 5d/g"\ + -e "s/c3 ab/5c 5b 3a 65 5d/g"\ + -e "s/c3 af/5c 5b 3a 69 5d/g"\ + -e "s/c3 b6/5c 5b 3a 6f 5d/g"\ + -e "s/c3 bc/5c 5b 3a 75 5d/g"\ + -e "s/c3 bf/5c 5b 3a 79 5d/g"\ + -e "s/c3 82/5c 5b 5e 41 5d/g"\ + -e "s/c3 8a/5c 5b 5e 45 5d/g"\ + -e "s/c3 8e/5c 5b 5e 49 5d/g"\ + -e "s/c3 94/5c 5b 5e 4f 5d/g"\ + -e "s/c3 9b/5c 5b 5e 55 5d/g"\ + -e "s/c3 a2/5c 5b 5e 61 5d/g"\ + -e "s/c3 aa/5c 5b 5e 65 5d/g"\ + -e "s/c3 ae/5c 5b 5e 69 5d/g"\ + -e "s/c3 b4/5c 5b 5e 6f 5d/g"\ + -e "s/c3 bb/5c 5b 5e 75 5d/g"\ + -e "s/c3 80/5c 5b 60 41 5d/g"\ + -e "s/c3 88/5c 5b 60 45 5d/g"\ + -e "s/c3 8c/5c 5b 60 49 5d/g"\ + -e "s/c3 92/5c 5b 60 4f 5d/g"\ + -e "s/c3 99/5c 5b 60 55 5d/g"\ + -e "s/c3 a0/5c 5b 60 61 5d/g"\ + -e "s/c3 a8/5c 5b 60 65 5d/g"\ + -e "s/c3 ac/5c 5b 60 69 5d/g"\ + -e "s/c3 b2/5c 5b 60 6f 5d/g"\ + -e "s/c3 b9/5c 5b 60 75 5d/g"\ + -e "s/c3 83/5c 5b 7e 41 5d/g"\ + -e "s/c3 91/5c 5b 7e 4e 5d/g"\ + -e "s/c3 95/5c 5b 7e 4f 5d/g"\ + -e "s/c3 a3/5c 5b 7e 61 5d/g"\ + -e "s/c3 b1/5c 5b 7e 6e 5d/g"\ + -e "s/c3 b5/5c 5b 7e 6f 5d/g"\ + -e "s/c3 87/5c 5b 2c 43 5d/g"\ + -e "s/c3 a7/5c 5b 2c 63 5d/g"\ + -e "s/c3 85/5c 5b 6f 41 5d/g"\ + -e "s/c3 a5/5c 5b 6f 61 5d/g"\ + -e "s/c5 b8/5c 5b 3a 59 5d/g"\ + -e "s/c5 a0/5c 5b 76 53 5d/g"\ + -e "s/c5 a1/5c 5b 76 73 5d/g"\ + -e "s/c5 bd/5c 5b 76 5a 5d/g"\ + -e "s/c5 be/5c 5b 76 7a 5d/g" + +# Ligatures. +ligatures() sed \ + -e "s/ef ac 80/5c 5b 66 66 5d/g"\ + -e "s/ef ac 81/5c 5b 66 69 5d/g"\ + -e "s/ef ac 82/5c 5b 66 6c 5d/g"\ + -e "s/ef ac 83/5c 5b 46 69 5d/g"\ + -e "s/ef ac 84/5c 5b 46 6c 5d/g"\ + -e "s/c5 81/5c 5b 2f 4c 5d/g"\ + -e "s/c5 82/5c 5b 2f 6c 5d/g"\ + -e "s/c3 98/5c 5b 2f 4f 5d/g"\ + -e "s/c3 b8/5c 5b 2f 6f 5d/g"\ + -e "s/c3 86/5c 5b 41 45 5d/g"\ + -e "s/c3 a6/5c 5b 61 65 5d/g"\ + -e "s/c5 92/5c 5b 4f 45 5d/g"\ + -e "s/c5 93/5c 5b 6f 65 5d/g"\ + -e "s/c4 b2/5c 5b 49 4a 5d/g"\ + -e "s/c4 b3/5c 5b 69 6a 5d/g"\ + -e "s/c4 b1/5c 5b 2e 69 5d/g"\ + -e "s/c8 b7/5c 5b 2e 6a 5d/g" + +# Text markers. +text_markers() sed \ + -e "s/e2 97 8b/5c 5b 63 69 5d/g"\ + -e "s/e2 80 a2/5c 5b 62 75 5d/g"\ + -e "s/e2 80 a1/5c 5b 64 64 5d/g"\ + -e "s/e2 80 a0/5c 5b 64 67 5d/g"\ + -e "s/e2 97 8a/5c 5b 6c 7a 5d/g"\ + -e "s/e2 96 a1/5c 5b 73 71 5d/g"\ + -e "s/c2 b6/5c 5b 70 73 5d/g"\ + -e "s/c2 a7/5c 5b 73 63 5d/g"\ + -e "s/e2 98 9c/5c 5b 6c 68 5d/g"\ + -e "s/e2 98 9e/5c 5b 72 68 5d/g"\ + -e "s/e2 86 b5/5c 5b 43 52 5d/g"\ + -e "s/e2 9c 93/5c 5b 4f 4b 5d/g" + +# These markers shouldn't be automatically translated in ms macros. +# @ "s/40/5c 5b 61 74 5d/g" +# # "s/23/5c 5b 73 68 5d/g" + +# Legal symbols. +legal_symbols() sed \ + -e "s/c2 a9/5c 5b 63 6f 5d/g"\ + -e "s/c2 ae/5c 5b 72 67 5d/g"\ + -e "s/e2 84 a2/5c 5b 74 6d 5d/g" + +hexutf8_to_hexms() { + text_markers | accents | ligatures | legal_symbols +} + +to_hex_one_column | regroup_lines | hexutf8_to_hexms | from_hex diff --git a/header.ms b/header.ms new file mode 100644 index 0000000..27bf733 --- /dev/null +++ b/header.ms @@ -0,0 +1,21 @@ +.TL +Troff template (batteries included) +.AU +Philippe Pittoli +. \" In case you don't want an abstract: +. \" .AB no +.AB +This document provides a few hints on how to start writing documentation with +.B troff . +It represents your first steps with the tool, and the simplest commands are presented along with some personal macros to help you getting started. +.SHINE "Take what you need from this document." + +The source code of this document contains many useful comments. +.br +Also, it is customary in old tools such as troff to read the source code and hack your way. +Once you're familiar with the basics, if you need something that isn't in the official troff documentation, don't hesitate to read provided macros (mines, but also ms macros as well, for instance). +You'll quickly learn a lot. +.LP +Lastly compiled the +.SHINE \n(dy/\n(mo/2021 \" is \n(yr broken? +.AE diff --git a/macros.ms b/macros.ms new file mode 100644 index 0000000..eab81e7 --- /dev/null +++ b/macros.ms @@ -0,0 +1,186 @@ +.\" .RP = report document +.nr PO 0.5i \" page offset default 1i +.nr LL 7.5i \" line length default 6i +.nr FM 0.5i \" page foot margin default 1i +.R1 +no-label-in-reference +accumulate +.R2 +.nr DI 0 +.nr FF 3 \" footnotes' type: numbered, with point, indented +.de BELLOWEXPLANATION1 +.sp 0.5 +.ps 7 \" point size (~= font size) +.vs 8p \" vertical spacing between lines +.. +.de BELLOWEXPLANATION2 +.br +.ps 9 +.vs 11p +.. +.defcolor darkgreen rgb 0.1 0.5 0.2 +.defcolor darkblue rgb 0.3 0.3 0.7 +.defcolor darkred rgb 0.7 0.3 0.3 +.de CONSTRUCTOR +.gcolor darkred +.ps 8 +.ft CW +\\$1 +.ft R +.gcolor +.ps +.. +.de TYPE +.gcolor darkgreen +.ps 8 +.ft CW +\\$1 +.ft R +.gcolor +.ps +.. +.de MODULE +.gcolor darkblue +.ps 8 +.ft CW +\\$1 +.ft R +.gcolor +.ps +.. +.de SHINE +.gcolor darkblue +.ft B +\\$1 +.ft R +.gcolor +.. +.de MODULEX +.MODULE "\\$1," +.. +.de TBD +.ft B +To be defined or to finish. +.ft R +.. +\# Bullet points +.de BULLET +.IP \(bu 2 +.. +.de ENDBULLET +.in -2 \" indent +.. +. +\# Begin code box +.de b1 +.B1 +.sp 0.2 +.ft CW +.. +. +\# End code box +.de b2 +.sp 0.5 +.B2 +.ft +.. +.de HORIZONTALLINE +\l'15' +.. +.de SMALLFONT +.ps 8 +.vs 9p +.. +.de NORMALFONT +.vs +.ps +.. +.de COMMAND1 +.b1 +.. +.de COMMAND2 +.b2 +.. +.de COMMANDNAME +.I "\\$1" +.. +.de FUNCTION +.I "\\$1" "\\$2" +.. +.de TYPECLASS +.I "\\$1" "\\$2" +.. +.de OPERATOR +.I "\\$1" "\\$2" +.. +.de QUESTION +.I "\\$1" "\\$2" +\h'5p' +.. +.\" MS Accents +.\".AM +.defcolor citation rgb 0.4 0.4 0.4 +.defcolor citationbar rgb 0.3 0.3 0.7 +.de CITATION1 +.KS \" start a keep +.ft I \" citation in italics +.mk C \" set a marker for line drawing +.in +1 \" indent a bit +.gcolor citation +.. +.de CITATION2 +.mk D \" set second marker to come back here +.ft \" back to previous font +.in -1 \" remove indent +.gcolor \" remove previous color +.gcolor citationbar +\r\L'|\\nCu' \" draw line (\r moves upward, \L draw the line, ...) +.sp '|\\nDu' \" return to the second marker +.gcolor \" remove previous color +.sp -2 \" get two lines back +.KE \" end of the keep +.. +.de NAMECITATION +.ps -2 +\(em\h'1'\\$* +.ps +.. +.defcolor explanation rgb 0.7 0.4 0.4 +.defcolor explanationbar rgb 0.8 0.3 0.3 +.de EXPLANATION1 +.KS \" start a keep +.ft B \" citation in italics +.mk C \" set a marker for line drawing +.in +1 \" indent a bit +.gcolor explanation +.. +.de EXPLANATION2 +.ft \" back to previous font +.in -1 \" remove indent +.gcolor \" remove previous color +.gcolor explanationbar +\r\L'|\\nCu' \" draw line (\r moves upward, \L draw the line, ...) +.gcolor \" remove previous color +.sp -1 \" get two lines back +.KE \" end of the keep +.. +.de METAINFO1 +.ft CW \" constant width font +.ps 8 \" small font +.vs 9p \" smaller vertical spacing between lines +.. +.de METAINFO2 + +.vs \" come back to the previous vertical spacing +.ps \" come back to the previous point size +.ft \" come back to the previous font +.sp -1 \" return one line above +.. +.de PRETTY_PERCENTAGE +\v'-.7m\s[\\n(.s*6u/10u]+.7m'\\$1\v'-.7m\s0+.7m'\ +\(f/\s[\\n(.s*6u/10u]\\$2\s0 +.. +.de TWO_COLUMNS +.2C +.nr pg@fn-colw \\n[pg@colw] \" footnotes' column width +.. diff --git a/main.ms b/main.ms new file mode 100644 index 0000000..48fb333 --- /dev/null +++ b/main.ms @@ -0,0 +1,412 @@ +. \" comments start with: \" +. \" lines containing only a point: ignored by troff +. \" empty lines = paragraph separator, produce vertical space +.so macros.ms \" First, let's import some macros. +.so header.ms +.TWO_COLUMNS +.NH \" new section +Sections and paragraphs +.PP \" new paragraph (with indentation on first line) +Some indented paragraph. +As you can see, contrary to the first one you encountered in the previous section. +.NH 2 \" new inner section, goes from 1 to 4 +Sub-section +.LP +Some unindented paragraph. + +Basics of sections and paragraphs in troff (ms macros): +.METAINFO1 + .NH + Section + .PP + Some indented paragraph. + .NH 2 + Sub-section + .LP + Some unindented paragraph. +.METAINFO2 + +.NH +Some highlights: the basics +.LP +.I "Combining" \" italics +.UL "several" \" underlined +.B "ways" \" bold +to +.BX highlight \" box +.ft CW \" changing font: constant width +some text. +.ft \" reverting to previous font + +.METAINFO1 + .I "Combining" \\" italics + .UL "several" \\" underlined + .B "ways" \\" bold + to + .BX highlight \\" box + .ft CW \\" changing font: constant width + some text. + .ft \\" reverting to previous font +.METAINFO2 + +Avoiding underlining the +.UL "final point" . + +.METAINFO1 + .UL "final point" . \\" point is a second parameter +.METAINFO2 + +.I "Again, in italics but surrounded" ) ( \" order: text-in-italics after before + +.METAINFO1 + .I "Again, in italics but surrounded" ) ( + \\" order: text-in-italics after before +.METAINFO2 + +.NH +Brief overview of custom macros (in macros.ms) +.LP +The file +.ft CW +macros.ms +.ft +includes many small contributions to easily make nice PDF outputs. +For example, the following code and its result: +.METAINFO1 + .EXPLANATION1 + Very important sentence. + .EXPLANATION2 +.METAINFO2 + +.EXPLANATION1 +Very important sentence. +.EXPLANATION2 + +.HORIZONTALLINE + +There is also an helper to make citations. +.METAINFO1 + .CITATION1 + Seriously, these macros are awesome guys. + .CITATION2 + .NAMECITATION "Albert Einstein" +.METAINFO2 + +.CITATION1 +Seriously, these macros are awesome guys. +.CITATION2 +.NAMECITATION "Albert Einstein" + +.HORIZONTALLINE + +(Temporary name for the following macro) +.ft CW + .PRETTY_PERCENTAGE 5.5 20 +.ft +.br +Produces: +.PRETTY_PERCENTAGE 5.5 20 + +.HORIZONTALLINE + +Meta informations are in smaller text size and in constant width, with this code: +.METAINFO1 + .METAINFO1 + Some text. + .METAINFO2 +.METAINFO2 + +Example: +.br +.METAINFO1 +This is how I put meta informations in my documents: the text is smaller and in constant width. +.METAINFO2 + +.HORIZONTALLINE + +These horizontal lines are produced by +.METAINFO1 + .HORIZONTALLINE +.METAINFO2 + +.HORIZONTALLINE + +Listing stuff +.BULLET +with +.BULLET +bullet +.BULLET +points +.ENDBULLET + +.METAINFO1 + .BULLET + with + .BULLET + bullet + .BULLET + points + .ENDBULLET +.METAINFO2 + +.NH +Source code syntax highlighting +.PP +Source code for a number of languages can be colored with the following code\*[*]: +.FS \" footnote starts (\*[*] is its reference) +Under the hood, this involves the +.ft CW +source-highlight +.ft +software and the script +.ft CW +ghighlight +.ft +in the \f(CW./bin/\f[] directory (see the Makefile for more information). +.FE \" footnote ends + +.METAINFO1 + .SOURCE C + int main(int argc, char **argv) { + return 0; + } + .SOURCE +.METAINFO2 + +.SOURCE C +int main(int argc, char **argv) { + return 0; +} +.SOURCE + +.NH \" new section +Some figures with pic. +.LP \" new paragraph (without indentation on first line) +This is a paragraph before the picture. +.PS \" this starts a 'pic' section, to draw figures +.defcolor lightgreen rgb 0.9 1.0 0.9 +box "A box." shaded "lightgreen" +line +circle "A circle." rad 0.4 +.PE \" this ends the 'pic' section + +This is written in the code this way: +.METAINFO1 + .PS + .defcolor lightgreen rgb 0.9 1.0 0.9 + box "A box." shaded "lightgreen" + line + circle "A circle." rad 0.4 + .PE +.METAINFO2 + +.NH +Some graphs with grap. +.LP +.G1 +GROWTHFACTOR=0.07 +grid bot dotted from 0 to 100 by 10 +grid left dotted from 0 to 800 by 50 +frame ht 2.5 wid 2.8 +define expo { $1+$1*GROWTHFACTOR } +value = 1 +draw LINEAR solid +for i from 1 to 100 by 1 do { + next LINEAR at i, i + times at i, value + value = expo(value) +} +line from 0,650 to 3,650 +" linear curve" ljust at 1,650 +" exponential curve" ljust at 1,600 +times at 1,600 +label top "Exponential curves: growth over time (7%)" up -.2 +.G2 +.BELLOWEXPLANATION1 +Exponentials: always fun and games when talking about economy. +A complete nighmare when talking about mineral extraction costs. +.BELLOWEXPLANATION2 + +.METAINFO1 + .G1 + GROWTHFACTOR=0.07 + grid bot dotted from 0 to 100 by 10 + grid left dotted from 0 to 800 by 50 + frame ht 2.5 wid 2.8 + define expo { $1+$1*GROWTHFACTOR } + value = 1 + draw LINEAR solid + for i from 1 to 100 by 1 do { + next LINEAR at i, i + times at i, value + value = expo(value) + } + line from 0,650 to 3,650 + " linear curve" ljust at 1,650 + " exponential curve" ljust at 1,600 + times at 1,600 + label top "Exponential curves: growth over time (7%)" up -.2 + .G2 +.METAINFO2 + +.\" Neighbor Discovery, RS... IPv6 stuff +.\" .PS +.\" reset +.\" space_between_machines = 2.0 +.\" space_lines = 0.1 +.\" space_hdr = 0.8 +.\" space_step = 0.3 +.\" space_step_small = 0.2 +.\" +.\" .ps 16 +.\" A: "A" ; move space_between_machines +.\" R: "R" ; move space_between_machines +.\" B: "B" +.\" +.\" .ps 12 +.\" move to A + (0, -space_hdr) +.\" "start" rjust; move down space_lines +.\" START: line left ; move right; move right space_between_machines; move down space_step +.\" DAD_SOL: line right ; move to START + (0, -space_step) +.\" RS_A: line left ; move right; move right space_between_machines; move down space_step +.\" RS_B: line right ; move left ; move down space_step_small +.\" RS_C: line right ; move left ; move left space_between_machines; move down space_step +.\" RS_D: line left "New IP @" "" ; move right +.\" move down space_step_small +.\" DAD_SEC_A: line left ; move right; move right space_between_machines; move down space_step +.\" DAD_SEC_B: line right ; move to DAD_SEC_A + (0, -space_step) +.\" +.\" +.\" .ps 8 +.\" line -> from START to DAD_SOL "DAD: Neighbor Sollicitation" "" "" +.\" line -> from RS_A to RS_B "Router Sollicitation" "" "" +.\" line -> from RS_C to RS_D "Router Advertisment" "" "" +.\" line -> from DAD_SEC_A to DAD_SEC_B "(second) DAD: Neighbor Sollicitation" "" "" +.\" .PE + +.NH +Some equations with eqn +.LP +Let's see a few equations. +.EQ +E = mc sup 2 +.EN +.METAINFO1 + .EQ + E = mc sup 2 + .EN +.METAINFO2 + +Inline equations, via the "\[Do]" sign: +.METAINFO1 + .EQ + delim \[Do]\[Do] + .EN + Inlining equations also is possible: \[Do]a sup b = c\[Do] +.METAINFO2 + +.EQ +delim $$ +.EN +.\" \h'5p' => horizontal space +Inlining equations also is possible:\h'5p' $a sup b = c$ +.EQ +delim off +.EN +And this can be set off, with "delim off". + +.NH +UTF-8 +.PP +UTF-8 is wonderful. +Unfortunately, this wasn't implemented in troff, since it comes from 1972, and neither in the later implementation +.B groff . +So, I wrote the \f[CW]./bin/utf8-to-ms.sh\f[] filter to automatically convert an extensive list of accents, ligatures, and text markers in their equivalent ms macros. +Therefore, one can write in UTF-8 (or at least a good chunk of it) in the input file\*[*]. +.FS +All characters cannot be converted so easily. +Some of them are used in troff, such as the arobase, the backslash, etc. +However, my script is a good enough solution for me to write in my mother tongue without any problem. +.FE + +Examples (all written in UTF-8 in the troff file): +.br +©®àÀÇçéÉÙÛâÂÔ¡¿œŒæÆ + +.NH +Tables with tbl +.PP +.TS +allbox tab(:); +c | c +c | lew(2.5i). +Column1 : Column2 +cell : cell content +cell :T{ +Hello this is a way longer content, way more than what the cell can hold in a single line. +T} +.TE +.METAINFO1 + .TS + allbox tab(:); + c | c + c | lew(2.5i). + Column1 : Column2 + cell : cell content + cell :T{ + Hello this is a way longer content, way more than what the cell can hold in a single line. + T} + .TE +.METAINFO2 + +.NH +Some references +.PP +Let's reference a few documents, such as A Universe from Nothing +.[ +universe +.] +and a book about the excellent Haskell language. +.[ +haskell +.] + +.METAINFO1 + Let's reference a few documents, such as A Universe from Nothing + .[ + universe + .] + and a book about the excellent Haskell language. + .[ + haskell + .] +.METAINFO2 + +.NH +Images +.PP +Only PDF can be included, so images need to be converted beforehand. + +.METAINFO1 + .PDFPIC -R "./are-you.pdf" 3.5 +.METAINFO2 +. +.nr figurespace 17 +.sp \n[figurespace] +.PDFPIC -R "./are-you.pdf" 3.5 +.sp \n[figurespace] + +.METAINFO1 +Note: for now, on my system, I need a hack. +The included PDF has no length, despite having installed the poppler-utils package. +So, I added spaces by hand. +I'll try to search for a better way, someday. +.METAINFO2 + +.METAINFO1 + .nr figurespace 17 + .sp \\n[figurespace] + .PDFPIC -R "./are-you.pdf" 3.5 + .sp \\n[figurespace] +.METAINFO2