-
Notifications
You must be signed in to change notification settings - Fork 18
/
chapter31.tex
302 lines (276 loc) · 11.7 KB
/
chapter31.tex
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
% -*- coding: utf-8 -*-
% Translated by inkydragon@github
% Date of translated: 2018-05-15
\documentclass{book}
\input{preamble}
\setcounter{chapter}{30}
\begin{document}
%\chapter{Allocation}\label{alloc}
\chapter{寄存器分配}\label{alloc}
%\TeX\ has registers of a number of types. For some of these,
%explicit commands exist to define a synonym for a certain register;
%for all of them macros exist in the plain format
%to allocate an unused register. This chapter treats
%the synonym and allocation commands, and discusses
%some guidelines for macro writers regarding allocation.
\TeX\ 的寄存器是数字类型的。对于其中的一些寄存器,
我们可以使用显式的命令定义某个特定寄存器的别名;
在 plain \TeX\ 中,
所有类型的寄存器都可以通过对应的宏来分配一个未使用的寄存器。
本章主要关注别名定义和寄存器分配命令。
对于宏编写者,我们讨论了一些关于寄存器分配的准则。
%\begin{inventory}
%\item [\cs{countdef}]
% Define a synonym for a \cs{count} register.
%\item [\cs{dimendef}]
% Define a synonym for a \cs{dimen} register.
%\item [\cs{muskipdef}]
% Define a synonym for a \cs{muskip} register.
%\item [\cs{skipdef}]
% Define a synonym for a \cs{skip} register.
%\item [\cs{toksdef}]
% Define a synonym for a \cs{toks} register.
%\item [\cs{newbox}]
% Allocate an unused \cs{box} register.
%\item [\cs{newcount}]
% Allocate an unused \cs{count} register.
%\item [\cs{newdimen}]
% Allocate an unused \cs{dimen} register.
%\item [\cs{newfam}]
% Allocate an unused math family.
%\item [\cs{newinsert}]
% Allocate an unused insertion class.
%\item [\cs{newlanguage}]
% (\TeX3 only)
% Allocate a new language number.
%\item [\cs{newmuskip}]
% Allocate an unused \cs{muskip} register.
%\item [\cs{newskip}]
% Allocate an unused \cs{skip} register.
%\item [\cs{newtoks}]
% Allocate an unused \cs{toks} register.
%\item [\cs{newread}]
% Allocate an unused input stream.
%\item [\cs{newwrite}]
% Allocate an unused output stream.
%\end{inventory}
\begin{inventory}
\item [\cs{countdef}]
定义了一个 \cs{count} 寄存器的别名。
\item [\cs{dimendef}]
定义了一个 \cs{dimen} 寄存器的别名。
\item [\cs{muskipdef}]
定义了一个 \cs{muskip} 寄存器的别名。
\item [\cs{skipdef}]
定义了一个 \cs{skip} 寄存器的别名。
\item [\cs{toksdef}]
定义了一个 \cs{toks} 寄存器的别名。
\item [\cs{newbox}]
分配了一个未使用的 \cs{box} 寄存器。
\item [\cs{newcount}]
分配了一个未使用的 \cs{count} 寄存器。
\item [\cs{newdimen}]
分配了一个未使用的 \cs{dimen} 寄存器。
\item [\cs{newfam}]
分配了一个未使用的数学字体族。
\item [\cs{newinsert}]
分配了一个未使用的插入类。
\item [\cs{newlanguage}]
(仅 \TeX3)
分配了一个新的语言编号。
\item [\cs{newmuskip}]
分配了一个未使用的 \cs{muskip} 寄存器。
\item [\cs{newskip}]
分配了一个未使用的 \cs{skip} 寄存器。
\item [\cs{newtoks}]
分配了一个未使用的 \cs{toks} 寄存器。
\item [\cs{newread}]
分配了一个未使用的输入流。
\item [\cs{newwrite}]
分配了一个未使用的输出流。
\end{inventory}
%%\point Allocation commands
%\section{Allocation commands}
%\index{registers!allocation of|(}
%\point Allocation commands
\section{寄存器分配命令}
\index{registers!allocation of|(}
%In plain \TeX, \cs{new...} macros are defined for
%allocation of registers.
%The registers of \TeX\ fall into two classes that are
%allocated in different ways. This is treated below.
在 plain \TeX 中, 定义了宏 \cs{new...} 用于分配寄存器。
\TeX\ 的寄存器可以根据分配方式的不同而分为两类。这一点将会在下面谈到。
%The \csidx{newlanguage} macro of plain \TeX\
%does not allocate any register. Instead it merely assigns
%a number, starting from~0.
%\TeX\ (version~3) can have at most 256 different
%sets of hyphenation patterns.
plain \TeX\ 的 \csidx{newlanguage} 宏并不会分配任何的寄存器。
相反的,它只是从0开始,分配了一个数字。
\TeX3 最多有256种断字组合模式。
%The \cs{new...} macros of plain \TeX\ are defined to be
%\cs{outer} (see Chapter~\ref{macro} for a precise explanation),
%which precludes use of the allocation macros in other macros.
%Therefore the \LaTeX\ format redefines these macros
%without the \cs{outer} prefix.
plain \TeX\ 的 \cs{new...} 宏被定义为 \cs{outer}
(精确定义详见 \ref{macro} 章),
\cs{outer} 避免了在其他宏中使用分配宏。
因此,\LaTeX\ 在重定义这些宏时没有带上 \cs{outer} 前缀。
%%\spoint \cs{count}, \cs{dimen}, \cs{skip}, \cs{muskip}, \cs{toks}
%\subsection{\cs{count}, \cs{dimen}, \cs{skip}, \cs{muskip}, \cs{toks}}
%\spoint \cs{count}, \cs{dimen}, \cs{skip}, \cs{muskip}, \cs{toks}
\subsection{\cs{count}, \cs{dimen}, \cs{skip}, \cs{muskip}, \cs{toks}}
%For these registers there exists a \gr{registerdef} command,
%for instance \cs{countdef}, to couple a specific register
%to a control sequence:
%\begin{Disp}\gr{registerdef}\gr{control
% sequence}\gr{equals}\gr{8-bit number}\end{Disp}
对于这些寄存器,存在一个 \gr{registerdef} 命令。
举个例子:\cs{countdef}, 将寄存器与特定的控制序列组合在一起:
\begin{Disp}\gr{registerdef}\gr{control
sequence}\gr{equals}\gr{8-bit number}\end{Disp}
%After the definition
%\begin{verbatim}
%\countdef\MyCount=42
%\end{verbatim}
%the allocated register can be used as
%\begin{verbatim}
%\MyCount=314
%\end{verbatim}
%or
%\begin{verbatim}
%\vskip\MyCount\baselineskip
%\end{verbatim}
在定义之后
\begin{verbatim}
\countdef\MyCount=42
\end{verbatim}
分配的寄存器可以这样使用:
\begin{verbatim}
\MyCount=314
\end{verbatim}
或者
\begin{verbatim}
\vskip\MyCount\baselineskip
\end{verbatim}
%The \gr{registerdef} commands are used in plain \TeX\ macros
%\cs{newcount} et cetera that allocate an unused register;
%after
%\begin{verbatim}
%\newcount\MyCount
%\end{verbatim}
%\cs{MyCount} can be used
%exactly as in the above two examples.
\gr{registerdef} 命令用在 \cs{newcount} 等 plain \TeX\ 宏中,
它能分配一个未使用的寄存器;在以下命令之后
\begin{verbatim}
\newcount\MyCount
\end{verbatim}
\cs{MyCount} 就可以完全按照上述两个例子那样使用。
%%\spoint \cs{box}, \cs{fam}, \cs{write}, \cs{read}, \cs{insert}
%\subsection{\cs{box}, \cs{fam}, \cs{write}, \cs{read}, \cs{insert}}
%\spoint \cs{box}, \cs{fam}, \cs{write}, \cs{read}, \cs{insert}
\subsection{\cs{box}, \cs{fam}, \cs{write}, \cs{read}, \cs{insert}}
%For these registers there exists no \gr{registerdef} command in \TeX,
%so \cs{chardef} is used to allocate box registers
%in the corresponding plain \TeX\ macros \cs{newbox}, for instance.
对于 \TeX 中的这些寄存器,不存在 \gr{registerdef} 命令,所以 \cs{chardef} 命令用于在对应的 \TeX 宏 \cs{newbox} 中分配盒子寄存器,举个例子。
%The fact that \cs{chardef} is used implies that the
%defined control sequence does not stand for the register itself,
%but only for its number. Thus after
%\begin{verbatim}
%\newbox\MyBox
%\end{verbatim}
%it is necessary to write
%\begin{verbatim}
%\box\MyBox
%\end{verbatim}
%Leaving out the \cs{box} means that the character
%in the current font with number
%\cs{MyBox} is typeset. The \cs{chardef} command
%is treated further in Chapter~\ref{char}.
使用 \cs{chardef} 意味着定义的控制序列不代表寄存器本身,而仅代表它的编号。因此在定义了
\begin{verbatim}
\newbox\MyBox
\end{verbatim}
后,有必要继续写
\begin{verbatim}
\box\MyBox
\end{verbatim}
省略 \cs{box} 意味着当前字体编号为 \cs{MyBox} 的字符正在被排版。
\cs{chardef} 在第\ref{char}章中会详细叙述。
%\index{registers!allocation of|)}
\index{registers!allocation of|)}
%\section{Ground rules for macro writers}
\section{给宏编写者的基本准则}
%The \cs{new...} macros of plain \TeX\ have been designed
%to form a foundation for macro packages, such that
%several of such packages can operate without collisions
%in the same run of \TeX. In appendix~B of \TeXbook\
%Knuth formulates some ground rules that macro writers should
%adhere to.
%\begin{enumerate}
%\item The \cs{new...} macros do not allocate registers
%with numbers~0--9. These can therefore be used as `scratch'
%registers. However, as any macro family can use them,
%no assumption can be made about the permanency of their
%contents. Results that are to be passed from one call to
%another should reside in specifically allocated registers.
plain \TeX\ 的 \cs{new...} 宏被设计为用来构建宏包的基础,
这样在同一个 \TeX\ 实例中,不同的宏包之间也不会冲突。
在Knuth的\TeXbook\ 附录~B 中规定了一些宏编写者应当遵守的基本准则。
\begin{enumerate}
\item 不要使用 \cs{new...} 宏分配编号~0--9的寄存器。
这些寄存器会被用作临时寄存器。
任意一个宏族都可以使用它们,因此无法保证它们的值是永久不变的。
需要从一个调用传递到另一个调用的结果应放在特定的寄存器中。
%Note that count registers 0--9 are used for page identification
%in the \n{dvi} file (see Chapter~\ref{TeXcomm}), so no global assignments
%to these should be made.
注意到计数用(count) 0--9号寄存器用于 \n{dvi} 文件的页面标记
(见~\ref{TeXcomm}章),因此对这些寄存器不应有全局的赋值。
%\item \cs{count255}, \cs{dimen255}, and \cs{skip255} are
%also available. This is because inserts are
%allocated from 254 downward and, together with an insertion box,
%a count, dimen, and skip register,
%all with the same number, are allocated.
%Since \cs{box255} is used by the output routine
%(see Chapter~\ref{output}),
%the count, dimen, and skip with number~255 are freely available.
\item \cs{count255}, \cs{dimen255}, 和 \cs{skip255} 是可用的寄存器。
这是因为插入盒子用的寄存器从254开始向下分配,
每一个插入盒子都会分配一组同编号的 count, dimen, 和 skip 寄存器。
另外box255由输出程序使用(见~\ref{output}章),
故剩下的编号为255的 count, dimen, 和 skip寄存器可以自由使用。
%\item Assignments to scratch registers~0, 2, 4, 6, 8, and~255
%should be local; assignments to registers~1, 3, 5, 7,~9
%should be \cs{global} (with the exception of the \cs{count}
%registers). This guideline prevents `save
%stack build-up' (see Chapter~\ref{error}).
\item 给 0, 2, 4, 6, 8, 和 255 号临时寄存器的赋值应当是局部的。
给 1, 3, 5, 7, 9号寄存器的赋值应当是全局的。(除\cs{count}寄存器外)。
这条准则避免了‘保存栈的建立’(见~\ref{error}章)。
%\item Any register can be used inside a group, as \TeX's
%grouping mechanism will restore its value outside
%the group. There are two conditions on this use of
%a register:
%no global assignments should be made to it, and
%it must not be possible that other macros may be
%activated in that group that perform global assignments
%to that register.
\item 任何寄存器都应在组内使用,\TeX\ 的分组机制会在组外保存它的值。
使用这种寄存器有两个条件:
没有对它进行全局赋值,并且组内没有执行全局分配该寄存器的其他宏。
%\item Registers that are used over longer periods of time,
%or that have to survive in between calls of different
%macros, should be allocated by \cs{new...}.
%\end{enumerate}
\item 长期使用的寄存器,或在不同宏的调用中需要保留的寄存器应使用 \cs{new...} 来分配。
\end{enumerate}
%\endofchapter
%%%%% end of input file [alloc]
\endofchapter
%%%% end of input file [alloc]
\end{document}