1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Spacing Macros Horizontal}
15
16\unprotect
17
18\registerctxluafile{spachor}{}
19
20\let \parfillrightskip \parfillskip
21\newskip \parfillleftskip
22\newconstant\parfillleftmode
23
24\let\v_spac_indentation_current\empty
25
26\newdimen \d_spac_indentation_par
27\parindent\d_spac_indentation_par
28
29\newconditional\c_spac_indentation_indent_first \settrue\c_spac_indentation_indent_first
30\newconstant \c_spac_indentation_toggle_state
31
32
33
34
35\unexpanded\def\presetindentation
36 {\doifoutervmode{\ifconditional\c_spac_indentation_indent_first\else\spac_indentation_variant_no\fi}}
37
38\unexpanded\def\setupindenting
39 {\doifelsenextoptionalcs\spac_indentation_setup_options\spac_indentation_setup_size}
40
41
42
43
44\unexpanded\def\spac_indentation_setup_size
45 {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}
46 \ifzeropt\parindent\else
47 \parindent\d_spac_indentation_par\relax
48 \fi}
49
50\let\synchronizeindenting\spac_indentation_setup_size
51
52\let\m_spac_indentation_options\empty
53
54\def\spac_indentation_setup_options[#1]
55 {\edef\m_spac_indentation_options{#1}
56 \ifx\m_spac_indentation_options\empty \else
57 \spac_indentation_setup_indeed
58 \fi}
59
60\def\spac_indentation_setup_indeed
61 {
62
63
64 \processcommacommand[\m_spac_indentation_options]\spac_indentation_apply_step_one
65 \processcommacommand[\m_spac_indentation_options]\spac_indentation_apply_step_two
66 \ifzeropt\parindent\else
67 \doifemptytoks\everypar\spac_indentation_set_everypar
68 \fi
69 \ifconditional\c_spac_indentation_indent_first
70 \spac_indentation_variant_yes
71 \else
72 \spac_indentation_variant_no
73 \fi
74 \spac_indentation_check_toggle}
75
76\def\spac_indentation_set_everypar
77 {\everypar{\checkindentation}}
78
79\unexpanded\def\useindentingparameter#1
80 {\edef\m_spac_indentation_options{#1\c!indenting}
81 \ifx\m_spac_indentation_options\empty \else
82 \spac_indentation_setup_indeed
83 \fi}
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\installcorenamespace {indentingpreset}
109
110\unexpanded\def\defineindenting
111 {\dodoubleargument\spac_indenting_define}
112
113\def\spac_indenting_define[#1][#2]
114 {\setevalue{\??indentingpreset#1}{#2}}
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\def\spac_indentation_apply_step_one_nested
143 {\expandafter\processcommacommand\expandafter[\lastnamedcs]\spac_indentation_apply_step_one}
144
145\def\spac_indentation_apply_step_two_nested
146 {\expandafter\processcommacommand\expandafter[\lastnamedcs]\spac_indentation_apply_step_two}
147
148\def\spac_indentation_apply_step_one#1
149 {\ifcsname\??indentingpreset#1\endcsname
150 \spac_indentation_apply_step_one_nested
151 \else\ifcsname\??indentingmethod#1\endcsname
152
153 \else
154 \edef\v_spac_indentation_current{#1}
155 \let\normalindentation\v_spac_indentation_current
156 \spac_indentation_setup_size
157 \fi\fi}
158
159\def\spac_indentation_apply_step_two#1
160 {\ifcsname\??indentingpreset#1\endcsname
161 \spac_indentation_apply_step_two_nested
162 \else\ifcsname\??indentingmethod#1\endcsname
163 \lastnamedcs
164 \else
165
166 \fi\fi}
167
168\unexpanded\def\indenting
169 {\doifelsenextoptionalcs\spac_indentation_setup_options\relax}
170
171
172
173\installcorenamespace{indentingmethod}
174
175\unexpanded\def\installindentingmethod#1#2
176 {\setvalue{\??indentingmethod#1}{#2}}
177
178\installindentingmethod \v!no {\parindent\zeropoint}
179\installindentingmethod \v!not {\parindent\zeropoint}
180
181\installindentingmethod \v!first {\settrue\c_spac_indentation_indent_first}
182\installindentingmethod \v!next {\setfalse\c_spac_indentation_indent_first}
183
184\installindentingmethod \v!yes {\parindent\d_spac_indentation_par\relax}
185\installindentingmethod \v!always{\parindent\d_spac_indentation_par\relax}
186
187\installindentingmethod \v!never {\parindent\zeropoint\relax
188 \c_spac_indentation_toggle_state\zerocount}
189
190\installindentingmethod \v!odd {\c_spac_indentation_toggle_state\plusone}
191\installindentingmethod \v!even {\c_spac_indentation_toggle_state\plustwo}
192
193\installindentingmethod \v!normal{\ifx\normalindentation\empty\else
194 \let\v_spac_indentation_current\normalindentation
195 \spac_indentation_setup_size
196 \fi}
197
198\installindentingmethod \v!reset {\settrue\c_spac_indentation_indent_first
199 \parindent\zeropoint
200 \c_spac_indentation_toggle_state\zerocount}
201
202\installindentingmethod \v!toggle{\parindent\ifzeropt\parindent
203 \d_spac_indentation_par
204 \else
205 \zeropoint
206 \fi\relax}
207
208\unexpanded\def\noindenting{\indenting[\v!no, \v!next ]}
209\unexpanded\def\doindenting{\indenting[\v!yes,\v!first]}
210
211
212
213
214
215\let\checkindentation\relax
216
217\installmacrostack\checkindentation
218
219
220\def\spac_indentation_remove
221 {\ifzeropt\parindent \else
222 \begingroup
223 \setbox\scratchbox\lastbox
224 \endgroup
225 \fi}
226
227\def\spac_indentation_kill_indeed
228 {
229 \spac_indentation_remove}
230
231\def\spac_indentation_do_toggle_indeed
232 {
233 \glet\checkindentation\spac_indentation_no_toggle_indeed
234 \spac_indentation_remove}
235
236\def\spac_indentation_no_toggle_indeed
237 {
238 \glet\checkindentation\spac_indentation_do_toggle_indeed}
239
240\def\spac_indentation_do_indeed
241 {}
242
243\def\spac_indentation_do_toggle
244 {\glet\checkindentation\spac_indentation_do_toggle_indeed}
245
246\def\spac_indentation_no_toggle
247 {\glet\checkindentation\spac_indentation_no_toggle_indeed}
248
249\def\spac_indentation_check_toggle
250 {\ifcase\c_spac_indentation_toggle_state
251
252 \or
253 \spac_indentation_no_toggle
254 \or
255 \spac_indentation_do_toggle
256 \fi}
257
258\def\spac_indentation_variant_yes
259 {\glet\checkindentation\spac_indentation_do_indeed}
260
261\def\spac_indentation_no_next_check
262 {\spac_indentation_remove
263 \glet\checkindentation\spac_indentation_do_indeed}
264
265\def\spac_indentation_variant_no
266 {\ifinpagebody \else
267
268 \glet\checkindentation\spac_indentation_no_next_check
269 \fi}
270
271\def\nonoindentation
272 {\ifinpagebody \else
273
274 \glet\checkindentation\spac_indentation_do_indeed
275 \fi}
276
277\def\spac_indentation_variant_force
278 {\ifvmode \ifzeropt\parindent \else
279
280
281
282 \noindent\hskip\parindent
283 \fi \fi}
284
285\appendtoks
286 \push_macro_checkindentation
287 \push_macro_ifindentation
288\to \everypushsomestate
289
290\appendtoks
291 \pop_macro_ifindentation
292 \pop_macro_checkindentation
293\to \everypopsomestate
294
295
296
297\let\indentation \spac_indentation_variant_force
298\let\noindentation\spac_indentation_variant_no
299\let\doindentation\spac_indentation_variant_yes
300
301\def\dontrechecknextindentation
302 {\glet\dorechecknextindentation\relax}
303
304\let\dorechecknextindentation\relax
305
306\unexpanded\def\spac_indentation_check_next_indentation
307 {\glet\dorechecknextindentation\relax
308 \doifelsenextchar\par\donothing\spac_indentation_variant_no}
309
310\def\spac_indentation_variant_auto
311 {\glet\dorechecknextindentation\spac_indentation_check_next_indentation}
312
313
314
315
316\installcorenamespace{indentnext}
317
318\unexpanded\def\checknextindentation[#1]
319 {\begincsname\??indentnext#1\endcsname}
320
321\unexpanded\def\useindentnextparameter#1
322 {\edef\p_indentnext{#1\c!indentnext}
323 \ifx\p_indentnext\empty\else
324 \begincsname\??indentnext\p_indentnext\endcsname
325 \fi}
326
327\letvalue{\??indentnext }\donothing
328\letvalue{\??indentnext\v!yes }\spac_indentation_variant_yes
329\letvalue{\??indentnext\v!no }\spac_indentation_variant_no
330\letvalue{\??indentnext\v!auto}\spac_indentation_variant_auto
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\unexpanded\def\forgetparindent
372 {\settrue\c_spac_indentation_indent_first
373 \d_spac_indentation_par\zeropoint
374 \parindent\zeropoint
375 \let\v_spac_indentation_current\v!none}
376
377\appendtoks
378 \forgetparindent
379\to \everyforgetall
380
381\unexpanded\def\forgethorizontalstretch
382 {\emergencystretch\zeropoint}
383
384\appendtoks
385 \forgethorizontalstretch
386\to \everyforgetall
387
388
389
390\unexpanded\def\softbreak
391 {\relax\ifhmode\hskip\parfillskip\break\fi}
392
393
394
395
396
397
398
399
400
401
402\installcorenamespace{spacecodemethod}
403
404\sfcode\)=\zerocount
405\sfcode\'=\zerocount
406\sfcode\]=\zerocount
407
408\def\spac_spacecodes_set_fixed#1
409 {\sfcode\.#1\relax \sfcode\,#1\relax
410 \sfcode\?#1\relax \sfcode\!#1\relax
411 \sfcode\:#1\relax \sfcode\;#1\relax}
412
413\def\spac_spacecodes_set_stretch
414 {\sfcode\.3000 \sfcode\,1250
415 \sfcode\?3000 \sfcode\!3000
416 \sfcode\:2000 \sfcode\;1500 }
417
418\unexpanded\def\frenchspacing {\spac_spacecodes_set_fixed\plusthousand}
419\unexpanded\def\newfrenchspacing{\spac_spacecodes_set_fixed{1050}}
420\unexpanded\def\nonfrenchspacing{\spac_spacecodes_set_stretch}
421
422\unexpanded\def\installspacingmethod#1#2{\setvalue{\??spacecodemethod#1}{#2}}
423
424\installspacingmethod \empty {}
425\installspacingmethod \v!fixed {\frenchspacing }
426\installspacingmethod \v!packed {\newfrenchspacing}
427\installspacingmethod \v!broad {\nonfrenchspacing}
428
429\unexpanded\def\setupspacing
430 {\doifelsenextoptionalcs\spac_spacecodes_setup_yes\spac_spacecodes_setup_nop}
431
432\def\spac_spacecodes_setup_yes[#1]
433 {\begincsname\??spacecodemethod#1\endcsname
434 \updateraggedskips}
435
436\def\spac_spacecodes_setup_nop
437 {\updateraggedskips}
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458\let\synchronizespacecodes\spac_spacecodes_setup_nop
459
460
461
462
463
464
465
466
467
468\let\normalspaceprimitive=\
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487\unexpanded\def\specialspaceprimitive
488 {
489 \ifhmode
490 \spacefactor\plusthousand
491 \else
492 \dontleavehmode
493 \fi
494 \normalspaceprimitive}
495
496\unexpanded\def\normalnotobeyedspace
497 {\mathortext\normalspaceprimitive\specialspaceprimitive}
498
499\let\ =\normalnotobeyedspace
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\normalspaceprimitive}
523
524\letcatcodecommand \ctxcatcodes \tildeasciicode \nonbreakablespace
525
526 \def\space { }
527\unexpanded\def\removelastspace{\ifhmode\unskip\fi}
528\unexpanded\def\nospace {\removelastspace\ignorespaces}
529
530\ifdefined\nospaces
531 \unexpanded\def\nospacing{\normalnospaces\plusone}
532 \unexpanded\def\dospacing{\normalnospaces\zerocount}
533\else
534 \unexpanded\def\nospacing{\spaceskip\scaledpoint \xspaceskip\zeropoint}
535 \unexpanded\def\dospacing{\spaceskip\currentspaceskip\xspaceskip\zeropoint}
536\fi
537
538\ifdefined\softhyphen \else
539 \let\softhyphen\explicitdiscretionary
540\fi
541
542\cldcontext{"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}"}
543
544
545
546
547
548
549
550
551\unexpanded\def\fixedspace
552 {\setbox\scratchbox\hpack{\mathortext{0}{0}}
553 \hskip\wd\scratchbox\relax}
554
555\unexpanded\def\fixedspaces
556 {\letcatcodecommand \ctxcatcodes \tildeasciicode\fixedspace
557 \let\fixedspace}
558
559\appendtoks
560 \let\space
561 \let\ \space
562\to \everysimplifycommands
563
564\newsignal\s_spac_keep_unwanted_space
565
566\unexpanded\def\keepunwantedspaces
567 {\ifhmode
568 \ifdim\lastskip=\s_spac_keep_unwanted_space\else
569 \hskip\s_spac_keep_unwanted_space\relax
570 \fi
571 \fi}
572
573\unexpanded\def\removeunwantedspaces
574 {\ifhmode
575 \expandafter \spac_helpers_remove_unwantedspace
576 \fi}
577
578\def\spac_helpers_remove_unwantedspace
579 {\ifnum\lastnodetype=\gluenodecode
580 \ifdim\lastskip=\s_spac_keep_unwanted_space\relax
581 \unskip
582 \else
583 \unskip
584 \doubleexpandafter\spac_helpers_remove_unwantedspace
585 \fi
586 \fi}
587
588\unexpanded\def\onlynonbreakablespace
589 {\ifdim\lastskip=\interwordspace
590 \unskip
591 \nonbreakablespace
592 \fi
593 \ignorespaces}
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\ifdefined\thinspace \else
620
621 \unexpanded\def\thinspace {\kern .16667\emwidth}
622 \unexpanded\def\negthinspace{\kern.16667\emwidth}
623 \unexpanded\def\enspace {\kern .5\emwidth}
624 \unexpanded\def\emspace {\kern \emwidth}
625
626\fi
627
628\ifdefined\quad \else
629
630 \unexpanded\def\enskip{\hskip.5\emwidth\relax}
631 \unexpanded\def\quad {\hskip \emwidth\relax}
632 \unexpanded\def\qquad {\hskip 2\emwidth\relax}
633
634\fi
635
636\unexpanded\def\negenspace{\kern.5\emwidth}
637\unexpanded\def\negemspace{\kern \emwidth}
638
639\unexpanded\def\charspace{ }
640
641\unexpanded\def\quads
642 {\dosingleempty\spac_quads}
643
644\def\spac_quads[#1]
645 {\zwj\dorecurse{\iffirstargument#1\else\plusthree\fi}{\hskip\emwidth\zwj}}
646
647
648
649\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize}
650
651
652
653\unexpanded\def\hfilll {\hskip\zeropoint\s!plus1\s!filll\relax}
654\unexpanded\def\vfilll {\vskip\zeropoint\s!plus1\s!filll\relax}
655
656
657\unexpanded\def\hfillneg {\hskip\zeropoint\s!plus1\s!fill\relax}
658\unexpanded\def\hfilllneg{\hskip\zeropoint\s!plus1\s!filll\relax}
659
660\unexpanded\def\vfillneg {\vskip\zeropoint\s!plus1\s!fill\relax}
661\unexpanded\def\vfilllneg{\vskip\zeropoint\s!plus1\s!filll\relax}
662
663\unexpanded\def\tfskip {\begingroup\tf\hskip\emwidth\endgroup}
664\unexpanded\def\dotfskip#1{\begingroup\tf\hskip #1\endgroup}
665
666
667
668\installcorenamespace{narrower}
669\installcorenamespace{narrowermethod}
670
671\newskip\s_spac_narrower_left
672\newskip\s_spac_narrower_right
673\newskip\s_spac_narrower_middle
674
675\installcommandhandler \??narrower {narrower} \??narrower
676
677\setupnarrower
678 [\c!before=\endgraf,
679 \c!after=\endgraf,
680 \c!left=1.5\emwidth,
681 \c!right=1.5\emwidth,
682 \c!middle=1.5\emwidth,
683 \c!default=\v!middle]
684
685\appendtoks
686 \setuevalue{\e!start\currentnarrower}{\spac_narrower_start{\currentnarrower}}
687 \setuevalue{\e!stop \currentnarrower}{\spac_narrower_stop}
688\to \everydefinenarrower
689
690\unexpanded\def\installnarrowermethod#1#2
691 {\setvalue{\??narrowermethod#1}{#2}}
692
693\unexpanded\def\spac_narrower_method_analyze#1
694 {\ifcsname\??narrowermethod#1\endcsname
695 \lastnamedcs
696 \else
697 \global\advance\s_spac_narrower_middle#1\relax
698 \fi}
699
700\def\spac_narrower_initialize[#1]
701 {\dorepeatwithcommand[#1]\spac_narrower_method_analyze}
702
703\installnarrowermethod \v!left {\global\advance\s_spac_narrower_left \narrowerparameter\c!left \relax}
704\installnarrowermethod \v!middle {\global\advance\s_spac_narrower_middle \narrowerparameter\c!middle\relax}
705\installnarrowermethod \v!right {\global\advance\s_spac_narrower_right \narrowerparameter\c!right \relax}
706\installnarrowermethod{\v!left }{\global\advance\s_spac_narrower_left \narrowerparameter\c!left \relax}
707\installnarrowermethod{\v!middle}{\global\advance\s_spac_narrower_middle\narrowerparameter\c!middle\relax}
708\installnarrowermethod{\v!right }{\global\advance\s_spac_narrower_right \narrowerparameter\c!right \relax}
709\installnarrowermethod \v!reset {\global \s_spac_narrower_left \zeropoint
710 \global \s_spac_narrower_middle \zeropoint
711 \global \s_spac_narrower_right \zeropoint\relax}
712\installnarrowermethod \v!none {}
713\installnarrowermethod \v!reverse {}
714
715\unexpanded\def\spac_narrower_start#1
716 {\begingroup
717 \edef\currentnarrower{#1}
718 \dosingleempty\spac_narrower_start_indeed}
719
720\unexpanded\def\spac_narrower_start_indeed[#1]
721 {\iffirstargument
722 \spac_narrower_start_apply{#1}
723 \else
724 \spac_narrower_start_apply{\narrowerparameter\v!default}
725 \fi}
726
727\newskip\s_spac_narrower_left_last
728\newskip\s_spac_narrower_right_last
729\newconditional\s_spac_narrower_last_swap
730
731\def\spac_narrower_start_apply#1
732 {\narrowerparameter\c!before
733 \global\s_spac_narrower_left \zeropoint
734 \global\s_spac_narrower_right \zeropoint
735 \global\s_spac_narrower_middle\zeropoint
736 \edef\askednarrower{#1}
737 \ifx\askednarrower\v!reverse
738 \ifconditional\s_spac_narrower_last_swap
739 \leftskip \s_spac_narrower_right_last
740 \rightskip\s_spac_narrower_left_last
741 \setfalse\s_spac_narrower_last_swap
742 \else
743 \leftskip \s_spac_narrower_left_last
744 \rightskip\s_spac_narrower_right_last
745 \settrue\s_spac_narrower_last_swap
746 \fi
747 \else
748 \normalexpanded{\processcommalistwithparameters[\askednarrower]}\spac_narrower_initialize
749 \advance\leftskip \dimexpr\s_spac_narrower_left \s_spac_narrower_middle\relax
750 \advance\rightskip\dimexpr\s_spac_narrower_right\s_spac_narrower_middle\relax
751 \fi
752 \seteffectivehsize}
753
754\unexpanded\def\spac_narrower_stop
755 {\narrowerparameter\c!after
756 \normalexpanded{
757 \endgroup
758 \s_spac_narrower_left_last \the\leftskip \relax
759 \s_spac_narrower_right_last\the\rightskip\relax
760 \ifconditional\s_spac_narrower_last_swap
761 \setfalse\s_spac_narrower_last_swap
762 \else
763 \settrue\s_spac_narrower_last_swap
764 \fi
765 }}
766
767\unexpanded\def\startnarrower
768 {\dosingleempty\spac_narrower_start_basic}
769
770\unexpanded\def\spac_narrower_start_basic[#1]
771 {\begingroup
772 \let\currentnarrower\empty
773 \iffirstargument
774 \spac_narrower_start_apply{#1}
775 \else
776 \spac_narrower_start_apply{\narrowerparameter\v!default}
777 \fi}
778
779\let\stopnarrower\spac_narrower_stop
780
781\unexpanded\def\startnarrow
782 {\begingroup
783 \dodoubleempty\spac_narrower_start_named}
784
785
786
787
788
789
790
791
792
793\def\spac_narrower_start_named
794 {\ifsecondargument
795 \expandafter\spac_narrower_start_named_two
796 \else
797 \expandafter\spac_narrower_start_named_one
798 \fi}
799
800\def\spac_narrower_start_named_one[#1]
801 {\doifelseassignment{#1}\spac_narrower_start_named_one_yes\spac_narrower_start_named_one_nop[#1]}
802
803\def\spac_narrower_start_named_one_yes[#1][#2]
804 {\setupcurrentnarrower[#1]
805 \spac_narrower_start_apply{\narrowerparameter\v!default}}
806
807\def\spac_narrower_start_named_one_nop[#1][#2]
808 {\edef\currentnarrower{#1}
809 \spac_narrower_start_apply{\narrowerparameter\v!default}}
810
811\def\spac_narrower_start_named_two[#1]
812 {\doifelseassignment{#1}\spac_narrower_start_named_settings_how\spac_narrower_start_named_tag_unknown[#1]}
813
814\def\spac_narrower_start_named_settings_how[#1][#2]
815 {\setupcurrentnarrower[#1]
816 \spac_narrower_start_apply{#2}}
817
818\def\spac_narrower_start_named_tag_unknown[#1][#2]
819 {\doifelseassignment{#2}\spac_narrower_start_named_tag_settings\spac_narrower_start_named_tag_how[#1][#2]}
820
821\def\spac_narrower_start_named_tag_settings[#1][#2]
822 {\edef\currentnarrower{#1}
823 \setupcurrentnarrower[#2]
824 \spac_narrower_start_apply{\narrowerparameter\v!default}}
825
826\def\spac_narrower_start_named_tag_how[#1][#2]
827 {\edef\currentnarrower{#1}
828 \spac_narrower_start_apply{#2}}
829
830\let\stopnarrow\spac_narrower_stop
831
832\newdimen\d_spac_effective_hsize \def\effectivehsize {\hsize}
833\newdimen\d_spac_effective_leftskip \def\effectiveleftskip {\dimexpr\leftskip \relax}
834\newdimen\d_spac_effective_rightskip \def\effectiverightskip{\dimexpr\rightskip\relax}
835
836\unexpanded\def\seteffectivehsize
837 {\setlocalhsize
838 \d_spac_effective_hsize \localhsize
839 \d_spac_effective_leftskip 1\leftskip
840 \d_spac_effective_rightskip1\rightskip
841 \let\effectivehsize \d_spac_effective_hsize
842 \let\effectiveleftskip \d_spac_effective_leftskip
843 \let\effectiverightskip\d_spac_effective_rightskip}
844
845\installcorenamespace{skipadaptionleft}
846\installcorenamespace{skipadaptionright}
847
848\newskip\leftskipadaption
849\newskip\rightskipadaption
850
851\setvalue{\??skipadaptionleft \v!yes }{\ifzeropt\d_spac_indentation_par\narrowerparameter\c!left\else\d_spac_indentation_par\fi}
852\letvalue{\??skipadaptionleft \v!no }\zeropoint
853\letvalue{\??skipadaptionleft \empty }\zeropoint
854\setvalue{\??skipadaptionright\v!yes }{\narrowerparameter\c!right}
855\letvalue{\??skipadaptionright\v!no }\zeropoint
856\letvalue{\??skipadaptionright\empty }\zeropoint
857
858
859
860
861\letcsnamecsname\csname\??skipadaptionleft \v!standard\endcsname\csname\??skipadaptionleft \v!yes\endcsname
862\letcsnamecsname\csname\??skipadaptionright\v!standard\endcsname\csname\??skipadaptionright\v!yes\endcsname
863
864
865
866
867\unexpanded\def\dosetleftskipadaption #1{\leftskipadaption \ifcsname\??skipadaptionleft #1\endcsname\lastnamedcs\else#1\fi\relax}
868\unexpanded\def\dosetrightskipadaption#1{\rightskipadaption\ifcsname\??skipadaptionright#1\endcsname\lastnamedcs\else#1\fi\relax}
869
870\unexpanded\def\doadaptleftskip #1{\normalexpanded{\dosetleftskipadaption {#1}}\advance\leftskip \leftskipadaption }
871\unexpanded\def\doadaptrightskip#1{\normalexpanded{\dosetrightskipadaption{#1}}\advance\rightskip\rightskipadaption}
872
873\unexpanded\def\forgetbothskips
874 {\leftskip\zeropoint
875 \rightskip\zeropoint
876 \relax}
877
878\appendtoks
879 \forgetbothskips
880\to \everyforgetall
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895\installcorenamespace{tolerancemethods}
896
897\unexpanded\def\installtolerancemethod#1#2#3
898 {\setvalue{\??tolerancemethods#1:#2}{#3}}
899
900\installtolerancemethod \v!vertical \v!verystrict {\let\bottomtolerance\empty}
901\installtolerancemethod \v!vertical \v!strict {\def\bottomtolerance{.050}}
902\installtolerancemethod \v!vertical \v!tolerant {\def\bottomtolerance{.075}}
903\installtolerancemethod \v!vertical \v!verytolerant {\def\bottomtolerance{.100}}
904
905\installtolerancemethod \v!horizontal \v!stretch {\emergencystretch\bodyfontsize}
906\installtolerancemethod \v!horizontal \v!space {\spaceskip.5em\s!plus.25em\s!minus.25em\relax}
907\installtolerancemethod \v!horizontal \v!verystrict {\tolerance\plustwohundred}
908\installtolerancemethod \v!horizontal \v!strict {\tolerance1500 }
909\installtolerancemethod \v!horizontal \v!tolerant {\tolerance3000 }
910\installtolerancemethod \v!horizontal \v!verytolerant {\tolerance4500 }
911
912\appendetoks
913 \pretolerance\plushundred
914 \tolerance \plustwohundred
915\to\everyforgetall
916
917\def\spac_tolerances_step_vertical #1{\csname\??tolerancemethods\v!vertical :#1\endcsname}
918\def\spac_tolerances_step_horizontal#1{\csname\??tolerancemethods\v!horizontal:#1\endcsname}
919
920\unexpanded\def\setuptolerance
921 {\dosingleargument\spac_tolerances_setup}
922
923\def\spac_tolerances_setup[#1]
924 {\doifelseinset\v!vertical{#1}
925 {\processcommacommand[#1]\spac_tolerances_step_vertical }
926 {\processcommacommand[#1]\spac_tolerances_step_horizontal}}
927
928
929
930
931
932
933\newbox\b_spac_indentations_a
934\newbox\b_spac_indentations_b
935
936\unexpanded\def\pushindentation
937 {\begingroup
938 \ifhmode
939 \unskip
940 \setbox\b_spac_indentations_a\lastbox
941 \unskip
942 \setbox\b_spac_indentations_b\lastbox
943 \unskip
944 \else
945 \dontleavehmode
946 \unskip
947 \setbox\b_spac_indentations_a\lastbox
948 \setbox\b_spac_indentations_b\emptybox
949 \fi}
950
951\unexpanded\def\popindentation
952 {\box\b_spac_indentations_b
953 \box\b_spac_indentations_a
954 \endgroup}
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020\unexpanded\def\justonespace{\removeunwantedspaces\space}
1021
1022
1023
1024\installcorenamespace{hspace}
1025
1026\unexpanded\def\ignorecrlf
1027 {\let\crlf\justonespace\let\\\crlf}
1028
1029\unexpanded\def\definehspace
1030 {\dotripleempty\spac_hspaces_define}
1031
1032\def\spac_hspaces_define[#1][#2][#3]
1033 {\ifthirdargument
1034 \setvalue{\??hspace#1:#2}{#3}
1035 \else
1036 \setvalue{\??hspace:#1}{#2}
1037 \fi}
1038
1039\unexpanded\def\hspace
1040 {\dodoubleempty\spac_hspaces_insert}
1041
1042\def\spac_hspaces_insert[#1][#2]
1043 {\ifhmode
1044 \removeunwantedspaces
1045 \hskip
1046 \ifsecondargument
1047 \hspaceamount{#1}{#2}
1048 \else\iffirstargument
1049 \hspaceamount\empty{#1}
1050 \else
1051 \hspaceamount\empty\s!default
1052 \fi\fi
1053 \expandafter\ignorespaces
1054 \fi}
1055
1056\def\hspaceamount#1#2
1057 {\dimexpr\ifcsname\??hspace#1:#2\endcsname\lastnamedcs\else\zeropoint\fi\relax}
1058
1059\def\directhspaceamount#1
1060 {\dimexpr\ifcsname\??hspace :#1\endcsname\lastnamedcs\else\zeropoint\fi\relax}
1061
1062
1063
1064\definehspace [\v!small] [.25\emspaceamount]
1065\definehspace [\v!medium] [.5\emspaceamount]
1066\definehspace [\v!big] [1\emspaceamount]
1067\definehspace [\v!normal] [1\spaceamount]
1068\definehspace [\v!default] [\spaceamount]
1069\definehspace [\v!none] [\zeropoint]
1070
1071
1072
1073
1074\unexpanded\def\textormathspace #1#2#3{\ifmmode\mskip#1#2\else\kern #1\hspaceamount\empty{#3}\fi\relax}
1075\unexpanded\def\textormathspacecommand #1#2#3{\ifmmode\mskip#1#2\else#3\fi\relax}
1076\unexpanded\def\breakabletextormathspace#1#2#3{\ifmmode\mskip#1#2\else\hskip#1\hspaceamount\empty{#3}\fi\relax}
1077
1078\newmuskip\hairmuskip \hairmuskip=.15mu
1079
1080\unexpanded\def\hairspace {\textormathspace\hairmuskip{.5}}
1081\unexpanded\def\thinspace {\textormathspace\thinmuskip 1}
1082
1083\unexpanded\def\thickspace {\textormathspace\thickmuskip3}
1084\unexpanded\def\neghairspace {\textormathspace\thinmuskip{.5}}
1085\unexpanded\def\negthinspace {\textormathspace\thinmuskip 1}
1086\unexpanded\def\negmedspace {\textormathspace\medmuskip 2}
1087\unexpanded\def\negthickspace{\textormathspace\thickmuskip3}
1088
1089\unexpanded\edef\medspace {\textormathspacecommand\medmuskip{\Uchar"205F}}
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108\definehspace[.5][.1250\emwidth]
1109\definehspace[1] [.1667\emwidth]
1110\definehspace[2] [.2222\emwidth]
1111\definehspace[3] [.2777\emwidth]
1112
1113\let \, \thinspace
1114\let \: \medspace
1115\let \; \thickspace
1116\let \! \negthinspace
1117
1118
1119
1120
1121
1122
1123\def\flexiblespaceamount#1#2#3
1124 {#1\interwordspace
1125 \s!plus#2\interwordstretch
1126 \s!minus#3\interwordshrink}
1127
1128\def\fixedspaceamount#1
1129 {#1\interwordspace}
1130
1131
1132
1133
1134
1135
1136
1137\installcorenamespace{spacemethods}
1138
1139\unexpanded\def\installspacemethod#1#2
1140 {\setvalue{\??spacemethods#1}{#2}}
1141
1142\def\activatespacehandler#1
1143 {\csname\??spacemethods\ifcsname\??spacemethods#1\endcsname#1\else\v!off\fi\endcsname}
1144
1145\unexpanded\def\spac_spaces_checked_control{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}
1146\unexpanded\def\spac_spaces_checked_normal {\mathortext\normalspace{\dontleavehmode\normalspace}}
1147\unexpanded\def\spac_spaces_checked_fixed {\mathortext\normalspace{\dontleavehmode\fixedspace}}
1148
1149
1150
1151\installspacemethod \v!on
1152 {\obeyspaces
1153 \let\obeyedspace\spac_spaces_checked_control
1154 \let\ =\obeyedspace}
1155
1156\installspacemethod \v!yes
1157 {\obeyspaces
1158 \let\obeyedspace\spac_spaces_checked_normal
1159 \let\ =\obeyedspace}
1160
1161\installspacemethod \v!off
1162 {\normalspaces
1163 \let\obeyedspace\normalspace
1164 \let\ =\normalspaceprimitive}
1165
1166\installspacemethod \v!fixed
1167 {\obeyspaces
1168 \let\obeyedspace\spac_spaces_checked_fixed
1169 \let\ =\obeyedspace}
1170
1171\appendtoks
1172 \normalspaces
1173\to \everybeforeoutput
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186\unexpanded\def\autoinsertnextspace
1187 {\futurelet\nexttoken\spac_spaces_auto_insert_next}
1188
1189\def\spac_spaces_auto_insert_next
1190 {\clf_autonextspace{\normalmeaning\nexttoken}}
1191
1192
1193
1194\unexpanded\def\outdented#1
1195 {\hskip\hangindent#1\relax}
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207\unexpanded\def\spac_glues_text_or_math#1#2
1208 {\begingroup
1209 \ifmmode
1210 \mskip#1
1211 \else
1212 \scratchdimen#1\hspaceamount\empty{#2}
1213 \scratchskip\scratchdimen\s!plus.5\scratchdimen\s!minus.3\scratchdimen
1214 \hskip\scratchskip
1215 \fi
1216 \endgroup}
1217
1218\unexpanded\def\thinglue {\spac_glues_text_or_math\thinmuskip \v!small}
1219\unexpanded\def\medglue {\spac_glues_text_or_math\medmuskip \v!medium}
1220\unexpanded\def\thickglue{\spac_glues_text_or_math\thickmuskip\v!big}
1221
1222
1223
1224\unexpanded\def\widened
1225 {\doifelsenextoptionalcs\spac_widened_yes\spac_widened_nop}
1226
1227\def\spac_widened_yes[#1]#2{\hbox \s!spread #1{\hss#2\hss}}
1228\def\spac_widened_nop #1{\hbox \s!spread \emwidth{\hss#1\hss}}
1229
1230\definecomplexorsimple\widened
1231
1232
1233
1234\unexpanded\def\ignoredlinebreak{\unskip\space\ignorespaces}
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253\newsignal\s_spac_ignore_spaces
1254\newcount \c_spac_ignore_spaces
1255
1256\unexpanded\def\startignorespaces
1257 {\advance\c_spac_ignore_spaces\plusone
1258 \ifcase\c_spac_ignore_spaces\or \ifhmode
1259 \hskip\s_spac_ignore_spaces
1260 \fi \fi
1261 \ignorespaces}
1262
1263\unexpanded\def\stopignorespaces
1264 {\ifcase\c_spac_ignore_spaces \or
1265 \ifhmode
1266 \doloop\spac_ignore_spaces_body
1267 \fi
1268 \fi
1269 \advance\c_spac_ignore_spaces\minusone}
1270
1271\def\spac_ignore_spaces_body
1272 {\ifzeropt\lastskip
1273 \exitloop
1274 \else\ifdim\lastskip=\s_spac_ignore_spaces
1275 \unskip
1276 \exitloop
1277 \else
1278 \unskip
1279 \fi\fi}
1280
1281
1282
1283
1284\def\obeyfollowingtoken{{}}
1285
1286
1287
1288\unexpanded\def\interwordspacebefore{\wordboundary\zwnj\hskip\interwordspace\relax}
1289\unexpanded\def\interwordspaceafter {\hskip\interwordspace\relax\zwnj\wordboundary}
1290
1291\unexpanded\def\interwordspacesbefore#1{\dofastloopcs{#1}\interwordspacebefore}
1292\unexpanded\def\interwordspacesafter #1{\dofastloopcs{#1}\interwordspaceafter}
1293\unexpanded\def\interwordspaces #1{\wordboundary\zwnj\dofastloopcs{\numexpr#1\minusone}\interwordspaceafter}
1294
1295\protect \endinput
1296 |