* Re: [9front] WANTED: instructions for adding fonts to troff
@ 2017-12-13 0:07 Travis Moore
0 siblings, 0 replies; 6+ messages in thread
From: Travis Moore @ 2017-12-13 0:07 UTC (permalink / raw)
To: 9front
[-- Attachment #1: Type: text/plain, Size: 2444 bytes --]
> I'd like to expand the font options for troff in my installation.
> How might this be accomplished?
I've kept your mail in my inbox for nearly a year because I'd been
meaning to look into this. I finally got around to it and figured out
a method of sorts:
1. Obtain postscript versions of the font.
The file with the font data has the extension .pfa or .pfb
The file with the font metrics has the extension .afm
I tested on the following materials:
http://mirrors.ctan.org/fonts/urw/garamond.zip
https://www.math.utah.edu/~beebe/fonts/urwfonts-1.0.zip
https://www.math.utah.edu/~beebe/fonts/utopia-1.0.zip
https://www.math.utah.edu/~beebe/fonts/charter-1.0.zip
Apparently there are tools to convert from other formats.
2. Convert the font metrics to a troff font description.
The attached awk script is something I hacked up to do this:
convpsfont ugmr8a.afm GA # URW Garamond
This creates a file GA which should look something like this:
name GA
fontname GaramondNo8-Reg
spacewidth 26
charset
! 26 2 33
" 42 2 34
&c...
Choose a name not in conflict with those in /sys/lib/troff/font/devutf/
Check the contents of this file makes sense; I haven't tested
many fonts and my script may need adjustment or the output may
need to be tweaked by hand. The troff font format is described in:
/sys/doc/troff.ps!32
The .afm format can be found at:
http://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5004.AFM_Spec.pdf
Put the resulting file GA in /sys/lib/troff/font/devutf/
or else use troff's -F flag to point to the dir that holds it.
You can now rm the .afm file or else keep it with its .pfa/.pfb
3. Let postscript see the font.
Put the font (.pfa/.pfb) in /sys/lib/postscript/font/
I put mine in a subdir called useradded.
Add an entry at the bottom of /sys/lib/postscript/font/fontmap:
% fonts added by user
GaramondNo8-Reg useradded/ugmr8a.pfb
Create a file called /sys/lib/postscript/troff/GA:
0x0000 0x00ff GaramondNo8-Reg
0x2010 0x2044 GaramondNo8-Reg
0xfb00 0xfb06 GaramondNo8-Reg
You can use other fonts for ranges missing from your font.
4. Let ghostscript see the font.
cd /sys/lib/ghostscript/font && mk
5. Test.
echo '.sp 1i
.ft GA
.ps 14
Pack my box with five dozen liquor jugs.
ø ß á ä à æ ¼ ½ ¾ © ¶ §' | troff | page
ps2pdf will embed the font and make it printable everywhere.
Hope this is useful to someone,
Travis
[-- Attachment #2: convpsfont --]
[-- Type: text/plain, Size: 13509 bytes --]
#!/bin/awk -f
# convert postscript font metrics to font description for troff
# usage: convpsfont font.afm TFONT
BEGIN {
name = ARGV[2]
ARGV[2] = ""
print "name", name > name
tolerance = 75
# 0021-00ff (Latin), 2010-2044 (punctuation), fb00-fb06 (ligatures)
# if you want more characters add them from adobe's glyph list
codetab["exclam"] = 33
codetab["quotedbl"] = 34
codetab["numbersign"] = 35
codetab["dollar"] = 36
codetab["percent"] = 37
codetab["ampersand"] = 38
codetab["quotesingle"] = 39
codetab["parenleft"] = 40
codetab["parenright"] = 41
codetab["asterisk"] = 42
codetab["plus"] = 43
codetab["comma"] = 44
codetab["hyphen"] = 45
codetab["period"] = 46
codetab["slash"] = 47
codetab["zero"] = 48
codetab["one"] = 49
codetab["two"] = 50
codetab["three"] = 51
codetab["four"] = 52
codetab["five"] = 53
codetab["six"] = 54
codetab["seven"] = 55
codetab["eight"] = 56
codetab["nine"] = 57
codetab["colon"] = 58
codetab["semicolon"] = 59
codetab["less"] = 60
codetab["equal"] = 61
codetab["greater"] = 62
codetab["question"] = 63
codetab["at"] = 64
codetab["A"] = 65
codetab["B"] = 66
codetab["C"] = 67
codetab["D"] = 68
codetab["E"] = 69
codetab["F"] = 70
codetab["G"] = 71
codetab["H"] = 72
codetab["I"] = 73
codetab["J"] = 74
codetab["K"] = 75
codetab["L"] = 76
codetab["M"] = 77
codetab["N"] = 78
codetab["O"] = 79
codetab["P"] = 80
codetab["Q"] = 81
codetab["R"] = 82
codetab["S"] = 83
codetab["T"] = 84
codetab["U"] = 85
codetab["V"] = 86
codetab["W"] = 87
codetab["X"] = 88
codetab["Y"] = 89
codetab["Z"] = 90
codetab["bracketleft"] = 91
codetab["backslash"] = 92
codetab["bracketright"] = 93
codetab["asciicircum"] = 94
codetab["underscore"] = 95
codetab["grave"] = 96
codetab["a"] = 97
codetab["b"] = 98
codetab["c"] = 99
codetab["d"] = 100
codetab["e"] = 101
codetab["f"] = 102
codetab["g"] = 103
codetab["h"] = 104
codetab["i"] = 105
codetab["j"] = 106
codetab["k"] = 107
codetab["l"] = 108
codetab["m"] = 109
codetab["n"] = 110
codetab["o"] = 111
codetab["p"] = 112
codetab["q"] = 113
codetab["r"] = 114
codetab["s"] = 115
codetab["t"] = 116
codetab["u"] = 117
codetab["v"] = 118
codetab["w"] = 119
codetab["x"] = 120
codetab["y"] = 121
codetab["z"] = 122
codetab["braceleft"] = 123
codetab["bar"] = 124
codetab["verticalbar"] = 124
codetab["braceright"] = 125
codetab["asciitilde"] = 126
codetab["exclamdown"] = 161
codetab["cent"] = 162
codetab["sterling"] = 163
codetab["currency"] = 164
codetab["yen"] = 165
codetab["brokenbar"] = 166
codetab["section"] = 167
codetab["dieresis"] = 168
codetab["copyright"] = 169
codetab["ordfeminine"] = 170
codetab["guillemotleft"] = 171
codetab["logicalnot"] = 172
codetab["sfthyphen"] = 173
codetab["softhyphen"] = 173
codetab["registered"] = 174
codetab["macron"] = 175
codetab["overscore"] = 175
codetab["degree"] = 176
codetab["plusminus"] = 177
codetab["twosuperior"] = 178
codetab["threesuperior"] = 179
codetab["acute"] = 180
codetab["mu"] = 181
codetab["mu1"] = 181
codetab["paragraph"] = 182
codetab["middot"] = 183
codetab["periodcentered"] = 183
codetab["cedilla"] = 184
codetab["onesuperior"] = 185
codetab["ordmasculine"] = 186
codetab["guillemotright"] = 187
codetab["onequarter"] = 188
codetab["onehalf"] = 189
codetab["threequarters"] = 190
codetab["questiondown"] = 191
codetab["Agrave"] = 192
codetab["Aacute"] = 193
codetab["Acircumflex"] = 194
codetab["Atilde"] = 195
codetab["Adieresis"] = 196
codetab["Aring"] = 197
codetab["AE"] = 198
codetab["Ccedilla"] = 199
codetab["Egrave"] = 200
codetab["Eacute"] = 201
codetab["Ecircumflex"] = 202
codetab["Edieresis"] = 203
codetab["Igrave"] = 204
codetab["Iacute"] = 205
codetab["Icircumflex"] = 206
codetab["Idieresis"] = 207
codetab["Eth"] = 208
codetab["Ntilde"] = 209
codetab["Ograve"] = 210
codetab["Oacute"] = 211
codetab["Ocircumflex"] = 212
codetab["Otilde"] = 213
codetab["Odieresis"] = 214
codetab["multiply"] = 215
codetab["Oslash"] = 216
codetab["Ugrave"] = 217
codetab["Uacute"] = 218
codetab["Ucircumflex"] = 219
codetab["Udieresis"] = 220
codetab["Yacute"] = 221
codetab["Thorn"] = 222
codetab["germandbls"] = 223
codetab["agrave"] = 224
codetab["aacute"] = 225
codetab["acircumflex"] = 226
codetab["atilde"] = 227
codetab["adieresis"] = 228
codetab["aring"] = 229
codetab["ae"] = 230
codetab["ccedilla"] = 231
codetab["egrave"] = 232
codetab["eacute"] = 233
codetab["ecircumflex"] = 234
codetab["edieresis"] = 235
codetab["igrave"] = 236
codetab["iacute"] = 237
codetab["icircumflex"] = 238
codetab["idieresis"] = 239
codetab["eth"] = 240
codetab["ntilde"] = 241
codetab["ograve"] = 242
codetab["oacute"] = 243
codetab["ocircumflex"] = 244
codetab["otilde"] = 245
codetab["odieresis"] = 246
codetab["divide"] = 247
codetab["oslash"] = 248
codetab["ugrave"] = 249
codetab["uacute"] = 250
codetab["ucircumflex"] = 251
codetab["udieresis"] = 252
codetab["yacute"] = 253
codetab["thorn"] = 254
codetab["ydieresis"] = 255
codetab["hyphentwo"] = 8208
codetab["figuredash"] = 8210
codetab["endash"] = 8211
codetab["emdash"] = 8212
codetab["horizontalbar"] = 8213
codetab["dblverticalbar"] = 8214
codetab["dbllowline"] = 8215
codetab["underscoredbl"] = 8215
codetab["quoteleft"] = 8216
codetab["quoteright"] = 8217
codetab["quotesinglbase"] = 8218
codetab["quoteleftreversed"] = 8219
codetab["quotereversed"] = 8219
codetab["quotedblleft"] = 8220
codetab["quotedblright"] = 8221
codetab["quotedblbase"] = 8222
codetab["dagger"] = 8224
codetab["daggerdbl"] = 8225
codetab["bullet"] = 8226
codetab["onedotenleader"] = 8228
codetab["twodotenleader"] = 8229
codetab["twodotleader"] = 8229
codetab["ellipsis"] = 8230
codetab["perthousand"] = 8240
codetab["minute"] = 8242
codetab["second"] = 8243
codetab["primereversed"] = 8245
codetab["guilsinglleft"] = 8249
codetab["guilsinglright"] = 8250
codetab["referencemark"] = 8251
codetab["exclamdbl"] = 8252
codetab["overline"] = 8254
codetab["asterism"] = 8258
codetab["fraction"] = 8260
codetab["ff"] = 64256
codetab["fi"] = 64257
codetab["fl"] = 64258
codetab["ffi"] = 64259
codetab["ffl"] = 64260
codetab["ft"] = 64261
codetab["st"] = 64262
chartab["exclam"] = "!"
chartab["quotedbl"] = "\""
chartab["numbersign"] = "#"
chartab["dollar"] = "$"
chartab["percent"] = "%"
chartab["ampersand"] = "&"
chartab["quotesingle"] = "'"
chartab["parenleft"] = "("
chartab["parenright"] = ")"
chartab["asterisk"] = "*"
chartab["plus"] = "+"
chartab["comma"] = ","
chartab["hyphen"] = "-"
chartab["period"] = "."
chartab["slash"] = "/"
chartab["zero"] = "0"
chartab["one"] = "1"
chartab["two"] = "2"
chartab["three"] = "3"
chartab["four"] = "4"
chartab["five"] = "5"
chartab["six"] = "6"
chartab["seven"] = "7"
chartab["eight"] = "8"
chartab["nine"] = "9"
chartab["colon"] = ":"
chartab["semicolon"] = ";"
chartab["less"] = "<"
chartab["equal"] = "="
chartab["greater"] = ">"
chartab["question"] = "?"
chartab["at"] = "@"
chartab["A"] = "A"
chartab["B"] = "B"
chartab["C"] = "C"
chartab["D"] = "D"
chartab["E"] = "E"
chartab["F"] = "F"
chartab["G"] = "G"
chartab["H"] = "H"
chartab["I"] = "I"
chartab["J"] = "J"
chartab["K"] = "K"
chartab["L"] = "L"
chartab["M"] = "M"
chartab["N"] = "N"
chartab["O"] = "O"
chartab["P"] = "P"
chartab["Q"] = "Q"
chartab["R"] = "R"
chartab["S"] = "S"
chartab["T"] = "T"
chartab["U"] = "U"
chartab["V"] = "V"
chartab["W"] = "W"
chartab["X"] = "X"
chartab["Y"] = "Y"
chartab["Z"] = "Z"
chartab["bracketleft"] = "["
chartab["backslash"] = "\\"
chartab["bracketright"] = "]"
chartab["asciicircum"] = "^"
chartab["underscore"] = "_"
chartab["grave"] = "`"
chartab["a"] = "a"
chartab["b"] = "b"
chartab["c"] = "c"
chartab["d"] = "d"
chartab["e"] = "e"
chartab["f"] = "f"
chartab["g"] = "g"
chartab["h"] = "h"
chartab["i"] = "i"
chartab["j"] = "j"
chartab["k"] = "k"
chartab["l"] = "l"
chartab["m"] = "m"
chartab["n"] = "n"
chartab["o"] = "o"
chartab["p"] = "p"
chartab["q"] = "q"
chartab["r"] = "r"
chartab["s"] = "s"
chartab["t"] = "t"
chartab["u"] = "u"
chartab["v"] = "v"
chartab["w"] = "w"
chartab["x"] = "x"
chartab["y"] = "y"
chartab["z"] = "z"
chartab["braceleft"] = "{"
chartab["bar"] = "|"
chartab["verticalbar"] = "|"
chartab["braceright"] = "}"
chartab["asciitilde"] = "~"
chartab["exclamdown"] = "¡"
chartab["cent"] = "¢"
chartab["sterling"] = "£"
chartab["currency"] = "¤"
chartab["yen"] = "¥"
chartab["brokenbar"] = "¦"
chartab["section"] = "§"
chartab["dieresis"] = "¨"
chartab["copyright"] = "©"
chartab["ordfeminine"] = "ª"
chartab["guillemotleft"] = "«"
chartab["logicalnot"] = "¬"
chartab["sfthyphen"] = ""
chartab["softhyphen"] = ""
chartab["registered"] = "®"
chartab["macron"] = "¯"
chartab["overscore"] = "¯"
chartab["degree"] = "°"
chartab["plusminus"] = "±"
chartab["twosuperior"] = "²"
chartab["threesuperior"] = "³"
chartab["acute"] = "´"
chartab["mu"] = "µ"
chartab["mu1"] = "µ"
chartab["paragraph"] = "¶"
chartab["middot"] = "·"
chartab["periodcentered"] = "·"
chartab["cedilla"] = "¸"
chartab["onesuperior"] = "¹"
chartab["ordmasculine"] = "º"
chartab["guillemotright"] = "»"
chartab["onequarter"] = "¼"
chartab["onehalf"] = "½"
chartab["threequarters"] = "¾"
chartab["questiondown"] = "¿"
chartab["Agrave"] = "À"
chartab["Aacute"] = "Á"
chartab["Acircumflex"] = "Â"
chartab["Atilde"] = "Ã"
chartab["Adieresis"] = "Ä"
chartab["Aring"] = "Å"
chartab["AE"] = "Æ"
chartab["Ccedilla"] = "Ç"
chartab["Egrave"] = "È"
chartab["Eacute"] = "É"
chartab["Ecircumflex"] = "Ê"
chartab["Edieresis"] = "Ë"
chartab["Igrave"] = "Ì"
chartab["Iacute"] = "Í"
chartab["Icircumflex"] = "Î"
chartab["Idieresis"] = "Ï"
chartab["Eth"] = "Ð"
chartab["Ntilde"] = "Ñ"
chartab["Ograve"] = "Ò"
chartab["Oacute"] = "Ó"
chartab["Ocircumflex"] = "Ô"
chartab["Otilde"] = "Õ"
chartab["Odieresis"] = "Ö"
chartab["multiply"] = "×"
chartab["Oslash"] = "Ø"
chartab["Ugrave"] = "Ù"
chartab["Uacute"] = "Ú"
chartab["Ucircumflex"] = "Û"
chartab["Udieresis"] = "Ü"
chartab["Yacute"] = "Ý"
chartab["Thorn"] = "Þ"
chartab["germandbls"] = "ß"
chartab["agrave"] = "à"
chartab["aacute"] = "á"
chartab["acircumflex"] = "â"
chartab["atilde"] = "ã"
chartab["adieresis"] = "ä"
chartab["aring"] = "å"
chartab["ae"] = "æ"
chartab["ccedilla"] = "ç"
chartab["egrave"] = "è"
chartab["eacute"] = "é"
chartab["ecircumflex"] = "ê"
chartab["edieresis"] = "ë"
chartab["igrave"] = "ì"
chartab["iacute"] = "í"
chartab["icircumflex"] = "î"
chartab["idieresis"] = "ï"
chartab["eth"] = "ð"
chartab["ntilde"] = "ñ"
chartab["ograve"] = "ò"
chartab["oacute"] = "ó"
chartab["ocircumflex"] = "ô"
chartab["otilde"] = "õ"
chartab["odieresis"] = "ö"
chartab["divide"] = "÷"
chartab["oslash"] = "ø"
chartab["ugrave"] = "ù"
chartab["uacute"] = "ú"
chartab["ucircumflex"] = "û"
chartab["udieresis"] = "ü"
chartab["yacute"] = "ý"
chartab["thorn"] = "þ"
chartab["ydieresis"] = "ÿ"
chartab["hyphentwo"] = "‐"
chartab["figuredash"] = "‒"
chartab["endash"] = "–"
chartab["emdash"] = "—"
chartab["horizontalbar"] = "―"
chartab["dblverticalbar"] = "‖"
chartab["dbllowline"] = "‗"
chartab["underscoredbl"] = "‗"
chartab["quoteleft"] = "‘"
chartab["quoteright"] = "’"
chartab["quotesinglbase"] = "‚"
chartab["quoteleftreversed"] = "‛"
chartab["quotereversed"] = "‛"
chartab["quotedblleft"] = "“"
chartab["quotedblright"] = "”"
chartab["quotedblbase"] = "„"
chartab["dagger"] = "†"
chartab["daggerdbl"] = "‡"
chartab["bullet"] = "•"
chartab["onedotenleader"] = "․"
chartab["twodotenleader"] = "‥"
chartab["twodotleader"] = "‥"
chartab["ellipsis"] = "…"
chartab["perthousand"] = "‰"
chartab["minute"] = "′"
chartab["second"] = "″"
chartab["primereversed"] = "‵"
chartab["guilsinglleft"] = "‹"
chartab["guilsinglright"] = "›"
chartab["referencemark"] = "※"
chartab["exclamdbl"] = "‼"
chartab["overline"] = "‾"
chartab["asterism"] = "⁂"
chartab["fraction"] = "⁄"
chartab["ff"] = "ff"
chartab["fi"] = "fi"
chartab["fl"] = "fl"
chartab["ffi"] = "ffi"
chartab["ffl"] = "ffl"
chartab["ft"] = "ſt"
chartab["st"] = "st"
}
/^FontName /{print "fontname", $2 >> name}
/^XHeight /{xheight = $2}
# The following assumes character data looks like:
# C 33 ; WX 258 ; N exclam ; B 67 -10 194 688 ;
/^C 32 ;/{
print "spacewidth", int(($5+5)/10) >> name
print "charset" >> name
next
}
/^C /{
if(chartab[$8] == "") next
printf "%s\t", chartab[$8] >> name
printf "%d\t", int(($5+5)/10) >> name
ascdesc = 0
if($12 < -tolerance) ascdesc++
if($14 > xheight+tolerance) ascdesc += 2
printf "%d\t", ascdesc >> name
printf "%d\n", codetab[$8] >> name
}
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [9front] WANTED: instructions for adding fonts to troff
@ 2017-12-13 1:40 sl
0 siblings, 0 replies; 6+ messages in thread
From: sl @ 2017-12-13 1:40 UTC (permalink / raw)
To: 9front
Thanks for looking into this. I'm currently putting the finishing
touches on a document for print, and Garamond is just what the doctor
ordered.
Tested with the Garamond linked in the previous message. Worked fine,
except for:
> You can use other fonts for ranges missing from your font.
Garamond is missing the following:
/amd64/bin/aux/tr2post: <stdin>:23786 :WARNING: cannot find glyph, rune=0x68 stoken=<hy> troff font GA
...which is needed for the automatic hyphenation of linebreaks.
How to address this?
sl
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [9front] WANTED: instructions for adding fonts to troff
@ 2017-12-13 3:02 Travis Moore
0 siblings, 0 replies; 6+ messages in thread
From: Travis Moore @ 2017-12-13 3:02 UTC (permalink / raw)
To: 9front
> /amd64/bin/aux/tr2post: <stdin>:23786 :WARNING: cannot find glyph, rune=0x68 stoken=<hy> troff font GA
Hmm, can't reproduce. My text gets hyphenated fine. Are you using some macros?
Anyway, what you probably need to do is find the soft hyphen (code 173)
in /sys/lib/troff/font/devutf/GA and add a "ditto" line after it for \(hy :
26 0 173
hy "
I didn't bother with the two-char names because I usually just put the runes
in directly but something else might rely on them.
Travis
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [9front] WANTED: instructions for adding fonts to troff
@ 2017-12-13 3:06 sl
0 siblings, 0 replies; 6+ messages in thread
From: sl @ 2017-12-13 3:06 UTC (permalink / raw)
To: 9front
>> /amd64/bin/aux/tr2post: <stdin>:23786 :WARNING: cannot find glyph, rune=0x68 stoken=<hy> troff font GA
>
> Hmm, can't reproduce. My text gets hyphenated fine. Are you using some macros?
Yes, troff -ms -mpictures.
> Anyway, what you probably need to do is find the soft hyphen (code 173)
> in /sys/lib/troff/font/devutf/GA and add a "ditto" line after it for \(hy :
>
> 26 0 173
> hy "
This worked. Thanks!
sl
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [9front] WANTED: instructions for adding fonts to troff
@ 2017-12-14 22:48 Travis Moore
0 siblings, 0 replies; 6+ messages in thread
From: Travis Moore @ 2017-12-14 22:48 UTC (permalink / raw)
To: 9front
I improved the script somewhat and added two-char entries:
http://runjimmyrunrunyoufuckerrun.com/src/convpsfont.awk
The file in /sys/lib/postscript/troff/ should look like this:
0x0000 0x00ff GaramondNo8-Reg
0x0100 0x01ff LucidaSansUnicode01
0x0200 0x02ff LucidaSansUnicode02
0x0300 0x03ff LucidaSansUnicode03
0x0400 0x04ff LucidaSansUnicode04
0x0500 0x05ff LucidaSansUnicode05
0x2000 0x20ff LucidaSansUnicode20
0x2100 0x21ff LucidaSansUnicode21
0x2200 0x22ff LucidaSansUnicode22
0x2400 0x24ff LucidaSansUnicode24
0x2500 0x25ff LucidaSansUnicode25
This way characters up to 0xff will appear in the chosen font and
characters beyond will fall back to the Lucida unicode stuff.
See examples at:
http://runjimmyrunrunyoufuckerrun.com/tmp/
Travis
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [9front] WANTED: instructions for adding fonts to troff
@ 2017-12-20 11:39 Travis Moore
0 siblings, 0 replies; 6+ messages in thread
From: Travis Moore @ 2017-12-20 11:39 UTC (permalink / raw)
To: 9front
One last thing on fonts. It is pretty straightforward
to add a large font that has been chunked into separate
Type 1 fonts per unicode block a la the Lucida fonts.
I used fontforge to do this for a few fonts so that I
could access all the pretty glyphs past 0x00ff.
A new script, instructions & examples (incl. garamond):
http://runjimmyrunrunyoufuckerrun.com/fonts/
Travis
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-12-20 11:39 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-13 0:07 [9front] WANTED: instructions for adding fonts to troff Travis Moore
2017-12-13 1:40 sl
2017-12-13 3:02 Travis Moore
2017-12-13 3:06 sl
2017-12-14 22:48 Travis Moore
2017-12-20 11:39 Travis Moore
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).