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
|
--- MF2TEX ---
Inserting the TeX labels into METAFONT sources
Robert Spalek, robert@atrey.karlin.mff.cuni.cz
These macros are copyleft and may be freely distributed under the
General Public License (GPL)
If you use the METAFONT not only for drawing fonts, but for
pictures too, you ofted need to insert labels into it (graphs, contructions
etc.) METAFONT can draw dots, curves..., but not the text. Of course you
can write macros in TeX, which insert the given text in right place and
than insert the picture as a char. This solution has 2 problems:
- you must write 2 sources (METAFONT with picture and TeX with labels)
- you must compute the right coordinates, remember them, insert into the
TeX source and actualise them after EVERY change in METAFONT source
It would be nice, if we could describe the labels in METAFONT
source and METAFONT with TeX would together typeset picture with labels in
right places.
METAFONT usually reads the source, draws the picture (and writes it
into TFM and GF files). If we make him to compute the coordinates and write
them into a text file, another program can read them and generate the
corresponding TeX source. In our text we must only include generated TeX
source and insert predefined command in the place, where we want the
picture to be.
I implemented it in this way: METAFONT can't write into files, only
into its LOG file. My macros write complete TeX source into the LOG file
in a special format. A program LOG2TEX reads the LOG file and extracts the
source into the TeX file. The TeX file uses special macros for inserting
the text in the right place, which are included too.
Informations about using these macros are following:
METAFONT
1) at first you include my macros by `input mf2tex'
2) then you define the mode, measures...
after the initialisation you write `labelheader("test");',
where `test' is the name of the font, which do you want to use in
the TeX source (the font will have the name `fonttest' and all
characters will have the `test' prefix in their names).
3) instead `beginchar(char,width,height,depth);' you write
`beginlabeledchar(char,width,height,depth,"one");',
where `one' is the name of the defined character (used in the TeX
macros). In my example the generated TeX macro will have name `testone'
(it couldl be inserted into text by writing `\testone').
4) instead `endchar;' you write `endlabeledchar;'
5) at the end the METAFONT source you write `labelfoot;', which will
finalise the output file
!) when you want to insert a label into a character, you write
`labelXY(posx,posy,"text")', where X and Y mean justification. They
must be one of the following letters:
X: L (left), R (right), M (middle)
Y: U (up), D (down), B (baseline), M (middle),
posx and posy are the coordinates (it need not be the number, it can
be the variable or dot too (x1, 1/2[x3,x7]...))
and text is the inserted text. You should switch into the right font
at the beginning, because you don't know, which font will be active
in the moment of the picture insertion. You MUST NOT insert characters
with ASCII code >127, because METAFONT will ignore them. If you need at
example the letters with interpuction, you should use the TeX accents.
Note: of course you could use all the TeX features (math mode, tables...)
Conversion
Simply run the program `log2tex test1', where test1 is the name of the
METAFONT LOG file without extension.
TeX
1) at the beginning of the document write `\input mf2tex' (once and only
once for the whole document)
2) then include all the generated sources (one for every METAFONT source):
`\input test1'
3) when you want to insert the picture, write `\testone', where `test' is
the name of the font and `one' is the name of the character in the font.
This should work in all modes (horisontal, vertical, math...).
Allocated space will be computed from the size of the picture (not
including the labels!)
How do the TeX macros work
I wrote the macros \vertY, where Y is in {U,D,B,M}, which move the
pointer into the given coordinate and insert the text with that vertical
justification. You MUST NOT insert the text directly, but use the next
macro \horX, where X is in {L,R,M}, which will set the right horisontal
justification.
You don't need to use these ugly macros, because I predefined
abbreviations \moveXY(xpos,ypos,text}). They call these macros. You must
pay attention in the text parameter, because it must not contain the right
paranthese `)'. If you need it, you must enclose the text parameter by {}
parantheses and it will be all right.
For inserting the picture in the right (horisontal) mode is
predefined the \labels macro with 2 parameters: the list of the labels and
the inserted char. User will call this macro.
But you don't need to know these macros, METAFONT will generate the
source and you only use it.
The program LOG2TEX reads the name of the generated TeX source file
from the line, which start by $#@!. Than it copies all the lines, which
begin bye !@#$ to that file. It does not do anything else, the complete TeX
source is generated by the METAFONT macros.
I include the 2 sources of the LOG2TEX program: Pascal and C
sources. I include a DOS executable program too.
Example of the METAFONT, LOG file, generated TeX file and TeX source:
test1.mf:
input mf2tex
mode_setup;
labelheader("test");
unit#=3cm#;
mypen#=0.3mm#;
define_pixels(unit,mypen);
beginlabeledchar(1,unit#,0.9unit#,0,"one");
z1=(0,0);
z2=(w,0);
z3-z1=(z2-z1) rotated 60;
pickup pencircle scaled mypen;
draw z1--z2--z3--cycle; %big triangle
z4=1/3[z1,z2]; z5=2/3[z1,z2];
z6=1/3[z2,z3]; z7=2/3[z2,z3];
z8=1/3[z3,z1]; z9=2/3[z3,z1];
draw z4--z7--z8--z5--z6--z9--cycle; %3 middle triangles
labelMM(x9,1/3[y4,y9],"A"); %6 letters
labelMM(x3,1/3[y4,y9],"B");
labelMM(x6,1/3[y4,y9],"C");
labelMM(x4,1/3[y9,y8],"D");
labelMM(x5,1/3[y9,y8],"E");
labelMM(x3,1/3[y8,y3],"F");
labelMM(x4,2/3[y4,y9],"a"); %next 3 letters
labelMM(x5,2/3[y4,y9],"b");
labelMM(x3,2/3[y9,y8],"c");
endlabeledchar;
labelfoot;
end;
test1.log:
This is METAFONT, Version 2.71(c)sb13 (preloaded base=plain 96.5.2)
13 MAR 1997 18:17
** &plain \mode=hplaser; mag=1.0; input test1
(test1.mf (mf2tex.mf)
$#@!test1
!@#$\font\fonttest=test1
!@#$
!@#$\def\testone{\labels{%
!@#$\moveMM(0.49953cm,0.28839cm,{A})%
!@#$\moveMM(1.4986cm,0.28839cm,{B})%
!@#$\moveMM(2.49767cm,0.28839cm,{C})%
!@#$\moveMM(0.99905cm,1.15361cm,{D})%
!@#$\moveMM(1.99814cm,1.15361cm,{E})%
!@#$\moveMM(1.4986cm,2.01884cm,{F})%
!@#$\moveMM(0.99905cm,0.57681cm,{a})%
!@#$\moveMM(1.99814cm,0.57681cm,{b})%
!@#$\moveMM(1.4986cm,1.44203cm,{c})%
!@#$}{\fonttest \char1}}
[1]
!@#$
)
Font metrics written on test1.tfm.
Output written on test1.300 (1 character, 3072 bytes).
test1.tex:
\font\fonttest=test1
\def\testone{\labels{%
\moveMM(0.49953cm,0.28839cm,{A})%
\moveMM(1.4986cm,0.28839cm,{B})%
\moveMM(2.49767cm,0.28839cm,{C})%
\moveMM(0.99905cm,1.15361cm,{D})%
\moveMM(1.99814cm,1.15361cm,{E})%
\moveMM(1.4986cm,2.01884cm,{F})%
\moveMM(0.99905cm,0.57681cm,{a})%
\moveMM(1.99814cm,0.57681cm,{b})%
\moveMM(1.4986cm,1.44203cm,{c})%
}{\fonttest \char1}}
runtest.tex:
\input mf2tex
\input test1
This is a text before the picture, because we want it to be inserted in
the middle of the text. Now we are able to insert it: ``One, two,
\testone, four.'' Is it displayed all right? Let's display it
centered.
$$\testone$$
\bye
|