1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
|
#############################################
# Build the Comprehensive LaTeX Symbol List #
# By Scott Pakin <scott+clsl@pakin.org> #
#############################################
# Define TARGETS as a list of all of the files we intend to generate.
# TARGETS is categorized into TARGETS_SOURCE and TARGETS_DIST.
# TARGETS_DIST comprise the prebuilt distribution of the Comprehensive
# LaTeX Symbol List. TARGETS_SOURCE are needed primarily to build
# TARGETS_DIST, although they are also distributed (in a "source"
# subdirectory).
TARGETS = $(TARGETS_SOURCE) $(TARGETS_DIST)
TARGETS_DIST = symbols-letter.pdf symbols-a4.pdf \
rawtables-letter.pdf rawtables-a4.pdf \
SYMLIST README
TARGETS_SOURCE = lightbulb.eps lightbulb10.pfb lightbulb.map
# There are a few files that we didn't generate but that need to be
# distributed.
EXTRADIST = symbols.tex lightbulb10.mf lightbulb.mf \
symbols.ist fakego.sty unicode2eps.pe fakeold-arrows.sty \
makefakeMnSymbol teubner-subset.sty fakemusixtex.sty \
fakearevmath.sty fakedozenal.sty fakelatexsym.sty \
makefakefdsymbol makefakeboisik fakearcs.sty fakeallrunes.sty \
makefakestix makefakestarfont makerawtables makefakecmupint \
Makefile
# All formats of the symbol list depend upon the following files.
COMMONDEPS = symbols.tex symbols.ist fakeMnSymbol.sty teubner-subset.sty \
fakemusixtex.sty fakeknitting.sty fakefdsymbol.sty \
fakeboisik.sty fakestix.sty fakearcs.sty fakeold-arrows.sty \
fakearevmath.sty fakedozenal.sty fakelatexsym.sty \
fakestarfont.sty nonlatex versatim.tex junicode lilyglyphs \
fakeallrunes.sty fakecmupint.sty \
$(TARGETS_SOURCE)
# The following non-LaTeX files will be copied to the current
# directory if they exist so LaTeX can find them.
NONLATEX = hands.mf greenpoint.mf nkarta.mf astrosym.mf WebOMintsGD.pfb \
moonphase.mf dancers.mf smfpr10.mf umranda.mf umrandb.mf \
cryst.mf dice3d.mf magic.mf fselch10.mf Junicode.ttf msym10.tfm \
knot1.mf knot2.mf knot3.mf knot4.mf knot5.mf knot6.mf knot7.mf \
endofproofwd.pdf
# We need FontForge (or the older PfaEdit) to generate lightbulb10.pfb.
FONTFORGE = fontforge
# Specify how much process parallelism we should employ in xargs invocations.
PARXARGS = 8
# The following should be overwritten in a recursive call to Make.
SIZE = letter
# I've had some trouble using sh as the shell. bash seems to work, though.
SHELL = /bin/bash
###########################################################################
# Build all specified formats in all specified paper sizes.
all: check_version $(TARGETS_DIST)
.PHONY: all symbols check_version nonlatex dist clean mostlyclean
###########################################################################
# Define generic rules for building pdf/dvi/ps in letter/a4 size.
symbols: $(COMMONDEPS)
# Pass 1: Produce an initial build of the document.
$(LATEX) -jobname symbols-$(SIZE) '\PassOptionsToClass{$(SIZE)paper}{article}\input symbols'
# Pass 2a: Build a second time to produce a final page layout (one hopes).
$(LATEX) -jobname symbols-$(SIZE) '\PassOptionsToClass{$(SIZE)paper}{article}\input symbols'
# Pass 2b: Create an index based on the current layout. We do some
# preprocessing of the .idx file to improve the sorting order.
perl -ne 's/\{(\d+)\}=/sprintf " {%03d}=", $$1/ge; s/\(\\(\S+)\s*\)/\(\\$$1\)/; print' < symbols-$(SIZE).idx > symbols-$(SIZE).tmp
mv symbols-$(SIZE).tmp symbols-$(SIZE).idx
makeindex -s symbols.ist symbols-$(SIZE)
# Pass 3a: Build the document with the newly generated index.
$(LATEX) -jobname symbols-$(SIZE) '\PassOptionsToClass{$(SIZE)paper}{article}\input symbols'
# Pass 3b: Get a final symbol count, and put it in the .aux file.
# Also, patch the hyperlink bookmarks since we can't do that from
# within the document.
totalsymbols=`fgrep -c '\item \verb' symbols-$(SIZE).ind` ; \
( fgrep -v prevtotalsymbols symbols-$(SIZE).aux > symbols-$(SIZE).pts ; \
echo "\\gdef\\prevtotalsymbols{$$totalsymbols}" ; \
echo "\\gdef\\approxcount{}" ) >> symbols-$(SIZE).pts ; \
mv symbols-$(SIZE).pts symbols-$(SIZE).aux
if [ -e symbols-$(SIZE).out ] ; then \
cat symbols-$(SIZE).out | \
perl -ne 's/\[[^\]]*\](?=\w)//g; print' > symbols-$(SIZE).tmp ; \
mv symbols-$(SIZE).tmp symbols-$(SIZE).out ; \
fi
# Pass 4: Build the final document using the final symbol count
# and with the table of contents and PDF bookmarks correctly
# reflecting the index pages. We don't use our custom latex
# format here because it interferes with cmap.sty.
$(LATEX) -jobname symbols-$(SIZE) '\PassOptionsToClass{$(SIZE)paper}{article}\input symbols'
-@(grep --color -E "^.*multiply.defined.*" symbols-$(SIZE).log ; true)
-@(grep --color -E "^.*undefined.*" symbols-$(SIZE).log | grep -v U/stmry/b/n ; true)
check_version: symbols.tex
comment_ver=$$(perl -ne '/^\%\%\%\s+version\s+=\s+\"(\S+)\"/ && print "$$1\n"' symbols.tex) \
pdf_ver=$$(perl -ne '/pdfversionid\s*=\s*\{(\S+)\}/ && print "$$1\n"' symbols.tex) ; \
test "$$comment_ver" = "$$pdf_ver"
###########################################################################
# Define specific rules for building with different pages sizes.
symbols-a4.pdf symbols-a4.log symbols-a4.ind: $(COMMONDEPS)
$(MAKE) $(MAKEFLAGS) SIZE=a4 LATEX=pdflatex symbols
symbols-letter.pdf symbols-letter.log symbols-letter.ind: $(COMMONDEPS)
$(MAKE) $(MAKEFLAGS) SIZE=letter LATEX=pdflatex symbols
rawtables-letter.tex rawtables.list testfont.pdf testfont.log: makerawtables $(COMMONDEPS)
perl makerawtables --paper=letter
rawtables-letter.pdf: rawtables-letter.tex
pdftex rawtables-letter.tex
rawtables-a4.tex rawtables.list testfont.pdf testfont.log: makerawtables $(COMMONDEPS)
perl makerawtables --paper=a4
rawtables-a4.pdf: rawtables-a4.tex
pdftex rawtables-a4.tex
###########################################################################
# Define rules to produce a lightbulb proof figure.
mfplain.mem:
mpost -ini '\input mfplain; dump'
lightbulb.eps: lightbulb10.mf lightbulb.mf mfplain.mem
mpost -mem=mfplain '\mode:=proof; prologues:=2; labelfont cmr17; input lightbulb10'
mv lightbulb10.65 lightbulb.eps
# Generate a FontForge script that makes the LightBulb10 PostScript
# names mixed case.
lightbulb10.pe:
echo 'Open($$1);' > $@
echo 'LB = "LightBulb";' >> $@
echo 'SetFontNames(LB+"10", LB, LB+"10");' >> $@
echo 'Generate("lightbulb10.pfb");' >> $@
# Define a rule to produce a Type 1 version of the LightBulb10 font.
lightbulb10.pfb: lightbulb10.mf lightbulb10.pe
mftrace -V -fpfb --simplify lightbulb10
$(FONTFORGE) -script lightbulb10.pe lightbulb10.pfb
# Define a rule to produce a LightBulb font-mapping file.
lightbulb.map:
echo "lightbulb10 LightBulb10 <lightbulb10.pfb" > lightbulb.map
###########################################################################
# If we have MnSymbol.sty, generate a faked version that does not
# declare any new math alphabets.
fakeMnSymbol.sty: makefakeMnSymbol
if [ "`kpsewhich MnSymbol.sty`" ] ; then \
./makefakeMnSymbol `kpsewhich MnSymbol.sty` > $@ ; \
else \
./makefakeMnSymbol /dev/null > $@ ; \
fi
# If we have fdsymbol.sty, generate a faked version that does not
# declare any new math alphabets.
fakefdsymbol.sty: makefakefdsymbol
if [ "`kpsewhich fdsymbol.sty`" ] ; then \
./makefakefdsymbol `kpsewhich fdsymbol.sty` > $@ ; \
else \
./makefakefdsymbol /dev/null > $@ ; \
fi
# If we have boisik.sty, generate a faked version that does not
# declare any new math alphabets.
fakeboisik.sty: makefakeboisik
if [ "`kpsewhich boisik.sty`" ] ; then \
./makefakeboisik `kpsewhich boisik.sty` > $@ ; \
else \
./makefakeboisik /dev/null > $@ ; \
fi
# If we have Junicode.ttf, extract the versicle and response
# characters as graphical images. This enables the font to work in
# any TeX engine and without any helper .tfm or .enc files.
junicode: unicode2eps.pe
test -e junicode || mkdir junicode
if [ "`kpsewhich Junicode.ttf`" ] ; then \
cd junicode ; \
$(FONTFORGE) -script ../unicode2eps.pe `kpsewhich Junicode.ttf` 0x2123 0x211F ; \
ls *.eps | xargs -P$(PARXARGS) -t -i epstopdf '{}' ; \
true ; \
fi
# If we have knitting.sty, generate a truncated version that excludes
# some catcode trickery which breaks mylatex.ltx.
fakeknitting.sty:
echo "% This is a truncated version of knitting.sty for use only" > $@
echo "% with the Comprehensive LaTeX Symbol List." >> $@
echo "" >> $@
if [ "`kpsewhich knitting.sty`" ] ; then \
cat `kpsewhich knitting.sty` | sed '/Standard chart commands/,$$d' >> $@ ; \
fi
# If we have stix.sty, generate a faked version that does not
# declare any new math alphabets.
fakestix.sty: makefakestix
if [ "`kpsewhich stix.sty`" ] ; then \
./makefakestix `kpsewhich stix.sty` > $@ ; \
else \
./makefakestix /dev/null > $@ ; \
fi
# If we have starfont.sty, generate a faked version that does not
# declare any new math alphabets.
fakestarfont.sty: makefakestarfont
if [ "`kpsewhich starfont.sty`" ] ; then \
./makefakestarfont `kpsewhich starfont.sty` > $@ ; \
else \
./makefakestarfont /dev/null > $@ ; \
fi
# If we have cmupint.sty, generate a faked version that does not
# declare any new math alphabets.
fakecmupint.sty: makefakecmupint
if [ "`kpsewhich cmupint.sty`" ] ; then \
./makefakecmupint `kpsewhich cmupint.sty` > $@ ; \
else \
./makefakecmupint /dev/null > $@ ; \
fi
# The apl package's versatim.tex messes up TeX's category codes.
# Hence, we override that file with a do-nothing version.
versatim.tex:
echo "% Do-nothing replacement for the apl package's versatim.tex" > $@
echo "\\endinput" >> $@
# If we have the Emmentaler music fonts, convert each glyph to a
# graphical image, which we place in our lilyglyphs subdirectory.
# With a few command redefinitions, this enables us to use lilyglyphs
# without requiring XeLaTeX or LuaLaTeX.
lilyglyphs: extract-by-name.pe
test -e lilyglyphs || mkdir lilyglyphs
if [ "`kpsewhich emmentaler-16.otf`" ] ; then \
cd lilyglyphs ; \
$(FONTFORGE) -script ../extract-by-name.pe `kpsewhich emmentaler-16.otf` ; \
mv accidentals.sharp.slashslashslash.stemst.eps accidentals.sharp.slashslashslash.stemstem.eps ; \
mv accidentals.sharp.slashslash.stemstemste.eps accidentals.sharp.slashslash.stemstemstem.eps ; \
ls *.eps | xargs -P$(PARXARGS) -t -i epstopdf '{}' ; \
rm -f lilyglyphs_logo.pdf ; \
ln -s -f `texdoc -l -I lilyglyphs_logo.pdf | awk 'NR==1 {print $$2}'` . ; \
fi
# Generate a FontForge script that extracts all symbols from a font
# into named, (rather than numbered, as does unicode2eps.pe) EPS
# files.
extract-by-name.pe:
echo 'Open($$1)' > $@
echo 'Select(0x0000, 0xFFFF)' >> $@
echo 'Export("%n.eps")' >> $@
###########################################################################
nonlatex:
for fname in $(NONLATEX) ; do \
$(RM) $$fname ; \
fullfname=`kpsewhich $$fname` ; \
if [ "$$fullfname" ] ; then \
ln -s -f $$fullfname . ; \
fi \
done
fullfname=`locate -b '\endofproofwd.pdf'` ; \
if [ "$$fullfname" ] ; then \
ln -s -f $$fullfname . ; \
fi
###########################################################################
# The index is needed to produce a list of symbols. We arbitrarily
# use the symbols-letter.ind version of the index.
symbols.ind: symbols-letter.ind
cp symbols-letter.ind symbols.ind
# Create a list of all symbols.
SYMLIST: symbols.ind
cat symbols.ind | perl -ne 's/.*\\verb\+([^+]+)\+.*/$$1/g && print' | sort -u > SYMLIST
# Create a README file.
README: makeREADME symbols-letter.log symbols.ind
./makeREADME symbols-letter.log symbols.ind > README
# Prepare to timestamp the distributed symbols.tex file.
TODAY = $(shell date +'%d %B %Y')
NOW = $(shell date +'%T %Z')
# Create a .tar.gz file.
comprehensive.tar.gz: check_version $(TARGETS) $(EXTRADIST)
$(RM) -r comprehensive
mkdir comprehensive
mkdir comprehensive/source
install -m 664 $(TARGETS_DIST) comprehensive
install -m 664 $(TARGETS_SOURCE) $(EXTRADIST) comprehensive/source
cat symbols.tex | \
perl -ne 's/(date\s*=\s*)\"[^\"]*\"/$$1\"$(TODAY)\"/; print' | \
perl -ne 's/(time\s*=\s*)\"[^\"]*\"/$$1\"$(NOW)\"/; print' | \
checksum > comprehensive/source/symbols.tex
for fakes in MnSymbol fdsymbol boisik stix starfont cmupint ; do \
chmod 755 comprehensive/source/makefake$$fakes ; \
done
chmod 755 comprehensive/source/makerawtables
chmod 664 comprehensive/source/symbols.tex
tar -czf comprehensive.tar.gz comprehensive
$(RM) -r comprehensive
dist: comprehensive.tar.gz
# Clean up our mess.
clean:
$(RM) -r comprehensive
$(RM) $(TARGETS)
$(RM) symbols-*-*.{aux,dep,dvi,fmt,idx,ilg,inc,ind,log,out,pts,toc}
$(RM) symbols.{aux,dep,dvi,fmt,idx,ilg,inc,ind,log,out,pts,toc}
$(RM) symbols.pdf
$(RM) $(NONLATEX)
for fname in $(NONLATEX) ; do \
$(RM) `basename $$fname .mf`.*pk ; \
$(RM) `basename $$fname .mf`.tfm ; \
done
$(RM) comprehensive.tar.gz
$(RM) -r junicode lilyglyphs
$(RM) fakeMnSymbol.sty fakefdsymbol.sty fakeknitting.sty
$(RM) fakeboisik.sty fakestix.sty fakestarfont.sty fakecmupint.sty
$(RM) versatim.tex extract-by-name.pe
$(RM) mfplain.{log,mem}
$(RM) lightbulb10*pk lightbulb10.{tfm,log,pe,afm}
$(RM) lightbulb-eps-converted-to.pdf
$(RM) rawtables-*.{log,tex,pdf} rawtables.list testfont.{log,pdf}
|