-
Notifications
You must be signed in to change notification settings - Fork 2
/
cwebman.ko.tex
2874 lines (2645 loc) · 178 KB
/
cwebman.ko.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
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
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
% This file generates the user manual; TeX it, don't read it!
\def\tangref{3} % where the main explanation of CTANGLing is given
\input cwebmac
\input kotex.sty
% 기본 폰트를 한글을 포함하도록 다시 정의합니다.
\expandafter\def\expandafter\tt\expandafter{\tt\hfontname{nnmbrgtm}}
\expandafter\def\expandafter\sl\expandafter{\sl\hfontname{nanumgtm}}
\expandafter\def\expandafter\it\expandafter{\it\hfontname{nanumgtm}}
\expandafter\def\expandafter\bf\expandafter{\bf\hfontname{nanummjb}}
% 각종 폰트를 한글을 포함하도록 재정의
\let\otitlefont=\titlefont \def\titlefont{\hfont{nanummjm}{at 13pt}\otitlefont}
\let\ottitlefont=\ttitlefont \def\ttitlefont{\hfont{nnmbrgtb}{at 13pt}\ottitlefont}
\let\orgninerm=\ninerm \def\ninerm{\hfont{nanummjm}{at 9pt}\orgninerm}
\let\orgeightrm=\eightrm \def\eightrm{\hfont{nanummjm}{at 8pt}\orgeightrm}
\let\orgsc=\sc \def\sc{\hfont{nnmbrgtm}{at 8pt}\orgsc}
\let\orgtentex=\tentex \def\tentex{\hfont{nanumgtm}{at 9pt}\orgtentex}
\let\orguppercase=\uppercase \def\uppercase{\sc\orguppercase}
\expandafter\edef\csname AT(@):catcode\endcsname
{\noexpand\catcode`@\the\catcode`@}
\catcode`\@=11
\def\CEE/{{C\spacefactor1000}}
\def\CPLUSPLUS/{{\CEE/\PP\spacefactor1000}}
\def\page{\box255 } \normalbottom
\parskip 0pt plus 1pt
\def\RA{\char'31 } % right arrow
\def\hang{\hangindent 4em\ignorespaces}
\font\eightrm=cmr8
\font\ninerm=cmr9
\font\ninett=cmtt9
\font\eighttt=cmtt8
\font\twelvett=cmtt12
\font\quoterm=cmssq8
\font\quoteit=cmssqi8
\font\authorfont=cmr12
\font\sectionfont=cmbx12
\def\pb{\.{|...|}}
\def\v{\.{\char'174}} % vertical (|) in typewriter font
\def\lpile{\def\cr{\hfill\endline}\matrix} % I only use \lpile by itself
\abovedisplayskip=.6\abovedisplayskip
\belowdisplayskip=.6\belowdisplayskip
\abovedisplayshortskip=.6\abovedisplayshortskip
\belowdisplayshortskip=.6\belowdisplayshortskip
\advance\baselineskip by -.5pt
\advance\pageheight by \baselineskip % the manual just got a bit longer
\advance\fullpageheight by \baselineskip
\setpage
\outer\def\section #1.{\penalty-500\bigskip
\centerline{\sectionfont\hfont{nanummjb}{at 12pt}%
\def\.##1{{\twelvett##1}} #1}\nobreak\vskip 6pt
\everypar{\hskip-\parindent\everypar{}}}
\def\lheader{\mainfont\the\pageno\hfill\runninghead\hfill}
\def\rheader{\hfill\runninghead\hfill\mainfont\the\pageno}
\def\runninghead{{\tt CWEB} \hfont{outgrm}{at 9pt}사용자 설명서 (버전 3.64)}
% This verbatim mode assumes that ! marks are !! in the text being copied.
\def\verbatim{\begingroup
\def\do##1{\catcode`##1=12 } \dospecials
\parskip 0pt \parindent 0pt \let\!=!
\catcode`\ =13 \catcode`\^^M=13
\tt\hfontname{nanumgtm} \catcode`\!=0 \verbatimdefs \verbatimgobble}
{\catcode`\^^M=13{\catcode`\ =13\gdef\verbatimdefs{\def^^M{\ \par}\let =\ }} %
\gdef\verbatimgobble#1^^M{}}
\null\vfill
\baselineskip 12pt
\centerline{\titlefont The {\ttitlefont CWEB} System of
Structured Documentation}
\vskip 18pt\centerline{(Version 3.64 --- February 2002)}
\vskip 24pt
\centerline{\authorfont Donald E. Knuth and Silvio Levy}
\vfill
\noindent
\TeX\ is a trademark of the American Mathematical Society.
\noindent
Acrobat Reader is a trademark of Adobe Systems Incorporated.
\bigskip\noindent
The printed form of this manual is copyright \copyright\ 1994
by Addison-Wesley Publishing Company, Inc. All rights reserved.
\smallskip\noindent
The electronic form is copyright \copyright\ 1987, 1990, 1993, 2000
by Silvio Levy and Donald E. Knuth.
\bigskip\noindent
Permission is granted to make and distribute verbatim copies of the
electronic form of this document provided that the electronic copyright
notice and this permission notice are preserved on all copies.
\smallskip\noindent
Permission is granted to copy and distribute modified versions of the
electronic form of this document under the conditions for verbatim copying,
provided that the entire resulting derived work is distributed under the terms
of a permission notice identical to this one.
\smallskip\noindent
Individuals may make copies of the documentation from the electronic files
for their own personal use.
\smallskip\noindent
Internet page \.{http://www-cs-faculty.stanford.edu/\char`\~knuth/cweb.html}
contains current info about \.{CWEB} and related topics.
\pageno=-1 \titletrue\eject
\null\vfill
\baselineskip 15pt
\centerline{\titlefont 구조적 문서화의 {\ttitlefont CWEB} 시스템}
\vskip 18pt\centerline{(버전 3.64 --- 2002년 2월)}
\vskip 24pt
\centerline{\hfont{nanummjm}{at 11pt} 도널드 어빈 크누스와 실비오 레비}
\vfill
\noindent
\TeX은 미국 수학 협회의 상표이다.
\noindent
Acrobat Reader는 어도비 시스템즈사의 상표이다.
\bigskip\noindent
이 설명서의 인쇄본은 에디스-웨슬리 출판사에 의해 1994년 저작권으로 보호된다.
\smallskip\noindent
전자 양식은 실비오 레비와 도널드 어빈 크누스에 의해 1987, 1990, 1993, 2000년 저작권으로
보호된다.
\bigskip\noindent
본 문서의 전자 형식의 사본을 제공하고 배포 할 수있는 권한이 있다. 단, 전자 저작권 고지 및
허가 고지가 모든 사본에 보존되어야한다.
\smallskip\noindent
이 문서의 전자 형식 수정 버전을 그대로 복사 조건으로 복사 및 배포 할 수 있다.
단, 결과 파생 저작물 전체가 이 문서와 동일한 허락 고지의 조건에 따라 배포되어야한다.
\smallskip\noindent
개인은 자신의 개인 용도로 전자 파일에서 문서의 사본을 만들 수 있다.
\smallskip\noindent
\.{CWEB}과 그와 관련된 최신 정보는
\.{http://www-cs-faculty.stanford.edu/\char`\~knuth/cweb.html}에 있다.
\pageno=0 \titletrue\eject
\titletrue
\centerline{\titlefont 구조적 문서화의 {\ttitlefont CWEB} 시스템}
\vskip 15pt plus 3pt minus 3pt
\centerline{\hfont{nanummjm}{at 11pt}도널드 어빈 크누스, 실비오 레비}
\vskip 24pt plus 3pt minus 3pt
\noindent
%This document describes a version of Don Knuth's \.{WEB} system,
%adapted to \CEE/ by Silvio Levy. Since its creation in 1987, \.{CWEB}
%has been revised and enhanced in various ways, by both Knuth and Levy.
%We now believe that its evolution is near an end; however, bug
%reports, suggestions and comments are still welcome, and
%should be sent to Levy (\.{[email protected]}).
이 문서는 실비오 레비가 \CEE/에 적용한 돈 크누스의 \.{WEB} 시스템의 한 버전을
설명한다. \.{CWEB} 시스템이 만들어진 1987년 이래로, 크누스와 레비는 다양한
방법으로 시스템을 수정하고 보완하여왔다. 우리는 현재의 시스템이 진화를 거듭한
끝에 거의 막바지에 다다랐다고 믿지만, 여전히 오류 신고, 제안 사항, 도움말들이
있으면, 주저하지 말고 레비(\.{[email protected]})에게 연락하기 바란다.
%Readers who are familiar with Knuth's memo ``The \.{WEB} System of Structured
%Documentation'' will be able
%to skim this material rapidly, because \.{CWEB} and \.{WEB} share
%the same philosophy and (essentially) the same syntax. In some respects
%\.{CWEB} is a simplification
%of \.{WEB}: for example, \.{CWEB} does not need \.{WEB}'s features
%for macro definition and string handling, because \CEE/ and its
%preprocessor already take care of macros and strings. Similarly, the \.{WEB}
%conventions of denoting octal and hexadecimal constants by \.{@'77}
%and \.{@"3f} are replaced by \CEE/'s conventions \.{077} and
%\.{0x3f}. All other features of \.{WEB} have been
%retained, and new features have been added.
크누스의 메모 ``구조적 문서화의 \.{WEB} 시스템''이란 문서에 익숙한 독자는 이
문서를 중간 중간 건너뛰면서 빠르게 읽어 나갈 수 있다. 왜냐하면 \.{CWEB}과
\.{WEB}은 같은 철학과 (근본적으로는) 같은 문법을 공유하기 때문이다. 어떤 면에서
보면 \.{CWEB}은 \.{WEB}의 단순화된 형태이다. 예를들면, \.{CWEB}은 \.{WEB}의
매크로 정의와 문자열 처리 기능이 필요없는데, 이는 \CEE/ 언어와 그의 전처리기가
매크로와 문자열 처리를 담당하고 있기 때문이다.
비슷한 이유로, \.{@'77}과 \.{@"3f}처럼 8진수와 16진수를 표시하던 \.{WEB}의 방식은
\.{077}나 \.{0x3f}처럼 \CEE/의 방식으로 바뀌었다.
그 외의 다른 모든 \.{WEB}의 기능들은 유지되면서 새로운 기능이 추가되었다.
%We thank all who contributed suggestions and criticism to
%the development of \.{CWEB}. We are especially grateful to Steve
%Avery, Nelson Beebe, Hans-Hermann Bode, Klaus Guntermann, Norman Ramsey,
%Joachim Schnitter, and Saroj Mahapatra,
%who contributed code, and to Cameron Smith, who
%made many suggestions improving the manual. Ramsey has made
%literate programming accessible to users of yet other languages by means of
%his \.{SPIDER} system [see {\sl Communications of the ACM\/ \bf32} (1989),
%1051--1055]. The book {\sl Literate Programming\/} by Knuth (1992) contains
%a comprehensive bibliography of related early work.
%Bode, Schnitter, and Mahapatra adapted \.{CWEB} so that it works
%for \CPLUSPLUS/ as well; therefore in the text below you can read \CPLUSPLUS/
%for \CEE/ if you so desire.
\.{CWEB} 개발에 많은 제안과 비평을 해준 모든 분들께 감사의 말을 전한다. 특히, 코드 작성에
기여한 스티브 애버리, 넬슨 비베, 한스-헤르만 보데, 클라우스 군테르만, 노만 램지, 조킴 슈니터,
사로 마하파트라, 그리고 이 문서 작성에 많은 도움을 준 카메론 스미스 에게 감사의 말을 전한다.
램지는 그가 만든 \.{SPIDER} 시스템으로 [{\sl Communications of the ACM\/ \bf32}
(1989), 1051--1055] 다른 프로그래밍 언어로 문학적 프로그래밍을 하도록 해주었다. 크누스의
책인 {\sl\hfontsize{at 9pt}문학적 프로그래밍\/} (1992)은 문학적 프로그래밍과 관련된 많은
참고 문헌들과 초창기 작업의 풍부하고 흥미로운 내용을 담고 있다. 보데, 슈니터, 마하파트라는
\.{CWEB}에서 \CPLUSPLUS/도 사용할 수 있도록 하여서, 독자들은 원하기만 하면, 이 글에서
\CEE/를 \CPLUSPLUS/로 바꾸어 생각해도 된다.
%\section Introduction.
%The philosophy behind \.{CWEB} is
%that programmers who want to provide the best
%possible documentation for their programs need two things
%simultaneously: a language like \TEX/ for formatting, and a language like
%\CEE/ for programming. Neither type of language can provide the
%best documentation by itself. But when both are appropriately combined, we
%obtain a system that is much more useful than either language separately.
\section 서 문.
\.{CWEB}의 배경이 되는 철학은 자신이 작성하는 프로그램에 가능한 최상의 문서를 제공하고자 하는
프로그래머는 동시에 두 가지가 필요한데, 이는 조판을 위한 \TEX/과 같은 언어와 프로그래밍을 위한
\CEE/와 같은 프로그래밍 언어이다. 두 가지 언어 중 어느 한 가지만 가지고는 최상의 문서를
제공할 수 없다. 하지만 이 두 가지 언어를 적절히 조합하면, 각각의 언어가 발휘할 때 보다 더욱
유용한 기능을 갖춘 시스템을 얻게된다.
%The structure of a software program may be thought of as a ``web'' that is
%made up of many interconnected pieces. To document such a program, we want
%to explain each individual part of the web and how it relates to its
%neighbors. The typographic tools provided by \TEX/ give us an opportunity
%to explain the local structure of each part by making that structure
%visible, and the programming tools provided by \CEE/ make it possible
%for us to specify the algorithms formally and unambiguously. By combining
%the two, we can develop a style of programming that maximizes our ability
%to perceive the structure of a complex piece of software, and at the same
%time the documented programs can be mechanically translated into a working
%software system that matches the documentation.
소프트웨어 프로그램의 구조는 내부적으로 많은 작은 부분들이 서로 긴밀히 연결되어 있는
``웹(web)'' 이라고 생각할 수 있다. 그러한 프로그램을 문서화 하기 위해서, 웹을 구성하는 각각의
개별적인 부분들을 설명하고, 그 부분들이 그의 이웃들과 어떠한 연관이 있는지를 설명하고자 할
것이다. \TEX/이 제공하는 인쇄 도구는 각 부분의 구조를 눈에 보이게 하면서 설명할 기회를 주고,
\CEE/가 제공하는 프로그래밍 언어는 알고리즘을 수학적으로 명확하게 기술하도록 해준다.
이 두 언어를 잘 조합함으로써, 우리는 소프트웨어의 복잡한 구조를 쉽게 파악 할 수 있는 능력을
극대화 하는 프로그래밍하는 방법을 개발 할 수 있고, 동시에 문서화된 프로그램은 기계적으로 그
문서에 대응되는 실행 가능한 소프트웨어로 번역 될 수 있다.
%The \.{CWEB} system consists of two programs named \.{CWEAVE} and \.{CTANGLE}.
%When writing a \.{CWEB} program the user keeps the
%\CEE/ code and the documentation in the same file, called the \.{CWEB}
%file and generally named \.{something.w}. The command
%`\.{cweave} \.{something}' creates an output file \.{something.tex}, which
%can then be fed to \TEX/, yielding a ``pretty printed'' version of
%\.{something.w} that correctly handles
%typographic details like page layout and the use of indentation,
%italics, boldface, and mathematical symbols. The typeset output also
%includes extensive cross-index
%information that is gathered automatically. Similarly, if you run the
%command `\.{ctangle} \.{something}' you will get a \CEE/ file \.{something.c},
%which can then be compiled to yield executable code.
\.{CWEB} 시스템은 \.{CWEAVE}와 \.{CTANGLE}이라고 불리는 두 개의 프로그램으로 구성되어
있다. \.{CWEB} 프로그래밍을 할 때는, \.{CWEB} 파일이라고 불리는 하나의 파일에 \CEE/ 코드와
문서화를 동시에 작성하고 그 파일의 이름은 일반적으로 \.{something.w}과 같이 확장자를
\.{.w}로 한다. 명령어 `\.{cweave} \.{something}'를 통해서 \.{something.tex} 파일을
생성하고, 그 파일은 \TEX/으로 컴파일하여 페이지 지면 배열과 프로그램의 들여쓰기, 그리고
예약어나 변수명 혹은 수학 기호들을 각각 다른 폰트로 표현하는 등 우리가 쉽게 읽을 수 있도록
멋진 출력물로 바뀐다. 이 출력물에는 \.{cweave} 명령어가 자동으로 만든 광범위한 상호 참조도
들어있다. 비슷한 방법으로, `\.{ctangle} \.{something}' 이란 명령을 실행하면
\.{something.c}란 이름의 \CEE/ 파일을 얻을 수 있고, 이 파일을 컴파일하여 실행 파일을
얻을 수 있다.
%Besides providing a documentation tool, \.{CWEB} enhances the \CEE/
%language by providing the
%ability to permute pieces of the program text, so that a large system can
%be understood entirely in terms of small sections and their local
%interrelationships. The \.{CTANGLE} program is so named because it takes a
%given web and moves the sections from their web structure into the order
%required by \CEE/; the advantage of programming in \.{CWEB} is that the
%algorithms can be expressed in ``untangled'' form, with each section
%explained separately. The \.{CWEAVE} program is so named because it takes
%a given web and intertwines the \TEX/ and \CEE/ portions contained in
%each section, then it knits the whole fabric into a structured document.
%(Get it? Wow.) Perhaps there is some deep connection here with the fact
%that the German word for ``weave'' is ``{\it webe\/}'', and the
%corresponding Latin imperative is ``{\it texe\/}''!
\.{CWEB}은 \CEE/ 프로그래밍에 단순히 문서화 도구를 제공하는 뿐만 아니라, \CEE/ 언어를
보강하기도 하는데, 이는 프로그램을 여러 작은 조각들로 나누어 큰 시스템을 작은 부분들과 그
각각의 관계로 전체를 이해하는 것이 가능하다. \.{CTANGLE}이란 프로그램은 주어진 웹에서 각
부분들을 그 구조로 부터 \CEE/가 요구하는 순서의 구조로 옮겨서 이름에 그렇게 지어졌다.
\.{CWEB}으로 프로그래밍 하는 잇점은 알고리즘을 얽히지 않은 형태로 표현하고 각 부분을
개별적으로 설명하는 것이다. \.{CWEAVE}라는 프로그램은 웹 파일을 입력받아서 각 부분을
구성하는 \TEX/ 코드와 \CEE/ 코드를 서로 얽히게 놓은 다음에 뜨개질이나 직물을 짜내듯이
하나의 멋진 구조화된 문서를 만들어 내기 때문에 그러한 이름을 얻었다.(그렇죠? 와우.)
영어 단어 ``weave''에 해당하는 독일 단어가 ``webe''이고, 그에 해당하는 라틴어가
``texe''라는 것에는 아마도 일종의 깊은 연관이 있을 것이다.
%A user of \.{CWEB} should be fairly familiar with the \CEE/
%programming language. A minimal amount of acquaintance with \TEX/ is also
%desirable, but in fact it can be acquired as one uses \.{CWEB}, since
%straight text can be typeset in \TEX/ with virtually no knowledge of
%that language. To someone familiar with both \CEE/ and \TEX/ the amount of
%effort necessary to learn the commands of \.{CWEB} is small.
\.{CWEB}을 하기 위해서는 반드시 \CEE/ 프로그래밍 언어를 잘 알아야 한다. 최소한의 \TEX/에
대한 지식도 있으면 좋겠지만, \.{CWEB} 프로그래밍을 하면서 \TEX/에 대한 지식은 자동으로 얻게
될 것인데, 이는 \TEX/에서 사용되는 단순한 글은 \TEX/에 대한 지식이 거의 없어도 가능하기
때문이다. 물론 \CEE/ 언어와 \TEX/에 모두 익숙한 독자는 적은 노력으로 \.{CWEB} 명령어를
배우게 된다.
%\section Overview.
%Two kinds of material go into \.{CWEB} files: \TEX/ text and \CEE/ text.
%A programmer writing in \.{CWEB} should be thinking both of the
%documentation and of the \CEE/ program being created;
%i.e., the programmer should be instinctively aware of the different
%actions that \.{CWEAVE} and \.{CTANGLE} will perform on the \.{CWEB} file.
%\TEX/ text is essentially copied without change by \.{CWEAVE}, and it is
%entirely deleted by \.{CTANGLE}; the \TEX/ text is ``pure
%documentation.'' \CEE/ text, on the other hand, is formatted by
%\.{CWEAVE} and it is shuffled around by \.{CTANGLE}, according to rules that
%will become clear later. For now the important point to keep in mind is
%that there are two kinds of text. Writing \.{CWEB} programs is something
%like writing \TEX/ documents, but with an additional ``\CEE/ mode''
%that is added to \TEX/'s horizontal mode, vertical mode, and math mode.
\section 개 요.
\.{CWEB} 파일에는 \TEX/ 텍스트와 \CEE/ 텍스트라는 두 종류의 소재가 들어간다.
\.{CWEB} 프로그래머는 만들고자 하는 문서와 \CEE/ 프로그램을 동시에 생각해야
한다. 즉, 프로그래머는 본능적으로 \.{CWEAVE}와 \.{CTANGLE} 프로그램이
\.{CWEB} 파일을 어떻게 처리할지를 미리 알고 있어야 한다. \.{CWEAVE}는
\TEX/ 파일을 만들 때, \.{CWEB} 파일 내의 \TEX/ 텍스트를 그대로
\TEX/ 파일에 복사하지만, \.{CTANGLE}은 \CEE/ 파일을 만들 때, \TEX/
텍스트를 모두 제거하여 전혀 포함하지 않는다. \TEX/ 텍스트는 순전히
문서화를 위한 텍스트로써, \.{CTNALGE}은 이를 완전히 무시하는 반면에,
\.{CWEAVE}는 \CEE/ 텍스트를 보기 좋게 문서화 하고, \.{CTNALGE}은 그것을
본래 \CEE/ 문법에 맞게 재배치한다. 재배치 규칙은 나중에
자세히 설명하게 될 것이다. 지금 이 순간, 기억해야 할 것은 두 종류의
텍스트가 있다는 것이다. \.{CWEB} 프로그램을 작성한다는 것은 보통의 \TEX/
문서를 만든다는 것과 같고, 단지 \TEX/의 기본적인 모드인 수평 모드,
수직 모두, 수학 모드에 ``\CEE/ 모드''가 더해진 것이라고 생각하면 된다.
%A \.{CWEB} file is built up from units called {\sl sections\/} that are more
%or less self-contained. Each section has three parts:
\.{CWEB} 파일은 {\sl\hfontsize{at 9pt}섹션}이라고 하는 하나의 온전한 의미가 있는 단위들로
구성된다. 각 섹션은 다음과 같은 세 개의 파트를 가지고 있다.
%\yskip\item{$\bullet$} A \TEX/ part, containing explanatory material about
%what is going on in the section.
\yskip\item{$\bullet$} \TEX/ 파트, 섹션이 어떤 일을 하는지에 대한 설명을 담고 있다.
%\item{$\bullet$} A middle part, containing macro definitions that serve as
%abbreviations for \CEE/ constructions that would be less comprehensible
%if written out in full each time. They are turned by \.{CTANGLE} into
%preprocessor macro definitions.
\item{$\bullet$} 중간 파트, \CEE/언어에서 제공하는 매크로 정의 부분을 담고
있다. 이 파트는 \.{CTNAGLE}에 의해서 전처리기 매크로 정의로 변환된다.
%\item{$\bullet$} A \CEE/ part, containing a piece of the program that
%\.{CTANGLE} will produce. This \CEE/ code should ideally be about a
%dozen lines long, so that it is easily comprehensible as a unit and so
%that its structure is readily perceived.
\item{$\bullet$} \CEE/ 파트, \.{CTANGLE}이 만들어내는 \CEE/ 프로그램 코드이다.
\CEE/ 코드는 하나의 단위로 쉽게 이해될 수 있을 정도의 십여 줄 내외의 프로그램 텍스트이다.
%\yskip\noindent The three parts of each section must appear in this order;
%i.e., the \TEX/ commentary must come first, then the middle part, and
%finally the \CEE/ code. Any of the parts may be empty.
\yskip\noindent 위의 세 파트는 섹션에서 반드시 위의 순서대로 나열되어야 한다.
즉 \TEX/ 파트가 가장 먼저 오고, 그 다음에 중간 파트, 마지막으로 \CEE/ 코드가 온다.
세 개의 파트들 중 어느 것이나 생략할 수 있다.
%A section begins with either of the symbols `\.{@\ }' or `\.{@*}', where
%`\.{\ }' denotes a blank space. A section ends
%at the beginning of the next section (i.e., at the next
%`\.{@\ }' or `\.{@*}'), or at the end of the file, whichever comes first.
%The \.{CWEB} file may also contain material that is not part of any section
%at all, namely the text (if any) that occurs before the first section.
%Such text is said to be ``in limbo''; it is ignored by \.{CTANGLE}
%and copied essentially verbatim by \.{CWEAVE}, so its function is to
%provide any additional formatting instructions that may be desired in the
%\TEX/ output. Indeed, it is customary to begin a \.{CWEB} file with
%\TEX/ code in limbo that loads special fonts, defines special macros,
%changes the page sizes, and/or produces a title page.
하나의 섹션은 `\.{@\ }' 또는 `\.{@*}' 기호로 시작된다. 여기서 `\.{\ }'는 빈칸을
나타낸다. 섹션은 그 다음 섹션이 시작하는 곳에서 끝나거나
(즉, 다음의 `\.{@\ }' 또는 `\.{@*}') 파일의 끝에서 끝난다. 또한, \.{CWEB}
파일에는 어떠한 섹션에도 포함되지 않는 텍스트가 있다. 이른바 맨 첫 번째
섹션 앞에 나오는 텍스트로써 그러한 경우, 텍스트를 ``림보에 둔다'' 라고 한다.
\.{CTNAGLE}은 림보에 있는 텍스트를 완전히 무시하지만 \.{CWEAVE}는 \TEX/ 파일에
글자 그대로 복사한다. 인림보의 기능은 원하는 \TEX/ 출력 결과를 얻기 위한 문서
포멧팅 명령어들을 제공하는 것이다. 실로, 림보에 특별한 글꼴을 불러오거나 매크로를 정의
하거나 페이지의 크기를 정한다거나 혹은 타이틀 페이지를 만드는 코드 등을
그곳에 담아서 \.{CWEB}파일을 시작하는 관례이다.
%Sections are numbered consecutively, starting with 1. These numbers appear
%at the beginning of each section of the \TEX/ documentation output by
%\.{CWEAVE}, and they appear
%as bracketed comments at the beginning and end of the code generated by that
%section in the \CEE/ program output by \.{CTANGLE}.
섹션들은 1부터 시작해서 순차적으로 번호가 붙는다. 이 번호들은 \.{CWEAVE}가
만들어 내는 \TEX/ 문서의 각 섹션의 맨 앞에 붙어서 섹션의 시작을 나타낸다.
그리고 이 번호들은 \.{CTANGLE}이 만들어내는 \CEE/ 프로그램에서 해당 섹션에
의해서 만들어진 코드의 시작부와 끝 부분에 \CEE/의 주석문으로 나타나기도 한다.
%\section Section Names.
%Fortunately, you never mention these numbers yourself when you are writing
%in \.{CWEB}. You just say `\.{@\ }' or `\.{@*}' at the beginning of each
%new section, and the numbers are supplied automatically by \.{CWEAVE} and
%\.{CTANGLE}. As far as you are concerned, a section has a
%{\sl name\/} instead of a number; its name is specified by writing
%`\.{@<}' followed by \TEX/ text followed by `\.{@>}'. When \.{CWEAVE}
%outputs a section name, it replaces the `\.{@<}' and `\.{@>}' by
%angle brackets and inserts the section number in small type. Thus, when you
%read the output of \.{CWEAVE} it is easy to locate any section that is
%referred to in another section.
\section 섹션 이름.
다행히도 \.{CWEB} 파일을 작성할 때, 섹션 앞에 붙는 섹션 번호를 매기느라 수고할 필요가 전혀
없다. 그저 단순히 각 섹션의 시작부에 `\.{@\ }' 혹은 `\.{@*}'를 붙여주면, 섹션 번호는
\.{CWEAVE}와 \.{CTANGLE}이 알아서 자동적으로 매겨준다. 섹션은 번호로 인식되는 것이 아니라
{\sl 이름}으로 인식된다. 섹션 이름은 `\.{@<}', \TEX/ 텍스트, `\.{@>}' 순으로
구성된다. \.{CWEAVE}가 섹션 이름을 출력할 때는 `\.{@<}'와 `\.{@>}'를 꺾쇠 괄호로 바꾸고
그 안에 작은 글꼴로 섹션 번호를 매겨 넣는다. 따라서 \.{CWEAVE}가 만들어낸 출력물을 읽을 때
하나의 섹션에서 언급된 다른 섹션은 번호를 이용해서 쉽게 찾을 수 있다.
%For expository purposes, a section name should be a good description of the
%contents of that section; i.e., it should stand for the abstraction
%represented by the section. Then the section can be ``plugged into'' one or
%more other sections in such a way
%that unimportant details of its inner workings
%are suppressed. A section name therefore ought to be long enough to convey
%the necessary meaning.
섹션이 어떤 일을 하는지 한눈에 알아보기 위해서, 섹션 이름은 그 섹션의 내용을 잘 설명할
수 있는 것이어야 한다. 즉, 섹션 이름은 그 이름만 보고도 이 섹션이 무슨 일을 하는 섹션인지 알
수 있을 정도의 일목요연한 문구이어야 한다. 섹션은 다른 섹션에 포함될 수 있는데, 이때 섹션을
포함하는 섹션에서 중요하지 않지만 상세한 설명이 필요한 부분에 그 설명에 해당하는 섹션을 끼워
넣어서 섹션을 보다 읽기 좋고 간결하게 할 수 있다. 따라서 섹션 이름은 그 섹션이 전달하고자 하는
의미를 분명히 반영할 수 있을 정도의 충분한 길이이어야 한다.
%Unfortunately, it is laborious to type
%such long names over and over again, and it is also difficult to specify a
%long name twice in exactly the same way so that \.{CWEAVE} and \.{CTANGLE}
%will be able to match the names to the sections. To ameliorate this situation,
%\.{CWEAVE} and \.{CTANGLE} let you abbreviate a section name, so long as
%the full name appears somewhere in the \.{CWEB} file; you can type simply
%`\.{@<$\alpha$...@>}', where $\alpha$ is any string that is a prefix of
%exactly one section name appearing in the file. For example, `\.{@<Clear
%the arrays@>}' can be abbreviated to `\.{@<Clear...@>}' if no other section
%name begins with the five letters `\.{Clear}'. Elsewhere
%you might use the abbreviation `\.{@<Clear t...@>}', and so on.
%나쁜 소식은
불행하게도, 위 설명대로 섹션이 하는 일을 요약해서 섹션 이름을 정하면, 섹션 이름이 다소 길어질
경우가 생기는데, 섹션 이름이 길어지면 나중에 혹은 다른 곳에서 그 섹션을 언급할 필요가 있을
때마다 섹션의 긴 이름을 매번 자판을 두드려 입력해야 하는 매우 수고로운 작업을 해야 한다.
이런 수고를 덜기 위해서, \.{CWEAVE}와 \.{CTANGLE}은 섹션 이름을 간단하게 하는 기능을
가지고 있다. \.{CWEB} 파일 내의 어디에선가 정확한 섹션 이름이 한번이라도 언급이 되면, 단순히
`\.{@<$\alpha$...@>}'처럼 입력해 넣으면 된다. 여기서 $\alpha$는 하나의 섹션을 정확하게
구분해 낼 수 있는 최소 길이의 접두어이다. 예를 들면, `\.{@<Clear the arrays@>}'라는 섹션
이름은 `Clear'라는 다섯 글자로 시작되는 다른 섹션 이름이 없다면 `\.{@<Clear...@>}'로
간단하게 할 수 있다. 만약에 `Clear'로 시작하는 다른 섹션이 있다면, `\.{@<Clear t...@>}'
등과 같이 이 섹션을 다른 섹션 이름과 구별할 수 있는 최소의 길이로 간략화하면 된다.
%Section names must otherwise match character for character, except
%that consecutive characters of white space (spaces, tab marks, newlines,
%and/or
%form feeds) are treated as equivalent to a single space, and such spaces are
%deleted at the beginning and end of the name. Thus, `\.{@< Clear { }the
%arrays @>}' will also match the name in the previous example.
%Spaces following the ellipsis in abbreviations are ignored as well, but
%not those before, so that `\.{@<Clear t ...@>}' would not match
%`\.{@<Clear the arrays@>}'.
두 개의 섹션 이름이 같은 것인지 비교 할 때는 섹션 이름을 구성하는 문자 하나하나를 서로
매치해가면서 비교하게 된다. 이때 한 가지 예외가 있는데, 여러 개의 연속적인 공백 문자(스페이스,
탭, 개행문자 또는 용지먹임(form feed)들은 하나의 빈칸으로 인식되고 섹션 이름의 앞과 뒤에
나오는 공백 문자들은 제거된다. 따라서 섹션 이름 `\.{@< Clear the arrays@>}'는 앞서 예와
같은 이름이다. 간략화된 이름에서 생략기호($\ldots$) 다음에 나오는 공백도 마찬가지로
무시되지만, 생략기호 앞에 나오는 공백문자는 공백으로 인식된다. 따라서
`\.{@<Clear t ...@>}'는 `\.{@<Clear the arrays@>}'와 서로 다른 섹션이다.
%\section What \.{CTANGLE} Does.
%We have said that a section begins with `\.{@\ }' or `\.{@*}', but we
%didn't say how it gets divided up into a \TEX/ part, a middle part,
%and a \CEE/ part. The middle part begins with the first appearance of
%`\.{@d}' or `\.{@f}' in the section, and the \CEE/ part begins with
%the first appearance of `\.{@c}' or `\.{@<section name@>=}'. In the
%latter case you are saying, in effect, that the section name stands
%for the \CEE/ text that follows. Alternatively, if the \CEE/ part
%begins with `\.{@c}' instead of a section name, the current section is
%said to be {\sl unnamed}.
\section \.{CTANGLE}이 하는 일.
섹션 이름이 `\.{@\ }' 또는 `\.{@*}'로 시작된다고 하였는데, 섹션이 어떻게 \TEX/ 파트,
중간 파트, \CEE/ 파트의 세 파트로 나뉘는지에 대해서는 설명하지 않았다. 섹션 내에서
중간 파트는 `\.{@d}' 또는 `\.{@f}'가 처음 나타나는 곳 부터 시작되고, \CEE/ 파트는
`\.{@c}' 또는 `\.{@<섹션 이름@>=}'이 처음 나타나는 곳 부터 시작된다. 후자의 경우로
\CEE/ 파트를 시작한다는 것은 섹션 이름이 \CEE/ 텍스트가 하는 일을 요약 설명한다는 것을
의미한다. \CEE/ 파트가 섹션 이름 대신에 `\.{@c}'로 시작하면 그 섹션은 이름이 없다는
것을 뜻한다.
%The construct `\.{@<section name@>}' can appear
%any number of times in the \CEE/ part of a section:
%Subsequent appearances indicate that a named section is being
%``used'' rather than ``defined.'' In other words, the
%\CEE/ code for the named section, presumably defined elsewhere, should be
%spliced in at this point in the \CEE/ program. Indeed,
%the main idea of \.{CTANGLE} is to make a \CEE/ program out of
%individual sections, named and unnamed. The exact way in which this is done
%is this: First all the macro definitions
%indicated by `\.{@d}' are turned into \CEE/ preprocessor macro definitions
%and copied at the beginning.
%Then the \CEE/ parts of unnamed sections are copied down,
%in order; this constitutes the first-order
%approximation to the text of the program. (There should be at least
%one unnamed section, otherwise there will be no program.) Then all section
%names that appear in the first-order approximation are replaced by the \CEE/
%parts of the corresponding sections, and this substitution process
%continues until no section names remain. All comments are removed, because
%the \CEE/ program is intended only for the eyes of the \CEE/ compiler.
섹션 이름을 구성하는 `\.{@<섹션 이름@>}'은 다른 섹션들의 \CEE/ 파트에 몇 번이고 나타날 수
있다. 최초에 섹션의 \CEE/ 파트를 정의하기 위해 쓰인 `\.{@<섹션 이름@>}'를 제외한 나머지의
쓰임은 그 섹션이 ``정의''된다는 의미가 아니라 ``사용''된다는 의미이다. 다른 말로 하면,
이미 다른 곳에서 정의된 섹션의 \CEE/ 코드는 현재 `\.{@<섹션 이름@>}'이 나타난 \CEE/
프로그램의 바로 그 지점에 삽입되어야 한다는 것이다. \.{CTANGLE}이 하는 주된 일은 각각의
이름을 가진 섹션과 이름이 없는 섹션들로부터 \CEE/ 프로그램을 만들어 낸다는 것이다. 그 방법은
다음과 같다. 먼저 `\.{@d}'로 표시되는 모든 매크로 정의들이 \CEE/ 언어의 전처리기 매크로
정의들로 변환되면서 파일의 맨 처음으로 복사된다. 그리고 나서 이름 없는 섹션의 \CEE/ 파트들이
그다음에 차례로 복사된다. \.{CTANGLE}은 여러 번의 패스를 통하여 \.{CWEB} 파일로부터 \CEE/
프로그램을 만들어 내는데, 지금까지의 절차로 말미암아 1차 패스의 결과물을 얻게 된다.
(\.{CWEB} 파일에는 이름 없는 섹션이 적어도 하나는 있어야 한다. 그렇지 않으면 \CEE/
프로그램이 만들어지지 않는다.) 그리고 나서, 1차 패스 결과물 내의 모든 섹션 이름들은 해당하는
섹션의 \CEE/ 파트로 치환되고, 이 치환 작업은 이름을 가진 섹션이 하나도 남지 않을 때까지
계속된다. 또한, \CEE/ 파트 내의 모든 주석문들은 제거된다. \.{CTANGLE}이 만들어 내는
\CEE/ 프로그램은 오로지 \CEE/ 컴파일러용으로 출력물을 만들기 때문이다.
%If the same name has been given to more than one section, the \CEE/ text
%for that name is obtained by putting together all of the \CEE/ parts in
%the corresponding sections. This feature is useful, for example, in a
%section named `Global variables', since one can then
%declare global variables in whatever sections those variables are
%introduced. When several sections have the same name, \.{CWEAVE} assigns the
%first section number as the number corresponding to that name, and it
%inserts a note at the bottom of that section telling the reader to `See
%also sections so-and-so'; this footnote gives the numbers of all the other
%sections having the same name as the present one. The \CEE/ text
%corresponding to a section is usually formatted by \.{CWEAVE} so that the
%output has an equivalence sign in place of the equals sign in the \.{CWEB}
%file; i.e., the output says `$\langle\,$section
%name$\,\rangle\equiv\null$\CEE/ text'. However, in the case of the second
%and subsequent appearances of a section with the same name, this `$\equiv$'
%sign is replaced by `$\mathrel+\equiv$', as an indication that the
%following \CEE/ text is being appended to the \CEE/ text of another section.
만일 같은 섹션 이름이 다른 여러 섹션의 이름으로 사용된다면, 그 이름을 가진 섹션의
\CEE/ 파트는 이 섹션 이름을 사용하는 섹션의 \CEE/ 파트들의 합으로 이루어진다. \.{CWEB}의
이 기능은 매우 편리한 기능이다. \CEE/ 언어에서 전역 변수는 대개 프로그램의 첫 부분에 그
프로그램에서 사용되는 모든 전역 변수들을 한 곳에서 정의하거나 선언한다. 그런데 모든 변수들을
한 곳에서 정의하기보다는 그 변수가 사용되는 시점에서 그 변수에 대한 설명과 함께 정의를 하면
그 변수에 대한 의미가 확실해지고 프로그램을 읽어나가기가 더울 수월해질 것이다. 하지만, \CEE/
언어는 이러한 기능을 제공하지 않는다. 이때, 방금 전에 설명한 \.{CWEB}의 기능을 사용할 수
있다. 예를 들어 `전역 변수들'이라는 이름을 가진 섹션이 있다고 하자. 이 섹션이 여러 섹션의 이름
으로 사용된다면, 전역 변수들은 여러 섹션에 걸쳐서 정의되지만, 결국은 이 모든 전역 변수들이
처음에 정의한 `전역 변수들' 이란 이름을 가진 섹션에 모이게 된다. 여러 개의 섹션이 같은 이름을
가질 때마다, \.{CWEAVE}는 그 이름의 섹션이 처음 정의되는 곳에 그 섹션의 번호를 할당하고,
그 섹션 밑에 각주로써 이 섹션이 다른 섹션에서 사용된다는 것을 알려주기 위해서
`이러저러한 섹션들도 보라.'라고 써넣는다. 이 각주에는 이 섹션을 \CEE/ 파트로
사용하는 모든 섹션들의 번호가 나타나게 된다. 섹션의 \CEE/ 텍스트는 \.{CWEB} 파일 내에서
등호(=)기호로 나타나는데, 이는 \.{CWEAVE}에 의해서 `$\equiv$' 기호로 바뀐다.
즉, `$\langle\,$섹션 이름$\,\rangle\equiv\null$\CEE/ 텍스트'로 바뀌게 된다.
그러나 동일한 이름의 섹션이 여러 번 나타날 때, 두 번째 부터는 현재 나타나는 섹션은
다른 섹션의 \CEE/ 텍스트에 첨가된다는 의미로 `$\equiv$' 기호가 `$\mathrel+\equiv$'로
바뀐다.
%As \.{CTANGLE} enters and leaves sections, it inserts preprocessor
%\.{\#line} commands into the \CEE/ output file. This means that
%when the compiler gives you error messages, or when you debug your program,
%the messages refer to line numbers in the \.{CWEB} file, and not in the
%\CEE/ file. In most cases you can therefore
%forget about the \CEE/ file altogether.
\.{CTANGLE}은 섹션을 처리할 때마다, \.{CTANGLE}의 출력물인 \CEE/ 파일에 전처리기
명령어인 \.{\#line} 문을 써넣는다. 이는 \CEE/ 파일을 컴파일 할때, 컴파일러가 에러 메시지를
내거나, 혹은 디버깅 할때, \CEE/ 파일이 아니라 \.{CWEB} 파일의 라인 넘버가 나오므로 원래
작성한 파일을 가지고 작업을 할 수 있도록 하기 위함이다. 따라서 대개 \.{CTANGLE}이 만들어
낸 \CEE/ 파일을 직접 다루는 일은 없다.
%\section What \.{CWEAVE} Does.
%The general idea of \.{CWEAVE} is to make a \.{.tex} file from the \.{CWEB}
%file in the following way: The first line of the \.{.tex} file
%tells \TEX/ to input a file with macros that
%define \.{CWEB}'s documentation conventions. The next lines of the file
%will be copied from whatever \TEX/ text is in limbo before the first
%section. Then comes the output for each section in turn, possibly
%interspersed with end-of-page marks. Finally, \.{CWEAVE} will generate a
%cross-reference index that lists each section number in which each \CEE/
%identifier appears, and it will also generate an alphabetized list
%of the section names, as well as a table of contents that
%shows the page and section numbers for each ``starred'' section.
\section \.{CWEAVE}가 하는 일.
\.{CWEAVE}가 하는 일은 \.{CWEB} 파일로부터 \.{.tex} 파일을 만들어내는 것인데, 그 방법은
다음과 같다. 우선 \.{.tex}의 맨 첫 줄은 다른 \.{.tex} 파일들이 그렇듯이, \.{CWEB}의
문서화를 위한 규칙들을 만들어 놓은 매크로 파일을 포함하는 것이다. 그리고 다음 줄부터 \.{CWEB}
파일의 림보에 정의된 \TEX/ 텍스트들이 그대로 복사된다. 그 다음부터 각 섹션에 대한 출력
결과가 차례로 나온다. 이 과정에서 각 페이지에 섹션들이 적절히 배치된다. 마지막으로,
\.{CWEAVE}는 색인 페이지를 만드는데, 이 색인 페이지에는 각각의 \CEE/ 프로그램에 사용된
변수명 이라든가 여러 식별자 들이 나오고, 이 파일을 구성하는 모든 섹션들이 섹션 이름의
알파벳순으로 나온다. 또한, 색인 페이지뿐만 아니라 별표 섹션과 그의 번호를 나타내는
목차도 만든다.
%What is a ``starred'' section, you ask? A section that begins with `\.{@*}'
%instead of `\.{@\ }' is slightly special in that it denotes a new major
%group of sections. The `\.{@*}' should be followed by the title of this
%group, followed by a period. Such sections will always start on a new page
%in the \TEX/ output, and the group title will appear as a running headline
%on all subsequent pages until the next starred section. The title will also
%appear in the table of contents, and in boldface type at the beginning of
%its section. Caution: Do not use \TEX/ control sequences in such titles,
%unless you know that the \.{cwebmac} macros will do the right thing with
%them. The reason is that these titles are converted to uppercase when
%they appear as running heads, and they are converted to boldface when they
%appear at the beginning of their sections, and they are also written out to
%a table-of-contents file used for temporary storage while \TEX/ is
%working; whatever control sequences you use must be meaningful in all
%three of these modes.
``별표'' 섹션이 무엇인가 하고 의문을 가졌을 것이다. 앞에서 살펴보았듯이 보통의 섹션은
`\.{@\ }'로 시작하는데, 별표 섹션은 `\.{@*}'로 시작한다. 다른 보통의 섹션과 크게 다른 점은
없다. 단순히 여러 섹션으로 구성되는 그룹을 대표하는 의미가 있다. `\.{@*}' 다음에는 반드시
그룹의 제목이 나오고 그 뒤에 마침표가 나와야 한다. 이러한 별표 섹션은 \TEX/ 출력물에서 보면
반드시 새로운 페이지로 시작되고, 제목은 다음 별표 섹션이 나오기 전까지 그 페이지와 그 뒤의
모든 페이지의 면주에 사용된다. 그리고 제목은 목차에도 나오고, 섹션의 시작부에 굵은 글꼴로
출력된다.
주의: 이러한 제목에 \TEX/의 명령어는 사용하지 말아야 한다. 만약에 사용한다면, 출력물이
원하는 모양이 나오지 않을 수도 있다. 왜냐하면, 제목들이 각 페이지의 면주에 사용 될 때는
제목의 각 글자는 대문자로 바뀌고, 섹션의 처음에 나올 때는 굵은 글꼴로 바뀌고, 또한 목차에도
사용되기 때문이다. 이 세 가지 경우 모두 문제를 일으키지 않을 명령어라면 사용해도 된다.
%The \TEX/ output produced by \.{CWEAVE} for each section consists of
%the following: First comes the section number (e.g., `\.{\\M123.}'
%at the beginning of section 123, except that `\.{\\N}' appears in place of
%`\.{\\M}' at the beginning of a starred section). Then comes the
%\TEX/ part of the section, copied almost verbatim except as noted
%below. Then comes the middle part and the \CEE/ part, formatted
%so that there will be a little extra space between them if both are
%nonempty. The middle and \CEE/ parts are obtained by inserting
%a bunch of funny-looking \TEX/ macros into the \CEE/ program; these
%macros handle typographic details about fonts and proper math spacing,
%as well as line breaks and indentation.
각 섹션에 대해서 \.{CWEAVE}가 만들어 내는 \TEX/ 출력물은 다음과 같이 구성된다. 먼저 섹션
번호가 나온다. (예를 들어, 123번 섹션의 시작에 `\.{\\M123.}'가 온다. 만약 이 섹션이 별표
섹션이라면, `\.{\\M}' 대신에 `\.{\\N}'이 쓰인다.) 그리고 나서 그 섹션의 \TEX/ 파트가
\.{CWEB} 파일에 입력해 넣은 그대로 복사되어 온다. 그 뒤로 중간 파트, \CEE/ 파트가 그들
사이에 약간의 간격을 두고 온다. 중간부와 \CEE/ 파트는 \TEX/ 파트 처럼 그냥 그대로 복사되어
오는 것은 아니고, 멋진 문서를 만들어 내기 위해서 매크로 파일에 정의된 대로 변환된다.
%\section C Code in \TEX/ Text and Vice Versa.
%When you are typing \TEX/ text, you will probably want to make frequent
%reference to variables and other quantities in your \CEE/ code, and you
%will want those variables to have the same typographic treatment
%when they appear in your text as when they appear in your
%program. Therefore the \.{CWEB} language allows you to get the effect of
%\CEE/ editing within \TEX/ text, if you place `\.|' marks before and
%after the \CEE/ material. For example, suppose you want to say something
%like this:
%$$\hbox{ If \\{pa} is declared as `\&{int} ${}{*}\\{pa}$',
%the assignment $\\{pa}\K{\AND}\|a[\T{0}]$ makes \\{pa}
%point to the zeroth element of \|a.}$$
%The \TEX/ text would look like this in your \.{CWEB} file:
%$$\lpile{\.{If |pa| is declared as `|int *pa|', the}\cr
%The \TEX/ text would look like this in your \.{CWEB} file:
%$$\lpile{\.{If |pa| is declared as `|int *pa|', the}\cr
%\.{assignment |pa=\&a[0]| makes |pa| point
%to the zeroth element of |a|.}\cr}$$
%And \.{CWEAVE} translates this into something you are glad you didn't have
%to type:
%$$\lpile{\.{If \\\\\{pa\} is declared as
% `\\\&\{int\} \$\{\}\{*\}\\\\\{pa\}\$',}\cr
%\.{the assignment \$\\\\\{pa\}\\K\{\\AND\}\\|a[\\T\{0\}]\$}\cr
%\.{makes \\\\\{pa\} point to the zeroth element of \\|a.}\cr}$$
\section \TEX/ 텍스트 내의 C 코드와 그의 역.
\TEX/ 텍스트를 입력하다 보면, \CEE/ 코드에서 사용된 변수들이나 다른 \CEE/의 요소들을 \TEX/
텍스트 내에서 사용할 일이 자주 생긴다. 이 경우에 그 변수들이나 요소들을 \CEE/ 코드에서
사용되던 그대로의 글꼴이나 모양을 유지해야 한다. 그래서 \.{CWEB} 언어는 그러한 기능을
제공하는데, 표현하고자 하는 \CEE/ 코드를 `\.|'로 둘러싸면 된다. 예를 들어 다음과 같은 \TEX/
문장을 얻고자 한다고 해보자.
$$\hbox{ 변수 \\{pa}를 `\&{int} ${}{*}\\{pa}$'로 선언하면,
식 $\\{pa}\K{\AND}\|a[\T{0}]$는 \\{pa}가 \|a의 0번째 원소를 가리킨다.}$$
위 문장을 얻기 위해서 \.{CWEB} 파일에 아래와 같은 \TEX/ 텍스트를 입력해야 할 것이다.
$$\lpile{\.{변수 |pa|를 `|int *pa|'로 선언하면,}\cr
\.{식 |pa=\&a[0]|는 |pa|가 |a|의 0번째 원소를 가리킨다.}\cr}$$
그리고 \.{CWEAVE}는 위의 문장을 마치 암호처럼 보이는 아래와 같은 문장으로 변환한다.
$$\lpile{\.{변수 \\\\\{pa\}가
`\\\&\{int\} \$\{\}\{*\}\\\\\{pa\}\$'로 선언될 때,}\cr
\.{식 \$\\\\\{pa\}\\K\{\\AND\}\\|a[\\T\{0\}]\$는 %}\cr
\\\\\{pa\}가 \\|a의 0번째 원소를 가리킨다.}\cr}$$
%Incidentally, the cross-reference index that \.{CWEAVE} would make, in
%the presence of a comment like this, would include
%the current section number as one of the index entries for \\{pa},
%even though \\{pa} might not appear in the \CEE/ part of
%this section. Thus, the index covers references to identifiers in
%the explanatory comments as well as in the program itself; you will
%soon learn to appreciate this feature. However, the identifiers
%\&{int} and \|a\ would not be indexed,
%because \.{CWEAVE} does not make index entries for reserved words or
%single-letter identifiers. Such identifiers are felt to be so ubiquitous
%that it would be pointless to mention every place where they occur.
덧붙여 말하자면, 위와 같은 문장이 주어졌을때, 비록 이 섹션의 \CEE/ 파트에 \\{pa}가
없을지라도, \.{CWEAVE}가 생성하는 색인은 \\{pa}의 색인으로 현재 섹션 번호를 포함한다.
색인은 프로그램에서 사용된 변수들뿐만 아니라, 보통의 설명을 하는 문장에 사용된 변수들까지도
모두 포함한다. 이 기능을 매우 유용한 기능이다. 그러나 \&{int}나 \|a 와 같은 것들은
색인에 포함되지 않는데, 이는 \.{CWEAVE}가 \CEE/ 언어의 예약어나 한 글자짜리 변수나
식별자들은 색인에 포함하지 않는다는 규칙 때문이다. 그러한 변수나 식별자들은 너무나도 흔하고
널리 사용되는 것이라 그들이 사용되는 모든 섹션 번호를 색인 포함하는 것은 자칫하면
초점을 흐릴 수 있다.
%Although a section begins with \TEX/ text and ends with \CEE/ text, we
%have noted that the dividing line isn't sharp, since \CEE/ text can be
%included in \TEX/ text if it is enclosed in `\pb'. Conversely, \TEX/ text
%appears frequently within \CEE/ text, because everything in
%comments (i.e., between \.{/*} and \.{*/}, or following \.{//})
%is treated as \TEX/ text.
%Likewise, the text of a section name consists of \TEX/ text, but
%the construct \.{@<section name@>} as a whole is expected to be found
%in \CEE/ text; thus, one typically goes back and forth
%between the \CEE/ and \TEX/ environments in a natural way, as in these
%examples:
%$$
%\displaylines{
%\hbox{\.{if} \.{(x==0)} \.{@<Empty} \.{the} \.{|buffer|} \.{array@>}} \cr
%\hbox{\.{...} \.{using} \.{the} \.{algorithm}
%\.{in} \.{|@<Empty} \.{the} \.{|buffer|} \.{array@>|.}} }
%$$
비록 섹션이 \TEX/ 텍스트로 시작해서 \CEE/ 텍스트로 끝난다고 할지라도, \CEE/ 텍스트가
`\pb'로 둘러싸여 있으면, 그 \CEE/ 텍스트가 \TEX/ 텍스트 내에 포함될 수 있기 때문에,
각 텍스트를 구분하는 곳이 명확하지 않을 수 있다. 역으로, \CEE/의 주석문 (즉, \.{/*} 와
\.{*/} 사이에 있는 것들, 또는 \.{//} 다음에 나오는 것들)에 있는 모든 것들은 사실상 \TEX/
텍스트로 취급되기 때문에, \CEE/ 텍스트 내에도 \TEX/ 텍스트가 매우 빈번히 나타난다고 할 수
있다. 마찬가지로, 섹션 이름은 \TEX/ 텍스트이지만, \.{@<섹션 이름@>}이 자체가 \CEE/ 텍스트
내에서도 발견될 수 있는 것이다. 따라서 아래의 예와 같이 \CEE/와 \TEX/ 환경을 자연스럽게
왔다갔다할 수 있다.
$$
\displaylines{
\hbox{\.{if} \.{(x==0)} \.{@<배열} \.{|buffer|를} \.{초기화하라@>}} \cr
\hbox{\.{|@<배열} \.{|buffer|를} \.{초기화하라@>|에}
\.{사용된} \.{알고리듬을} \.{이용해서} \.{...} }}
$$
%The first of these excerpts
%would be found in the \CEE/ part of a section, into which the code
%from the section
%named ``Empty the \\{buffer} array'' is being spliced. The second excerpt
%would be found in the \TEX/ part of the section, and the named section
%is being ``cited'', rather than defined or used.
%(Note the `\pb' surrounding the section name in this case.)
위에서 첫 번째 예는 어떤 섹션의 \CEE/ 파트에서 볼 수 있는 것인데, ``배열 \\{buffer}를
초기화하라''라는 이름을 가진 섹션에 사용된 코드가 이 파트에 삽입된다. 두 번째 예는 어떤
섹션의 \TEX/ 파트에서 발견 할 수 있는 것인데, 그 이름의 섹션이 사용이나 정의되는 것이 아니라
``인용''되는 것이다. (이 경우에 섹션 이름을 감싸고 있는 `\pb'를 빠뜨리지 않도록 주의한다.)
%\section Macros.
%The control code \.{@d} followed by
%$$\\{identifier}\.{ }\hbox{\CEE/ text}\qquad\hbox{or by}\qquad
%\\{identifier}\.(\\{par}_1,\ldots,\\{par}_n\.{) }\hbox{\CEE/ text}$$
%(where there is no blank between the
%\\{identifier} and the parentheses in the second case) is
%transformed by \.{CTANGLE} into a preprocessor command, starting with
%\.{\#define}, which is printed at the top of the \CEE/ output file
%as explained earlier.
\section 매크로.
제어 코드, \.{@d} 뒤에는 다음과 같은 것들이 나오는데,
$$\\{\hfontsize{at 9pt}식별자}\.{ }\hbox{\CEE/ 텍스트}\qquad\hbox{또는}\qquad
\\{\hfontsize{at 9pt}식별자}\.(\\{par}_1,\ldots,\\{par}_n\.{) }\hbox{\CEE/ 텍스트}$$
(위의 두 번째의 경우에서 \\{\hfontsize{at 9pt}식별자}와 괄호 사이에는 빈칸이 없다.)
이때, \.{@d}는 \.{CTANGLE}에 의해서 \.{\#define}으로 시작하는 전처리기 명령어로 변환되고,
앞서 설명한 대로, \.{CTANGLE}에 의해서 만들어지는 \CEE/ 파일의 맨 위에 출력된다.
%A `\.{@d}' macro definition can go on for several lines, and the
%newlines don't have to be protected by backslashes, since \.{CTANGLE}
%itself inserts the backslashes. If
%for any reason you need a \.{\#define} command at a specific spot in
%your \CEE/ file, you can treat it as \CEE/ code, instead of as a
%\.{CWEB} macro; but then you do have to protect newlines yourself.
`\.{@d}'로 시작하는 매크로 정의는 여러 줄에 걸쳐서 나올 수가 있는데, \.{CTANGLE}이
알아서 각 줄의 맨 뒤에 백슬래시를 넣어주므로, \CEE/ 언어에서 하듯이 각 줄의 끝을 백슬래시로
마감할 필요가 없다. 만일, 어떠한 이유로 해서 섹션의 중간부에서 `\.{@d}' 매크로 정의를 하지
않고 \CEE/ 파트에서 직접 \.{\#define}을 사용해서 매크로 정의를 할 경우에, 그 정의는
\.{CWEB}의 매크로가 아니라, \CEE/ 코드로 취급되므로, 그 경우는 반드시 백슬래시로 처리를
해주어야 한다.
%\section Strings and constants.
%If you want a string to appear in the \CEE/ file, delimited by pairs of
%\.' or \." marks as usual, you can type it exactly so in the \.{CWEB} file,
%except that the character `\.@' should be typed `\.{@@}' (it becomes a
%control code, the only one that can appear in strings; see below).
%Strings should end on the same line as they begin, unless there's a
%backslash at the end of lines within them.
\section 문자열과 상수.
당신이 \CEE/ 파일 내에서 문자열을 나타내고자 하면, 보통 \.'나 \."를 이용하게 된다. \.{CWEB}
파일에서도 마찬가지로 그렇게 하면 된다. 단, 문자 `\.@'는 `\.{@@}'로 해야만 제대로 볼 수
있다. (사실 \.{@@}는 \.{CWEB}의 명령어인데, 문자열 내에서 사용할 수 있는 유일한 명령어이다.
\.{CWEB}의 명령어에 대해서는 아래에서 자세히 살펴볼 것이다.) 문자열은 반드시 한 줄에 있어야
한다. 그렇지 않으면, 줄이 바뀌는 곳에 백슬래시를 넣어주어야 한다.
%\TEX/ and \CEE/ have different ways to refer to octal and hex constants,
%because \TEX/ is oriented to technical writing while \CEE/ is oriented to
%computer processing. In \TEX/ you
%make a constant octal or hexadecimal by prepending \.' or \.",
%respectively, to it; in \CEE/ the constant should be preceded by \.0
%or \.{0x}. In \.{CWEB} it seems reasonable to let each convention hold
%in its respective realm; so in \CEE/ text you get $40_8$ by typing
%`\.{040}', which \.{CTANGLE} faithfully copies into the \CEE/ file (for
%the compiler's benefit) and which \.{CWEAVE} prints as $\T{\~40}$.
%Similarly, \.{CWEAVE} prints the hexadecimal \CEE/ constant `\.{0x20}'
%as \T{\^20}. The use of italic font for octal digits and typewriter font
%for hexadecimal digits makes the meaning of such constants clearer in
%a document. For consistency, then, you
%should type `\.{|040|}' or `\.{|0x20|}'
%in the \TEX/ part of the section.
\TEX/은 문서를 만들기 위한 언어이고 \CEE/는 프로그래밍 언어이기 때문에 그 둘이 8진수와
16진수 상수를 다루는 방법에는 약간의 차이가 있다. \TEX/은 \.'와 \."를 이용해서 각각 8진수와
16진수를 표시한다. \CEE/는 \.0과 \.{0x}를 이용한다. \.{CWEB}은 \TEX/과 \CEE/를
모두 포함하고 있기 때문에 각자의 영역에서 각자의 표기법을 사용할 수 있도록 해준다. 그래서
\.{CWEB}의 \CEE/ 텍스트에서 $40_8$을 얻기 위해서 `\.{040}'라고 하면, \.{CTANGLE}은
그대로 \CEE/ 파일에 복사를 하고, \.{CWEAVE}은 $\T{\~40}$이라고 출력한다. 비슷한 방법으로,
\.{CWEAVE}는 16진수 \CEE/ 상수 `\.{0x20}'을 $\T{\^200}$이라고 출력한다. \.{CWEAVE}은
8진수는 이탤릭체를 사용하고 16진수는 타자체를 사용해서 나타내기 때문에 문서에서 그 둘을 확실히
구분할 수 있다. 일관성을 위해서, 어떤 섹션의 \TEX/부에서 8진수와 16진수 상수를 나타낼 때는
`\.{|040|}' 또는 `\.{|0x20|}' 와 같이 입력해야 한다.
%\section Control codes.
%A \.{CWEB} {\sl control code\/}
%is a two-character combination of which the first is `\.@'.
%We've already seen the meaning of several control codes; it's time to
%list them more methodically.
\section 제어 코드.
\.{CWEB}의 {\sl\hfontsize{at 9pt}제어 코드}는 첫 번째 문자가 `\.@'인 두 글자의
결합체이다. 이미 앞에서 여러 제어 코드를 살펴봤는데, 이제 \.{CWEB}의 모든 제어 코드를
좀 더 순차적으로 나열해 볼 시간이 됐다.
%In the following list,
%the letters in brackets after a control code indicate in what contexts that
%code is allowed. $L$ indicates that the code is allowed in limbo; $T$
%(for \TEX/), $M$ (for middle), and $C$ (for \CEE/) mean that the code is
%allowed in each of the three parts of a section, at top level---that
%is, outside such constructs as `\pb' and section names. An arrow $\to$
%means that the control code terminates the present part of the \.{CWEB}
%file, and inaugurates the part indicated by the letter following the
%arrow. Thus $[LTMC\to T]$ next to \.{@\ } indicates that this control
%code can occur in limbo, or in any of the three parts of a section, and
%that it starts the (possibly empty) \TEX/ part of the following section.
앞으로 나열하는 리스트에서 제어 코드 다음에 나오는 대괄호 안의 글자는 그 제어 코드가 어떤
환경에서 사용될 수 있는가를 설명한다. $L$은 명령어가 림보에서 사용될 수 있다는 것을 뜻하고,
$T$는 \TEX/ 파트에서, $M$는 중간 파트에서, $C$는 \CEE/ 파트와 같은 최상위 수준에서
사용될 수 있다는 것을 나타낸다. 최상위 수준이라 함은, `\pb'나 섹션 이름과 같은 환경 이외의
것을 말한다. 화살표 $\to$는 제어 코드를 사용함으로 해서 현재 환경을 마감하고 화살표 다음에
나오는 글자가 뜻하는 새로운 환경이 시작된다는 것을 의미한다. 따라서 제어 코드 \.{@\ } 다음에
나오는 $[LTMC\to T]$가 뜻하는 바는 이 제어 코드는 인림보와 섹션의 \TEX/ 파트, 중간 파트,
\CEE/ 파트에서 사용할 수 있고, 이 제어 코드를 사용하면, 새로운 섹션의 \TEX/ 파트가
시작된다는 의미이다.
%Two other abbreviations can occur in these brackets: The letter $r$ stands for
%{\it restricted context}, that is, material inside \CEE/ comments, section
%names, \CEE/ strings and control texts (defined below); the letter
%$c$ stands for {\it inner \CEE/ context}, that is, \CEE/ material
%inside `\pb' (including `\pb's inside comments, but not those
%occurring in other restricted contexts). An asterisk $*$ following
%the brackets means
%that the context from this control code to the matching \.{@>} is
%restricted.
대괄호 안에는 위에서 설명한 것들 외에 두 가지 다른 문자가 나올 수 있는데, 글자 $r$은
{\it\hfontsize{at 9pt}제한된 환경}을 나타내는데, \CEE/ 주석문 안의 환경, 섹션 이름,
\CEE/ 문자열, 아래에서 설명될 명령 텍스트 등이 이 환경에 속한다. 글자 $c$는 내부 \CEE/
환경({\it inner \CEE/ context})을 나타내는데, 이에 속하는 환경은 `\pb'안에 있는 \CEE/
텍스트가 그것이다. 이때 `\pb'는 주석문 안에 사용된 `\pb'는 해당하지만, 다른 제한된 환경에서
나타나는 `\pb'는 제외된다. 대괄호 다음에 나오는 $*$는 현재 설명하는 제어 코드는 \.{@>}와
짝을 이루고 그러한 명령어들로 이루어지는 환경이 제한된 환경이라는 뜻이다.
%Control codes involving letters are case-insensitive; thus \.{@d} and
%\.{@D} are equivalent. Only the lowercase versions are mentioned
%specifically below.
\.{CWEB} 제어 코드를 구성하는 두 문자중 `\.{@}'를 제외한 나머지 한 문자가 기호가 아닌
알파벳인 명령어들은 \.{CWEB}이 대소문자를 구분하지 않기 때문에 \.{@d}와 \.{@D}는 같은
명령어가 된다. 이 글에서는 소문자만 다룰 것이다.
\gdef\@#1[#2] {\penalty-50\yskip\hangindent 2em\noindent\.{@#1\unskip
\spacefactor1000{ }}$[#2]$\quad}
\def\more{\hangindent 2em \hangafter0}
\def\subsec{\penalty-300\medskip\noindent}
%\@{@} [LTMCrc] A double \.@ denotes the single character `\.@'. This is
%the only control code that is legal everywhere.
%Note that you must use this convention if you are giving an internet
%email address in a \.{CWEB} file (e.g., \.{levy@@math.berkeley.edu}).
\@{@} [LTMCrc] 기호 \.@를 두 번 중복해서 사용하면, 문서에는 `\.@' 하나만 나타난다.
이 제어 코드는 모든 환경에서 사용할 수 있는 유일한 것이며, 주로 \.{CWEB} 파일 내에서 이메일
주소를 나타낼 때 사용된다. (예, \.{levy@@math.berkeley.edu}).
%\subsec
%Here are the codes that introduce the \TEX/ part of a section.
\subsec
다음 제어 코드를 사용하면 섹션의 \TEX/ 파트가 시작된다.
%\@\ [LTMC\to T] This denotes the beginning of a new (unstarred)
%section. A tab mark or form feed or
%end-of-line character is equivalent to a space when it follows an \.@
%sign (and in most other cases).
\@\ [LTMC\to T] 이 제어 코드를 사용하면 별표가 아닌 새로운 섹션이 시작된다.
빈칸 대신에 탭, 용지 먹임, 줄의 끝 문자 등이 \.@ 다음에
올 수 있고, 그것들은 빈칸과 같은 효과를 나타낸다.
%\@* [LTMC\to T] This denotes the beginning of a new starred
%section, i.e., a section that begins a new major group. The title of the new
%group should appear after the \.{@*}, followed by a period. As explained
%above, \TEX/ control sequences should be avoided in such titles unless
%they are quite simple. When \.{CWEAVE} and \.{CTANGLE} read a \.{@*}, they
%print an asterisk on the terminal
%followed by the current section number, so that the user
%can see some indication of progress. The very first section should be starred.
\@* [LTMC\to T] 이 제어 코드를 사용하면 새로운 별표 섹션이 시작된다. 별표 섹션은 앞에서
설명했듯이, 여러 섹션으로 이루어지는 그룹을 대표하는 섹션이다. 이때 별표 섹션은 제목을 갖는데, 그
제목은 \.{@*} 다음에 나오고 제목 다음에는 반드시 마침표가 나와야 한다. 될 수 있으면 이 제목에
\TEX/의 명령어들은 사용하지 않아야 한다. 그리고 \.{CWEAVE}와 \.{CTANGLE}은 이 명령어를
만나면, 모니터에 $*$와 현재 처리하고 있는 섹션 번호를 출력해서 사용자가 모니터를 통하여 어떤
섹션이 처리되고 있는지를 알 수 있다. \.{CWEB} 파일에서 가장 먼저 나오는 섹션, 즉 1번 섹션은
반드시 별표 섹션이어야 한다.
%\more You can specify the ``depth'' of a starred section by typing \.* or a
%decimal number after the \.{@*}; this indicates the relative ranking
%of the current group of sections in the program hierarchy. Top-level
%portions of the program, introduced by \.{@**}, get their names typeset
%in boldface type in the table of contents; they are said to have
%depth~$-1$. Otherwise the depth is a nonnegative number, which governs
%the amount of indentation on the contents page. Such indentation helps
%clarify the structure of a long program. The depth is assumed to be 0
%if it is not specified explicitly; when your program is short, you
%might as well leave all depths zero. A starred section always begins
%a new page in the output, unless the depth is greater than~1.
\more
명령어 \.{@*} 다음에 $*$ 혹은 숫자를 써서 별표 섹션의 ``깊이''를 지정할 수 있다. 이 깊이는
전체 프로그램의 구조에 있어서 현재 별표 섹션의 상대적 순위를 나타낸다. 프로그램의 최상위 수준을
\.{@**}로 나타내면 그 섹션의 제목은 목차에 굵은 글꼴로 표시되고 그 섹션의 깊이는 $-1$이 된다.
이를 제외한 다른 섹션들의 깊이는 대개 양수인데, 그 숫자는 목차에서 들여쓰기로 양을 나타낸다.
들여쓰기가 많이 되면 될수록 그 섹션은 하위 섹션이라는 뜻이다. 이렇게 섹션에 깊이를 두어 목차에서
들여쓰기를 하면, 매우 긴 프로그램의 구조를 보다 명확하게 파악할 수 있다. 프로그램이 짧을 때는
모든 깊이를 0으로 하면 된다. 별표 섹션은 언제나 새로운 페이지로 나타나는데, 별표 섹션의 깊이를
일부러 1부다 큰 수로 하면 새로운 페이지가 아닌 현재 진행 중인 페이지에 나타난다.
%\subsec
%The middle part of each section consists of any number of
%macro definitions (beginning with \.{@d}) and format definitions (beginning
%with \.{@f} or \.{@s}), intermixed in any order.
\subsec
각 섹션의 중간 파트에는 여러 개의 매크로 정의, 포멧 정의들이 순서 없이 올 수 있다. 매크로
정의는 \.{@d}로 시작하고 포멧 정의는 \.{@f} 또는 \.{@s}로 시작한다.
%\@{d} [TM\to M] Macro definitions begin with \.{@d}, followed by
%an identifier and optional parameters and \CEE/ text as explained earlier.
\@{d} [TM\to M] 매크로 정의는 \.{@d}로 시작하고 그다음에 식별자가 오고 그다음에 파라미터는
옵션이고 마지막으로 \CEE/ 텍스트가 나온다.
%\@{f} [TM\to M] Format definitions begin with \.{@f}; they cause
%\.{CWEAVE} to treat identifiers in a special way when they appear in
%\CEE/ text. The general form of a format definition is `\.{@f} \|l
%\|r', followed by an optional comment enclosed between
%\.{/*} and \.{*/}, where \|l and \|r
%are identifiers; \.{CWEAVE} will subsequently treat identifier \|l as it
%currently treats \|r. This feature allows a \.{CWEB} programmer to invent
%new reserved words and/or to unreserve some of \CEE/'s reserved
%identifiers. For example, the common words `error' and `line'
%have been given a special meaning in the \CEE/ preprocessor,
%so \.{CWEAVE} is set up to format them specially; if you want a variable
%named \\{error} or \\{line}, you should say
%$$\.{@f error normal}\qquad\qquad\.{@f line normal}$$
%somewhere in your program.
\@{f} [TM\to M] 포멧 정의는 \.{@f}로 시작한다. 이 명령어는 식별자가 \CEE/ 텍스트에서
사용될 때 특별한 모양으로 출력되도록 \.{CWEAVE}를 조종하는 일을 한다. 포멧 정의의 일반적인
형태는 `\.{@f} \|l \|r'이고, 뒤이어 \.{/*} 와 \.{*/}의 주석문이 올 수 있다.
여기서 \|l과 \|r은 식별자이다. \.{CWEAVE}가 위와 같은 명령어를 만나면, \|l을 \|r
다루듯이 한다. 이 명령어는 \.{CWEB} 프로그래머가 자신만의 데이타 타입을 만들었거나 기존의
\CEE/ 예약어들의 그 기능을 멈추게 하는 등 유용하게 사용될 수 있다.
\.{CWEB}은 `\&{int}'처럼 \CEE/의 예약어를 굵은 글꼴로 표시한다. 따라서
프로그래머는 자신이 만들어낸 데이타 타입도 \CEE/의 예약어처럼
취급하라고 \.{CWEAVE}에게 알려줄 때, 바로 이 명령어를 사용할 수
있다. 또 `error'나 `line' 같은 단어는 \CEE/의 전처리기에서 특별한
의미가 있으므로, \.{CWEAVE}는 그 단어들을 \CEE/의 예약어와
같은 방식으로 다룰 텐데, \\{error}나 \\{line}을 변수로 사용하고
싶으면, 아래와 같은 방식으로 \.{CWEAVE}에게 알려줘야 한다.
$$\.{@f error normal}\qquad\qquad\.{@f line normal}$$
%\more If \|r is the special identifier `\\{TeX}', identifier \|l
%will be formatted as a \TEX/ control sequence; for example,
%`\.{@f foo TeX}' in the \.{CWEB} file will cause identifier \\{foo} to
%be output as \.{\\foo} by \.{CWEAVE}. The programmer should define
%\.{\\foo} to have whatever custom format is desired, assuming \TEX/
%math mode. (Each underline
%character is converted to \.{x} when making the \TEX/ control sequence,
%and each dollar sign is converted to~\.X;
%thus \\{foo\_bar} becomes \.{\\fooxbar}. Other characters, including digits,
%are left untranslated, so \TEX/ will consider them as macro parameters,
%not as part of the control sequence itself. For example,
%$$\.{\\def\\x\#1\{x\_\{\#1\}\} @f x1 TeX @f x2 TeX}$$
%will format \.{x1} and \.{x2} not as \\{x1} and \\{x2} but as $x_1$ and $x_2$.)
\more 만약에 \|r이 특별한 식별자 `\\{TeX}'이라면, 식별자 \|l%