summaryrefslogtreecommitdiff
path: root/macros/context/contrib/context-letter/tex/context/third/letter/base/s-cor-00.mkvi
blob: d61fbfb18d92996e8a6679c9169ee2636d119dfa (plain)
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
%D \module
%D   [     file=s-cor-00,
%D      version=2015.08.24,
%D        title=\CONTEXT\ User Module,
%D     subtitle=Correspondence,
%D       author=Wolfgang Schuster,
%D         date=\currentdate,
%D    copyright=Wolfgang Schuster,
%D      license=GNU General Public License]

%C Copyright (C) 2011 Wolfgang Schuster
%C
%C This program is free software: you can redistribute it and/or modify
%C it under the terms of the GNU General Public License as published by
%C the Free Software Foundation, either version 3 of the License, or
%C (at your option) any later version.
%C
%C This program is distributed in the hope that it will be useful,
%C but WITHOUT ANY WARRANTY; without even the implied warranty of
%C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%C GNU General Public License for more details.
%C
%C You should have received a copy of the GNU General Public License
%C along with this program.  If not, see <https://www.gnu.org/licenses/>.

\unprotect

% Lua functions for the core and also for the frontend modules

\ctxloadluafile{s-cor-00}

% Constants and variables
 
\startinterface all
  \setinterfaceconstant {whitespace}      {whitespace}
  \setinterfaceconstant {backgroundimage} {backgroundimage}
  \setinterfaceconstant {fromname}        {fromname}
  \setinterfaceconstant {fromaddress}     {fromaddress}
  \setinterfaceconstant {attention}       {attention}
  \setinterfaceconstant {subject}         {subject}
  \setinterfaceconstant {closing}         {closing}
  \setinterfaceconstant {signature}       {signature}
  \setinterfaceconstant {copy}            {copy}
  \setinterfaceconstant {enclosure}       {enclosure}
  \setinterfaceconstant {postscript}      {postscript}
  \setinterfaceconstant {dispatch}        {dispatch}
  \setinterfaceconstant {toname}          {toname}
  \setinterfaceconstant {toaddress}       {toaddress}
  \setinterfaceconstant {backaddress}     {backaddress}
  \setinterfaceconstant {opening}         {opening}
  \setinterfaceconstant {fromphone}       {fromphone}
  \setinterfaceconstant {fromfax}         {fromfax}
  \setinterfaceconstant {frommail}        {frommail}
  \setinterfaceconstant {fromurl}         {fromurl}
  \setinterfaceconstant {salutation}      {salutation}
  \setinterfaceconstant {language}        {language}
  \setinterfaceconstant {leftalign}       {leftalign}
  \setinterfaceconstant {rightalign}      {rightalign}
  \setinterfaceconstant {datestyle}       {datestyle}
  \setinterfaceconstant {datecolor}       {datecolor}
  \setinterfaceconstant {subtitlestyle}   {subtitlestyle}
  \setinterfaceconstant {subtitlecolor}   {subtitlecolor}
  \setinterfaceconstant {street}          {street}
  \setinterfaceconstant {city}            {city}
  \setinterfaceconstant {phone}           {phone}
  \setinterfaceconstant {email}           {email}
  \setinterfaceconstant {bankname}        {bankname}
  \setinterfaceconstant {banknumber}      {banknumber}
  \setinterfaceconstant {accountnumber}   {accountnumber}
  \setinterfaceconstant {room}            {room}
  \setinterfaceconstant {yourref}         {yourref}
  \setinterfaceconstant {yourmail}        {yourmail}
  \setinterfaceconstant {myref}           {myref}
  \setinterfaceconstant {mymail}          {mymail}
  \setinterfaceconstant {customer}        {customer}
  \setinterfaceconstant {invoice}         {invoice}
  \setinterfaceconstant {fax}             {fax}
  \setinterfaceconstant {url}             {url}
  \setinterfaceconstant {bank}            {bank}
  \setinterfaceconstant {organization}    {organization}
  \setinterfaceconstant {zip}             {zip}
  \setinterfaceconstant {country}         {country}
  \setinterfaceconstant {addressentry}    {addressentry}
  \setinterfaceconstant {rulewidth}       {rulewidth}
\stopinterface

\startinterface all
  % all
  \setinterfacevariable {correspondence}  {correspondence}
  \setinterfacevariable {nexthead}        {nexthead}
  \setinterfacevariable {lefthead}        {lefthead}
  \setinterfacevariable {righthead}       {righthead}
  \setinterfacevariable {foot}            {foot}
  \setinterfacevariable {nextfoot}        {nextfoot}
  \setinterfacevariable {leftfoot}        {leftfoot}
  \setinterfacevariable {rightfoot}       {rightfoot}
  \setinterfacevariable {topmark}         {topmark}
  \setinterfacevariable {botmark}         {botmark}
  \setinterfacevariable {cutmark}         {cutmark}
  \setinterfacevariable {endmark}         {endmark}
  \setinterfacevariable {usermark}        {usermark}
  % letter
  \setinterfacevariable {letter}          {letter}
  \setinterfacevariable {lettermain}      {lettermain}
  \setinterfacevariable {letternext}      {letternext}
  \setinterfacevariable {address}         {address}
  \setinterfacevariable {backaddress}     {backaddress}
  \setinterfacevariable {location}        {location}
  \setinterfacevariable {opening}         {opening}
  \setinterfacevariable {closing}         {closing}
  \setinterfacevariable {secondpage}      {secondpage}
  \setinterfacevariable {copy}            {copy}
  \setinterfacevariable {enclosure}       {enclosure}
  \setinterfacevariable {french}          {french}
  \setinterfacevariable {specialnotation} {specialnotation}
  \setinterfacevariable {e}               {e}
  \setinterfacevariable {place}           {place}
  \setinterfacevariable {gbrief}          {gbrief}
  \setinterfacevariable {fullblock}       {fullblock}
  \setinterfacevariable {semiblock}       {semiblock}
  \setinterfacevariable {simplified}      {simplified}
  \setinterfacevariable {modified}        {modified}
  \setinterfacevariable {blockstyle}      {blockstyle}
  \setinterfacevariable {knuth}           {knuth}
  \setinterfacevariable {generic}         {generic}
  % memo
  \setinterfacevariable {memo}            {memo}
  \setinterfacevariable {memomain}        {memomain}
  \setinterfacevariable {memonext}        {memonext}
  % resume
  \setinterfacevariable {resume}          {resume}
  \setinterfacevariable {resumemain}      {resumemain}
  \setinterfacevariable {resumenext}      {resumenext}
  \setinterfacevariable {casual}          {casual}
  \setinterfacevariable {classic}         {classic}
  % frames
  \setinterfacevariable {frames}          {frames}
  \setinterfacevariable {framesmain}      {framesmain}
  \setinterfacevariable {framesnext}      {framesnext}
\stopinterface

% Messages

\definemessageconstant {correspondence}

\startinterface all
  \setinterfacemessage{correspondence}{title}{correspondence}
  \setinterfacemessage{correspondence}{1}    {Undefined layer       '--' for the '--' environment}
  \setinterfacemessage{correspondence}{2}    {Undefined section     '--' for the '--' environment}
  \setinterfacemessage{correspondence}{3}    {Undefined description '--' for the '--' environment}
\stopinterface

% Namespaces

\installnamespace {correspondence}
\installnamespace {correspondencebuffer}
\installnamespace {correspondenceoverlay}
\installnamespace {correspondencelayer}
\installnamespace {correspondencelayerrenderings}
\installnamespace {correspondencelayeralternative}
\installnamespace {correspondencelayerstate}
\installnamespace {correspondenceframe}
\installnamespace {correspondencesection}
\installnamespace {correspondencesectionrenderings}
\installnamespace {correspondencesectionalternative}
\installnamespace {correspondenceoption}
\installnamespace {correspondencedescription}
\installnamespace {correspondencedescriptionlocation}
\installnamespace {correspondencedescriptionformat}
\installnamespace {correspondencestyle}
\installnamespace {correspondenceelement}
\installnamespace {correspondenceelements}
\installnamespace {correspondencelayout}
\installnamespace {correspondencehead}
\installnamespace {correspondenceheadbuffer}
\installnamespace {correspondenceheadrenderings}
\installnamespace {correspondenceheadalternative}
\installnamespace {correspondenceparagraph}
\installnamespace {correspondenceparagraphbuffer}
\installnamespace {correspondenceparagraphrenderings}
\installnamespace {correspondenceparagraphalternative}
\installnamespace {correspondenceparagraphsetups}

% Itemgroup

\defineitemgroup[\v!correspondence]

% Environment

\installcommandhandler \????correspondence {correspondence} \????correspondence

\unexpanded\def\correspondence_start[#environment]%
  {\starttext
   \begingroup
   \def\currentcorrespondence{#environment}%
   \dosingleempty\correspondence_start_parameters}

\def\correspondence_start_parameters[#parameters]%
  {\iffirstargument
     \setupcurrentcorrespondence[#parameters]%
   \fi
   \grabbufferdatadirect{\????correspondencebuffer\currentcorrespondence}{\e!start\currentcorrespondence}{\e!stop\currentcorrespondence}}

\unexpanded\def\correspondence_stop[#environment]%
  {\correspondence_place[#environment]%
   \endgroup
   \stoptext}

\appendtoks
  \setuevalue{\e!start\currentcorrespondence}{\correspondence_start[\currentcorrespondence]}%
  \setuevalue{\e!stop \currentcorrespondence}{\correspondence_stop [\currentcorrespondence]}%
\to \everydefinecorrespondence

\unexpanded\def\correspondence_content_start[#environment]%
  {\begingroup
   \edef\currentcorrespondence{#environment}%
   \grabbufferdatadirect{\????correspondencebuffer\currentcorrespondence}{\e!start\currentcorrespondence\v!content}{\e!stop\currentcorrespondence\v!content}}

\unexpanded\def\correspondence_content_stop[#environment]%
  {\endgroup}

\unexpanded\def\correspondence_content_get[#environment]%
  {\edef\currentcorrespondence{#environment}%
   \getbufferdata[\????correspondencebuffer\currentcorrespondence]}

\appendtoks
  \setuevalue{\e!start\currentcorrespondence\v!content}{\correspondence_content_start[\currentcorrespondence]}%
  \setuevalue{\e!stop \currentcorrespondence\v!content}{\correspondence_content_stop [\currentcorrespondence]}%
  \setuevalue{\e!get  \currentcorrespondence\v!content}{\correspondence_content_get  [\currentcorrespondence]}%
\to \everydefinecorrespondence

\unexpanded\def\correspondence_parameters#environment#element%
  {\edef\currentcorrespondenceenvironment{#environment}%
   \edef\currentcorrespondenceelement    {#element}%
   \edef\currentcorrespondencelayer      {#environment:#element}%
   \edef\currentcorrespondenceframe      {#environment:#element}%
   \edef\currentcorrespondencesection    {#environment:#element}%
   \edef\currentcorrespondencedescription{#environment:#element}%
   \edef\currentcorrespondencehead       {#environment:#element}%
   \edef\currentcorrespondenceparagraph  {#environment:#element}}

% Setup

\unexpanded\def\correspondence_setup[#environment]%
  {\edef\currentcorrespondence{#environment}%
   \setupcurrentcorrespondence}

\appendtoks
  \setuevalue{\e!setup\currentcorrespondence\e!endsetup}{\dodoubleargument\correspondence_setup[\currentcorrespondence]}%
\to \everydefinecorrespondence

% Placement

\newtoks\t_correspondence_before
\newtoks\t_correspondence_between
\newtoks\t_correspondence_after

\unexpanded\def\correspondence_place[#environment]%
  {\begingroup
   \edef\currentcorrespondence{#environment}%
   \let \currentcorrespondenceoption\currentcorrespondence
   \the\t_correspondence_before
   \page
   \setuplayout[\c!method=\v!correspondence]%
   \setupheader[\c!state=\v!stop]%
   \setupfooter[\c!state=\v!stop]%
   \edef\p_correspondence_bodyfont       {\correspondenceoptionparameter\c!bodyfont       }%
   \edef\p_correspondence_whitespace     {\correspondenceoptionparameter\c!whitespace     }%
   \edef\p_correspondence_interlinespace {\correspondenceoptionparameter\c!interlinespace }%
   \edef\p_correspondence_language       {\correspondenceoptionparameter\c!language       }%
   \edef\p_correspondence_backgroundcolor{\correspondenceoptionparameter\c!backgroundcolor}%
   \ifx\p_correspondence_bodyfont       \empty \else \setupbodyfont      [\p_correspondence_bodyfont      ]\fi
   \ifx\p_correspondence_whitespace     \empty \else \setupwhitespace    [\p_correspondence_whitespace    ]\fi
   \ifx\p_correspondence_interlinespace \empty \else \setupinterlinespace[\p_correspondence_interlinespace]\fi
   \ifx\p_correspondence_language       \empty \else \mainlanguage       [\p_correspondence_language      ]\fi
   \the\t_correspondence_between
   \ifx\p_correspondence_backgroundcolor\empty \else
     \setupbackgrounds[\v!paper][\c!background=\v!color,\c!backgroundcolor=\p_correspondence_backgroundcolor]%
   \fi
   \setupbackgrounds[\v!page ][\c!background={\????correspondenceoverlay\c!backgroundimage,\????correspondenceoverlay\c!background,\????correspondenceoverlay\v!layer}]%
   \setuppagenumbering[\c!alternative=\v!singlesided,\c!location=]%
   \setupsubpagenumber[\c!way=\v!text,\c!state=\v!start]%
   \resetsubpagenumber
   \normalexpanded{\processcommalist[\correspondence_elements_access\currentcorrespondence\v!section]}{\correspondence_section_place\currentcorrespondence}%
   \page
   \resetsubpagenumber
   \setuplayout[\v!reset]%
   \the\t_correspondence_after
   \endgroup}

%D Besides the normal letter environment there are three different ways to flush
%D the content of a letter after the text was set with a buffer etc.
%D
%D \startitemize
%D \item \type{\setups[letter:place]}
%D \item \type{\placeletter}
%D \item \type{\placecorrespondence[letter]}
%D \stopitemize

\let\placecorrespondence\correspondence_place

\appendtoks
  \global\c_correspondence_page\zerocount
\to \t_correspondence_before

\appendtoks
  \setuevalue{\e!place\currentcorrespondence}{\correspondence_place[\currentcorrespondence]}%
\to \everydefinecorrespondence

% Layers

\installsimplecommandhandler       \????correspondencelayer            {correspondencelayer}            \????correspondencelayer
\installsimpleframedcommandhandler \????correspondenceframe            {correspondenceframe}            \????correspondenceframe
\installcommandhandler             \????correspondencelayeralternative {correspondencelayeralternative} \????correspondencelayeralternative

\unexpanded\def\correspondence_layer_define[#environment][#element]%
  {\def\currentcorrespondencelayer{#environment:#element}%
   \let\currentcorrespondenceframe\currentcorrespondencelayer
   \checkcorrespondencelayerparent
   \checkcorrespondenceframeparent}

\unexpanded\def\correspondence_layer_setup[#environment][#elements][#parameters]%
  {\def\correspondence_layer_command#element%
     {\edef\currentcorrespondencelayer{#environment:#element}%
      \setupcurrentcorrespondencelayer[#parameters]}%
   \processcommacommand[#elements]\correspondence_layer_command}

\unexpanded\def\correspondence_frame_setup[#environment][#elements][#parameters]%
  {\def\correspondence_frame_command#element%
     {\edef\currentcorrespondenceframe{#environment:#element}%
      \setupcurrentcorrespondenceframe[#parameters]}%
   \processcommacommand[#elements]\correspondence_frame_command}

\setvalue{\????correspondencelayerstate         }{\!!doneafalse \!!donebfalse \!!donecfalse}
\setvalue{\????correspondencelayerstate\v!start }{\!!doneatrue  \!!donebfalse \!!donecfalse}
\setvalue{\????correspondencelayerstate\v!stop  }{\!!doneafalse \!!donebfalse \!!donecfalse}
\setvalue{\????correspondencelayerstate\v!next  }{\!!doneafalse \!!donebtrue  \!!donectrue }
\setvalue{\????correspondencelayerstate\v!repeat}{\!!doneatrue  \!!donebtrue  \!!donectrue }
\setvalue{\????correspondencelayerstate\v!left  }{\!!doneafalse \!!donebfalse \!!donectrue }
\setvalue{\????correspondencelayerstate\v!right }{\!!doneafalse \!!donebtrue  \!!donecfalse}
\setvalue{\????correspondencelayerstate\v!even  }{\!!doneafalse \!!donebfalse \!!donectrue }
\setvalue{\????correspondencelayerstate\v!odd   }{\!!doneafalse \!!donebtrue  \!!donecfalse}

\definelayer  [\????correspondenceoverlay\v!layer][\c!width=\overlaywidth,\c!height=\overlayheight  ]
\defineoverlay[\????correspondenceoverlay\v!layer][\correspondence_layer_place\currentcorrespondence]

\unexpanded\def\correspondence_layer_place#environment%
  {\def\correspondence_layer_state#element%
     {\correspondence_parameters{#environment}{#element}%
      \expandcheckedcsname\????correspondencelayerstate{\correspondencelayerparameter\c!state}\v!stop
      \ifnum\c_correspondence_page=\plusone
        \if!!donea\correspondence_layer_direct\fi
      \else\ifodd\c_correspondence_page
        \if!!doneb\correspondence_layer_direct\fi
      \else
        \if!!donec\correspondence_layer_direct\fi
      \fi\fi}%
   \processcommacommand[\correspondence_elements_access\currentcorrespondence\v!layer]\correspondence_layer_state
   \tightlayer[\????correspondenceoverlay\v!layer]}

\unexpanded\def\correspondence_layer_direct
  {\setlayer
     [\????correspondenceoverlay\v!layer]
     [     \c!x=\correspondencelayerparameter\c!x,
           \c!y=\correspondencelayerparameter\c!y,
      \c!preset=\correspondencelayerparameter\c!preset]
     {\inheritedcorrespondenceframeframed
        {\doifsomething{\correspondencelayerparameter\c!bodyfont      }{\switchtobodyfont   [\correspondencelayerparameter\c!bodyfont      ]}%
         \doifsomething{\correspondencelayerparameter\c!interlinespace}{\setupinterlinespace[\correspondencelayerparameter\c!interlinespace]}%
         \usecorrespondencelayerstyleandcolor\c!style\c!color
         \doadaptleftskip {\correspondencelayerparameter\c!leftmargin }%
         \doadaptrightskip{\correspondencelayerparameter\c!rightmargin}%
         \doifsymboldefinedelse{\correspondencelayerparameter\c!symbol}%
           {\symbol[\correspondencelayerparameter\c!symbol]}
           {\correspondence_layer_alternative_place}}}}

\unexpanded\def\correspondence_layer_check[#environment][#element]%
  {\def\currentcorrespondencelayer{#environment:#element}%
   \ifcsname\currentcorrespondencelayerhash\s!parent\endcsname \else
     \showmessage\m!correspondence{2}{#element,#environment}%
   \fi}

\unexpanded\def\correspondence_layer_alternative_define[#environment][#self][#parent][#parameters]%
  {\iffourthargument
     \definecorrespondencelayeralternative[#environment:#self][#environment:#parent][#parameters]%
   \else
     \definecorrespondencelayeralternative[#environment:#self][#parent]%
   \fi}

\unexpanded\def\correspondence_layer_alternative_setup[#environment][#name][#parameters]%
  {\setupcorrespondencelayeralternative[#environment:#name][#parameters]}

\unexpanded\def\correspondence_layer_alternative_place
  {\edef\p_correspondence_layer_alternative{\correspondencelayerparameter\c!alternative}%
   \ifcsname\namedcorrespondencelayeralternativehash{\currentcorrespondencelayer:\p_correspondence_layer_alternative}\s!parent\endcsname
     \edef\currentcorrespondencelayeralternative{\currentcorrespondencelayer:\p_correspondence_layer_alternative}%
   \else\ifcsname\namedcorrespondencelayeralternativehash{\currentcorrespondenceenvironment:\p_correspondence_layer_alternative}\s!parent\endcsname
     \edef\currentcorrespondencelayeralternative{\currentcorrespondenceenvironment:\p_correspondence_layer_alternative}%
   \else
     \let\currentcorrespondencelayeralternative\p_correspondence_layer_alternative
   \fi\fi
   \edef\p_correspondence_layer_renderingsetup{\correspondencelayeralternativeparameter\c!renderingsetup}%
   \autosetups\p_correspondence_layer_renderingsetup}

\definecorrespondencelayeralternative[\v!setups][\c!renderingsetup=\????correspondencelayerrenderings:\v!setups]

\startsetups[\????correspondencelayerrenderings:\v!setups]
  \autosetups{\currentcorrespondenceenvironment:\v!layer:\currentcorrespondenceelement}
\stopsetups

\setupcorrespondencelayer
  [      \c!state=\v!start,
             \c!x=\zeropoint,
             \c!y=\zeropoint,
   \c!alternative=\s!default,
      \c!distance=\lineheight,
     \c!separator=\crlf]

\setupcorrespondenceframe
  [ \c!frame=\v!off,
   \c!offset=\zeropoint,
    \c!align=\v!flushleft]

% Sections

\installsimplecommandhandler \????correspondencesection            {correspondencesection}            \????correspondencesection
\installcommandhandler       \????correspondencesectionalternative {correspondencesectionalternative} \????correspondencesectionalternative

\unexpanded\def\correspondence_section_define[#environment][#element]%
  {\def\currentcorrespondencesection{#environment:#element}%
   \checkcorrespondencesectionparent}

\unexpanded\def\correspondence_section_setup[#environment][#elements][#parameters]%
  {\def\correspondence_section_command#element%
     {\edef\currentcorrespondencesection{#environment:#element}%
      \setupcurrentcorrespondencesection[#parameters]}%
   \processcommacommand[#elements]\correspondence_section_command}

\unexpanded\def\correspondence_section_place#environment#element%
  {\begingroup
   \correspondence_parameters{#environment}{#element}%
   \ifcsname\currentcorrespondencesectionhash\s!parent\endcsname
     \doifsomethingelse{\correspondencesectionparameter\c!spacebefore}{\blank[\correspondencesectionparameter\c!spacebefore]}\endgraf
     \correspondencesectionparameter\c!before
     \doadaptleftskip {\correspondencesectionparameter\c!leftmargin }%
     \doadaptrightskip{\correspondencesectionparameter\c!rightmargin}%
     \doifsomething{\correspondencesectionparameter\c!align    }{\setupalign    [\correspondencesectionparameter\c!align    ]}%
     \doifsomething{\correspondencesectionparameter\c!indenting}{\setupindenting[\correspondencesectionparameter\c!indenting]}%
     \usecorrespondencesectionstyleandcolor\c!style\c!color
     \correspondence_section_alternative_place
     \correspondencesectionparameter\c!after
     \doifsomethingelse{\correspondencesectionparameter\c!spaceafter }{\blank[\correspondencesectionparameter\c!spaceafter ]}\endgraf
   \else
     \showmessage\m!correspondence{2}{#element,#environment}%
   \fi
   \endgroup}

\unexpanded\def\correspondence_section_alternative_define[#environment][#self][#parent][#parameters]%
  {\iffourthargument
     \definecorrespondencesectionalternative[#environment:#self][#environment:#parent][#parameters]%
   \else
     \definecorrespondencesectionalternative[#environment:#self][#parent]%
   \fi}

\unexpanded\def\correspondence_section_alternative_setup[#environment][#name][#parameters]%
  {\setupcorrespondencesectionalternative[#environment:#name][#parameters]}

\unexpanded\def\correspondence_section_alternative_place
  {\edef\p_correspondence_section_alternative{\correspondencesectionparameter\c!alternative}%
   \ifcsname\namedcorrespondencesectionalternativehash{\currentcorrespondencesection:\p_correspondence_section_alternative}\s!parent\endcsname
     \edef\currentcorrespondencesectionalternative{\currentcorrespondencelayer:\p_correspondence_section_alternative}%
   \else\ifcsname\namedcorrespondencesectionalternativehash{\currentcorrespondenceenvironment:\p_correspondence_section_alternative}\s!parent\endcsname
     \edef\currentcorrespondencesectionalternative{\currentcorrespondenceenvironment:\p_correspondence_section_alternative}%
   \else
     \let\currentcorrespondencesectionalternative\p_correspondence_section_alternative
   \fi\fi
   \edef\p_correspondence_section_renderingsetup{\correspondencesectionalternativeparameter\c!renderingsetup}%
   \autosetups\p_correspondence_section_renderingsetup}

\definecorrespondencesectionalternative[\v!setups][\c!renderingsetup=\????correspondencesectionrenderings:\v!setups]

\startsetups[\????correspondencesectionrenderings:\v!setups]
  \autosetups{\currentcorrespondenceenvironment:\v!section:\currentcorrespondenceelement}
\stopsetups

\setupcorrespondencesection
  [   \c!spacebefore=\v!line,
       \c!spaceafter=\v!line,
   \c!spaceinbetween={\v!samepage,\v!line},
      \c!alternative=\s!default,
        \c!separator=\crlf]

% Options

\installsimplecommandhandler \????correspondenceoption {correspondenceoption} \????correspondenceoption

\unexpanded\def\correspondence_option_setup[#environment]%
  {\edef\currentcorrespondenceoption{#environment}%
   \setupcurrentcorrespondenceoption}%

\defineoverlay
  [\????correspondenceoverlay\c!backgroundimage]
  [\doifsomething{\correspondenceoptionparameter\c!backgroundimage}
     {\overlayfigure{\correspondenceoptionparameter\c!backgroundimage}}]

\defineoverlay
  [\????correspondenceoverlay\c!background]
  [\correspondenceoptionparameter\c!background]

% Descriptions

\installsimplecommandhandler \????correspondencedescription            {correspondencedescription}            \????correspondencedescription
\installcommandhandler       \????correspondencedescriptionalternative {correspondencedescriptionalternative} \????correspondencedescriptionalternative

\let\m_correspondence_description_format\empty
\let\m_correspondence_description_items \empty

\unexpanded\def\correspondence_description_define[#environment][#element]%
  {\def\currentcorrespondencedescription{#environment:#element}%
   \checkcorrespondencedescriptionparent}

\unexpanded\def\correspondence_description_setup[#environment][#elements][#parameters]%
  {\def\correspondence_description_command#element%
     {\edef\currentcorrespondencedescription{#environment:#element}
      \setupcurrentcorrespondencedescription[#parameters]}%
   \processcommacommand[#elements]\correspondence_description_command}

\unexpanded\def\correspondence_description_place#environment#element%
  {\begingroup
   \correspondence_parameters{#environment}{#element}%
   \ifcsname\currentcorrespondencedescriptionhash\s!parent\endcsname
     \doifsomethingelse{\correspondencedescriptionparameter\c!textcommand}\donetrue\donefalse
     \ifdone
       \doifsomethingelse{\correspondencedescriptionparameter\c!spacebefore}{\blank[\correspondencedescriptionparameter\c!spacebefore]}\endgraf
       \correspondencedescriptionparameter\c!before
       \setbox\scratchbox\hbox
         {\usecorrespondencedescriptionstyleandcolor\c!headstyle\c!headcolor
          \correspondencedescriptionparameter\c!headcommand}%
       \assignwidth
         {\correspondencedescriptionparameter\c!width}
         {\scratchdimen}
         {\unhcopy\scratchbox}
         {\correspondencedescriptionparameter\c!distance}%
       \ctxlua{thirddata.correspondence.description_split(\!!bs\correspondencedescriptionparameter\c!textcommand\!!es)}%
       \expandcheckedcsname\????correspondencedescriptionlocation{\correspondencedescriptionparameter\c!location}\v!left
       \correspondencedescriptionparameter\c!after
       \doifsomethingelse{\correspondencedescriptionparameter\c!spaceafter}{\blank[\correspondencedescriptionparameter\c!spaceafter]}\endgraf
     \fi
   \else
     \showmessage\m!correspondence{3}{#element,#environment}%
   \fi
   \endgroup}

% \unexpanded\def\correspondence_description_alternative_define[#environment][#self][#parent][#parameters]%
%   {\iffourthargument
%      \definecorrespondencedescriptionalternative[#environment:#self][#environment:#parent][#parameters]%
%    \else
%      \definecorrespondencedescriptionalternative[#environment:#self][#parent]%
%    \fi}
%
% \unexpanded\def\correspondence_description_alternative_setup[#environment][#name][#parameters]%
%   {\setupcorrespondencedescriptionalternative[#environment:#name][#parameters]}
%
% \unexpanded\def\correspondence_description_alternative_place
%   {\edef\p_correspondence_description_alternative{\correspondencedescriptionparameter\c!alternative}%
%    \ifcsname\namedcorrespondencedescriptionalternativehash{\currentcorrespondencedescription:\p_correspondence_description_alternative}\s!parent\endcsname
%      \edef\currentcorrespondencedescriptionalternative{\currentcorrespondencedescription:\p_correspondence_description_alternative}%
%    \else\ifcsname\namedcorrespondencedescriptionalternativehash{\currentcorrespondenceenvironment:\p_correspondence_description_alternative}\s!parent\endcsname
%      \edef\currentcorrespondencedescriptionalternative{\currentcorrespondenceenvironment:\p_correspondence_description_alternative}%
%    \else
%      \let\currentcorrespondencedescriptionalternative\p_correspondence_description_alternative
%    \fi\fi
%    \edef\p_correspondence_description_renderingsetup{\correspondencedescriptionalternativeparameter\c!renderingsetup}%
%    \autosetups\p_correspondence_description_renderingsetup}

\setvalue{\????correspondencedescriptionlocation\v!left}%
  {\doadaptleftskip\scratchdimen
   \setbox\scratchbox\hbox to \scratchdimen{\box\scratchbox\hss}%
   \noindent\llap{\box\scratchbox}\correspondence_description_place_text}

\setvalue{\????correspondencedescriptionlocation\v!top}%
  {\noindent\box\scratchbox
   \doifsomethingelse{\correspondencedescriptionparameter\c!spaceinbetween}
     {\blank[\correspondencedescriptionparameter\c!spaceinbetween]}
     {\nobreak\endgraf}%
   \doadaptleftskip {\correspondencedescriptionparameter\c!leftmargin }%
   \doadaptrightskip{\correspondencedescriptionparameter\c!rightmargin}%
   \correspondence_description_place_text}

\setvalue{\????correspondencedescriptionlocation\v!text}%
  {\noindent\box\scratchbox\correspondence_description_place_text}

\unexpanded\def\correspondence_description_place_text
  {\expandcheckedcsname\????correspondencedescriptionformat\m_correspondence_description_format\v!none}

\setvalue{\????correspondencedescriptionformat\v!list}% todo: use a simplified version of the itemize code
  {\def\correspondence_description_format_item#text{\startitem#text\stopitem}%
   \dontleavehmode\vtop\bgroup
     \leftskip\zeropoint % prevent additional offset when “location=left” is used
     \doif{\correspondencedescriptionparameter\c!symbol}\v!none{\setupitemgroup[\v!correspondence][\v!each][\c!width=\zeropoint,distance=\zeropoint]}%
     \startitemgroup[\v!correspondence][\v!packed,\correspondencedescriptionparameter\c!symbol]%
     \processcommacommand[\m_correspondence_description_items]\correspondence_description_format_item
     \stopitemgroup
   \egroup}

\setvalue{\????correspondencedescriptionformat\v!none}%
  {\m_correspondence_description_items}

% \def\correspondence_description_item#text%
%   {\begingroup
%    \setbox\scratchbox\hbox
%      {\usecorrespondencedescriptionstyleandcolor\c!symbolstyle\c!symbolcolor
%       \symbol{\correspondencedescriptionparameter\c!symbol}}%
%    \assignwidth
%      {\correspondencedescriptionparameter\c!symbolwidth}
%      {\scratchdimen}
%      {\unhcopy\scratchbox}
%      {\correspondencedescriptionparameter\c!symboldistance}%
%    \endgroup}

\setupcorrespondencedescription
  [   \c!width=\v!fit,
   \c!distance=1em,
     \c!symbol=dash]

% Paragraphs

\installsimplecommandhandler \????correspondenceparagraph            {correspondenceparagraph}            \????correspondenceparagraph
\installcommandhandler       \????correspondenceparagraphalternative {correspondenceparagraphalternative} \????correspondenceparagraphalternative

% \newtoks\t_correspondence_paragraphs
%
% \appendtoks
%   \the\t_correspondence_paragraphs
% \to \t_correspondence_before
%
% \unexpanded\def\correspondence_paragraph_define[#environment][#element]%
%   {\def\currentcorrespondenceparagraph{#environment:#element}%
%    \checkcorrespondenceparagraphparent
%    \t_correspondence_paragraphs\expandafter{\the\t_correspondence_paragraphs\correspondence_paragraph_commands[#environment][#element]}}

\unexpanded\def\correspondence_paragraph_define[#environment][#element]%
  {\def\currentcorrespondenceparagraph{#environment:#element}%
   \checkcorrespondenceparagraphparent
   \correspondence_paragraph_commands[#environment][#element]}

\unexpanded\def\correspondence_paragraph_setup[#environment][#elements][#parameters]%
  {\def\correspondence_paragraph_command#element%
     {\edef\currentcorrespondenceparagraph{#environment:#element}%
      \setupcurrentcorrespondenceparagraph[#parameters]}%
   \processcommacommand[#elements]\correspondence_paragraph_command}

\unexpanded\def\correspondence_paragraph_commands[#environment][#element]%
  {\setuevalue{\e!start#element}{\correspondence_paragraph_start[#environment][#element]}%
   \setuevalue{\e!stop #element}{\correspondence_paragraph_stop [#environment][#element]}}

% \unexpanded\def\correspondence_paragraph_start[#environment][#element]%
%   {\begingroup
%    \correspondence_parameters{#environment}{#element}%
%    \dodoubleempty\correspondence_paragraph_start_parameters}%
% 
% \unexpanded\def\correspondence_paragraph_start_parameters[#parameters][#dummy]% #dummy removes the linebreak before the first line
%   {\iffirstargument
%      \setupcurrentcorrespondenceparagraph[#parameters]%
%    \fi
%    \grabbufferdatadirect{\????correspondenceparagraphbuffer\currentcorrespondenceparagraph}{\e!start\currentcorrespondenceelement}{\e!stop\currentcorrespondenceelement}}

\unexpanded\def\correspondence_paragraph_start[#environment][#element]%
  {\begingroup
   \correspondence_parameters{#environment}{#element}%
   \dosingleempty\correspondence_paragraph_start_parameters}%

\unexpanded\def\correspondence_paragraph_start_parameters[#parameters]%
  {\iffirstargument
     \setupcurrentcorrespondenceparagraph[#parameters]%
   \fi
   \grabbufferdatadirect{\????correspondenceparagraphbuffer\currentcorrespondenceparagraph}{\e!start\currentcorrespondenceelement}{\e!stop\currentcorrespondenceelement}}

\unexpanded\def\correspondence_paragraph_stop[#environment][#element]%
  {\doifsomethingelse{\correspondenceparagraphparameter\c!spacebefore}{\blank[\correspondenceparagraphparameter\c!spacebefore]}\endgraf
   \correspondence_paragraph_alternative_place
   \doifsomethingelse{\correspondenceparagraphparameter\c!spaceafter }{\blank[\correspondenceparagraphparameter\c!spaceafter ]}\endgraf
   \endgroup}

\unexpanded\def\correspondence_paragraph_alternative_define[#environment][#self][#parent][#parameters]%
  {\iffourthargument
     \definecorrespondenceparagraphalternative[#environment:#self][#environment:#parent][#parameters]%
   \else
     \definecorrespondenceparagraphalternative[#environment:#self][#parent]%
   \fi}

\unexpanded\def\correspondence_paragraph_alternative_setup[#environment][#name][#parameters]%
  {\setupcorrespondenceparagraphalternative[#environment:#name][#parameters]}

\unexpanded\def\correspondence_paragraph_alternative_place
  {\edef\p_correspondence_paragraph_alternative{\correspondenceparagraphparameter\c!alternative}%
   \ifcsname\namedcorrespondenceparagraphalternativehash{\currentcorrespondenceparagraph:\p_correspondence_paragraph_alternative}\s!parent\endcsname
     \edef\currentcorrespondenceparagraphalternative{\currentcorrespondenceparagraph:\p_correspondence_paragraph_alternative}%
   \else\ifcsname\namedcorrespondenceparagraphalternativehash{\currentcorrespondenceenvironment:\p_correspondence_paragraph_alternative}\s!parent\endcsname
     \edef\currentcorrespondenceparagraphalternative{\currentcorrespondenceenvironment:\p_correspondence_paragraph_alternative}%
   \else
     \let\currentcorrespondenceparagraphalternative\p_correspondence_paragraph_alternative
   \fi\fi
   \edef\p_correspondence_paragraph_renderingsetup{\correspondenceparagraphalternativeparameter\c!renderingsetup}%
   \autosetups\p_correspondence_paragraph_renderingsetup}

\definecorrespondenceparagraphalternative[\s!default   ][\c!renderingsetup=\????correspondenceparagraphrenderings:\s!default   ]
\definecorrespondenceparagraphalternative[\v!columns   ][\c!renderingsetup=\????correspondenceparagraphrenderings:\v!columns   ]
\definecorrespondenceparagraphalternative[\c!lefttext  ][\c!renderingsetup=\????correspondenceparagraphrenderings:\c!lefttext  ]
\definecorrespondenceparagraphalternative[\c!middletext][\c!renderingsetup=\????correspondenceparagraphrenderings:\c!middletext]
\definecorrespondenceparagraphalternative[\c!righttext ][\c!renderingsetup=\????correspondenceparagraphrenderings:\c!righttext ]

\startsetups[\????correspondenceparagraphrenderings:\s!default]
  \ifdefined\currentparentcorrespondenceparagraph
    \getbufferdata[\????correspondenceparagraphbuffer\currentparentcorrespondenceparagraph]
  \else
    \getbufferdata[\????correspondenceparagraphbuffer\currentcorrespondenceparagraph      ]
  \fi
\stopsetups

\newbox  \b_correspondence_paragraph
\newcount\c_correspondence_paragraph

\unexpanded\def\correspondence_paragraph_columns_start
  {\begingroup
   \global\c_correspondence_paragraph\zerocount
   \edef\p_correspondence_paragraph_n       {\correspondenceparagraphparameter\c!n       }%
   \edef\p_correspondence_paragraph_distance{\correspondenceparagraphparameter\c!distance}%
   \letcorrespondenceparagraphparameter\c!alternative\v!default
   \dontleavehmode\hbox\bgroup}

\unexpanded\def\correspondence_paragraph_columns_stop
  {\egroup
   \endgroup}

\unexpanded\def\correspondence_paragraph_columns_place
  {\begingroup
   \global\advance\c_correspondence_paragraph\plusone
   \let\currentparentcorrespondenceparagraph\currentcorrespondenceparagraph
   \chaintocurrentcorrespondenceparagraph{\currentparentcorrespondenceparagraph:\number\c_correspondence_paragraph}%
   \edef\currentcorrespondenceparagraph  {\currentparentcorrespondenceparagraph:\number\c_correspondence_paragraph}%
   \edef\p_correspondence_columns_width  {\correspondenceparagraphparameter\c!width}%
   \setbox\b_correspondence_paragraph\vtop\bgroup
     \ifx\p_correspondence_columns_width\empty \else \hsize\p_correspondence_columns_width \fi
     \usealignparameter\correspondenceparagraphparameter
     \begstrut
     \usecorrespondenceparagraphstyleandcolor\c!style\c!color
     \correspondence_paragraph_alternative_place
     \endstrut
   \egroup
   \ifzeropt\p_correspondence_columns_width \else
     \ifnum\c_correspondence_paragraph>\p_correspondence_paragraph_n
       % more columns are used than specified
     \else\ifnum\c_correspondence_paragraph=\p_correspondence_paragraph_n
       \box\b_correspondence_paragraph
     \else
       \box\b_correspondence_paragraph
       \hskip\p_correspondence_paragraph_distance
     \fi\fi
   \fi
   \endgroup}

\startsetups[\????correspondenceparagraphrenderings:\v!columns]

  \correspondence_paragraph_columns_start
  \dorecurse\p_correspondence_paragraph_n\correspondence_paragraph_columns_place
  \correspondence_paragraph_columns_stop

\stopsetups

\startsetups[\????correspondenceparagraphrenderings:\c!lefttext]

  \correspondenceparagraphparameter\c!lefttext

\stopsetups

\startsetups[\????correspondenceparagraphrenderings:\c!middletext]

  \correspondenceparagraphparameter\c!middletext

\stopsetups

\startsetups[\????correspondenceparagraphrenderings:\c!righttext]

  \correspondenceparagraphparameter\c!righttext

\stopsetups

\setupcorrespondenceparagraph
  [\c!spacebefore=\v!line,
    \c!spaceafter=\v!line,
   \c!alternative=\s!default,
      \c!distance=\zeropoint,
         \c!width=\zeropoint,
             \c!n=3]

% Heading

\installframedcommandhandler \????correspondencehead            {correspondencehead}            \????correspondencehead
\installcommandhandler       \????correspondenceheadalternative {correspondenceheadalternative} \????correspondenceheadalternative

\appendtoks
  \definelist   [\currentcorrespondencehead]% \definelist   [\????correspondenceheadlist   \currentcorrespondencehead]
  \definemarking[\currentcorrespondencehead]% \definemarking[\????correspondenceheadmarking\currentcorrespondencehead]
\to \everydefinecorrespondencehead

% \newtoks\t_correspondence_headings
%
% \appendtoks
%   \the\t_correspondence_headings
% \to \t_correspondence_before 
%
% \unexpanded\def\correspondence_head_define[#environment][#element]%
%   {\def\currentcorrespondencehead{#environment:#element}%
%    \checkcorrespondenceheadparent
%    \t_correspondence_headings\expandafter{\the\t_correspondence_headings\correspondence_head_commands[#environment][#element]}}

\unexpanded\def\correspondence_head_define[#environment][#element]%
  {\def\currentcorrespondencehead{#environment:#element}%
   \checkcorrespondenceheadparent
   \correspondence_head_commands[#environment][#element]}

\unexpanded\def\correspondence_head_setup[#environment][#elements][#parameters]%
  {\def\correspondence_head_command#element%
     {\edef\currentcorrespondencehead{#environment:#element}%
      \setupcurrentcorrespondencehead[#parameters]}%
   \processcommacommand[#elements]\correspondence_head_command}

\unexpanded\def\correspondence_head_commands[#environment][#element]%
  {%setuevalue        {#element}{\correspondence_head_direct[#environment][#element]}%
   \setuevalue{\e!start#element}{\correspondence_head_start [#environment][#element]}%
   \setuevalue{\e!stop #element}{\correspondence_head_stop  [#environment][#element]}}

% \unexpanded\def\correspondence_head_direct[#environment][#element]%
%   {\begingroup
%    \correspondence_parameters{#environment}{#element}%
%    \doifnextbgroupelse{\dosinglegroupempty\correspondence_head_direct_argument}{\dosingleempty\correspondence_head_direct_parameters}}
%
% \unexpanded\def\correspondence_head_direct_argument#title%
%   {\setcorrespondenceheadparameter\c!title{#title}%
%    \correspondence_head_alternative_place
%    \endgroup}
%
% \unexpanded\def\correspondence_head_direct_parameters[#parameters]%
%   {\iffirstargument
%      \setupcurrentcorrespondencehead[#parameters]%
%    \fi
%    \correspondence_head_alternative_place
%    \endgroup}

\unexpanded\def\correspondence_head_start[#environment][#element]%
  {\begingroup
   \correspondence_parameters{#environment}{#element}%
   \dodoubleempty\correspondence_head_start_parameters}

\unexpanded\def\correspondence_head_start_parameters[#parameters][#dummy]%
  {\iffirstargument
     \setupcurrentcorrespondencehead[#parameters]%
   \fi
   \correspondenceheadparameter\c!beforesection
   \correspondence_head_alternative_place}

\unexpanded\def\correspondence_head_stop[#environment][#element]%
  {\correspondenceheadparameter\c!aftersection
   \endgroup}

\unexpanded\def\correspondence_head_alternative_define[#environment][#self][#parent][#parameters]%
  {\iffourthargument
     \definecorrespondenceheadalternative[#environment:#self][#environment:#parent][#parameters]%
   \else
     \definecorrespondenceheadalternative[#environment:#self][#parent]%
   \fi}

\unexpanded\def\correspondence_head_alternative_setup[#environment][#name][#parameters]%
  {\setupcorrespondenceheadalternative[#environment:#name][#parameters]}

\unexpanded\def\correspondence_head_alternative_place
  {\edef\p_correspondence_head_alternative{\correspondenceheadparameter\c!alternative}%
   \ifcsname\namedcorrespondenceheadalternativehash{\currentcorrespondencehead:\p_correspondence_head_alternative}\s!parent\endcsname
     \edef\currentcorrespondenceheadalternative{\currentcorrespondencehead:\p_correspondence_head_alternative}%
   \else\ifcsname\namedcorrespondenceheadalternativehash{\currentcorrespondenceenvironment:\p_correspondence_head_alternative}\s!parent\endcsname
     \edef\currentcorrespondenceheadalternative{\currentcorrespondenceenvironment:\p_correspondence_head_alternative}%
   \else
     \let\currentcorrespondenceheadalternative\p_correspondence_head_alternative
   \fi\fi
   \edef\p_correspondence_section_renderingsetup{\correspondenceheadalternativeparameter\c!renderingsetup}%
   \autosetups\p_correspondence_section_renderingsetup}

\unexpanded\def\correspondenceheadtitle
  {\begingroup
     \usecorrespondenceheadstyleandcolor\c!style\c!color
     \correspondenceheadparameter\c!textcommand{\begstrut\correspondenceheadparameter\c!title\endstrut}%
   \endgroup}

\definecorrespondenceheadalternative[\s!default ][\c!renderingsetup=\????correspondenceheadrenderings:\s!default ]
\definecorrespondenceheadalternative[\v!margin  ][\c!renderingsetup=\????correspondenceheadrenderings:\v!margin  ]
\definecorrespondenceheadalternative[\v!inmargin][\c!renderingsetup=\????correspondenceheadrenderings:\v!inmargin]

\startsetups[\????correspondenceheadrenderings:\s!default]

  \edef\p_spacebefore{\correspondenceheadparameter\c!spacebefore}
  \edef\p_spaceafter {\correspondenceheadparameter\c!spaceafter }

  \ifx\p_spacebefore\empty \else
    \blank[\p_spacebefore]
  \fi

  \vbox\bgroup
    \usealignparameter\correspondenceheadparameter
    \correspondenceheadtitle
  \egroup

  \ifx\p_spaceafter\empty \else
    \blank[\p_spaceafter]
  \fi

\stopsetups

\startsetups[\????correspondenceheadrenderings:\v!margin]

  \dontleavehmode\llap\bgroup
    \vtop\bgroup
      \hsize\leftmarginwidth
      \usealignparameter\correspondenceheadparameter
      \correspondenceheadtitle
    \egroup
    \hskip\leftmargindistance
  \egroup

  \blank[\v!overlay]

\stopsetups

\setupcorrespondencehead
  [   \c!spacebefore=\v!line,
       \c!spaceafter={\v!samepage,\v!line},
      \c!alternative=\s!default,
            \c!align=\v!middle,
            \c!style=\v!bold]

% Elements

\unexpanded\def\correspondence_element_define[#environment][#type][#element][#name]%
  {\edef\m_correspondence_element_type{#type}%
   \ifx\m_correspondence_element_type\v!section
     \expandafter\correspondence_element_define_section
   \else
     \expandafter\correspondence_element_define_layer
   \fi[#environment][#type][#element][#name]}

\def\correspondence_element_define_section[#environment][#type][#element][#name]#content%
  {\definecorrespondencesectionalternative[#environment:#element:#name][\c!renderingsetup=\????correspondencesectionrenderings:\v!command]%
   \setvalue{\????correspondenceelement:#environment:#type:#element:#name}{#content}}

\def\correspondence_element_define_layer[#environment][#type][#element][#name]#content%
  {\definecorrespondencelayeralternative[#environment:#element:#name][\c!renderingsetup=\????correspondencelayerrenderings:\v!command]%
   \setvalue{\????correspondenceelement:#environment:#type:#element:#name}{#content}}

\startsetups[\????correspondencesectionrenderings:\v!command]
  \correspondence_element_place[\currentcorrespondenceenvironment][\v!section][\currentcorrespondenceelement][\correspondencesectionparameter\c!alternative]
\stopsetups

\startsetups[\????correspondencelayerrenderings:\v!command]
  \correspondence_element_place[\currentcorrespondenceenvironment][\v!layer][\currentcorrespondenceelement][\correspondencelayerparameter\c!alternative]
\stopsetups

\unexpanded\def\correspondence_element_place[#environment][#type][#element][#name]%
  {\expandcheckedcsname{\????correspondenceelement:#environment:#type:#element:}{#name}\s!default}

% Files

\unexpanded\def\correspondence_file_load[#environment][#names]%
  {\def\correspondence_file_command#name%
     {\ctxlua{thirddata.correspondence.file("#environment","#name")}}%
   \processcommacommand[#names]\correspondence_file_command}

% Style

\installsimplecommandhandler \????correspondencestyle {correspondencestyle} \????correspondencestyle

\unexpanded\def\correspondence_style_setup[#environment][#elements][#parameters]%
  {\def\correspondence_style_command#element%
     {\edef\currentcorrespondencestyle{#environment:#element}%
      \setupcurrentcorrespondencestyle[#parameters]}%
   \processcommacommand[#elements]\correspondence_style_command}

\unexpanded\def\correspondence_style_width#environment#element#content%
  {\edef\currentcorrespondencestyle  {#environment:#element}%
   \edef\p_correspondence_style_width{\correspondencestyleparameter\c!width}%
   \hbox \ifx\p_correspondence_style_width\empty \else to \p_correspondence_style_width \fi{#content\hss}}

\unexpanded\def\formattedcorrespondenceparameter#element%
  {\begingroup
     \edef\currentcorrespondenceelement{#element}%
     \edef\currentcorrespondencestyle  {\currentcorrespondence:#element}%
     \usecorrespondencestylestyleandcolor\c!style\c!color
     \correspondenceparameter\currentcorrespondenceelement
   \endgroup}

%D \section{Layout}
%D
%D \startitemize[packed]
%D \item firstpage,
%D \item secondpage,
%D \item leftpage and
%D \item rightpage.
%D \stopitemize

\newcount\c_correspondence_page

\installlayoutmethod \v!correspondence
  {\global\advance\c_correspondence_page\plusone
   \ifnum\c_correspondence_page=\plusone
     \changetolayout{\????correspondencelayout\currentcorrespondence\v!firstpage}%
   \else\ifodd\c_correspondence_page
     \changetolayout{\????correspondencelayout\currentcorrespondence\v!rightpage}%
   \else
     \changetolayout{\????correspondencelayout\currentcorrespondence\v!leftpage }%
   \fi\fi}

\unexpanded\def\correspondence_layout_define
  {\dotripleempty\correspondence_layout_define_indeed}

\unexpanded\def\correspondence_layout_define_indeed[#environment][#self][#parent]%
  {\def\m_correspondence_layout_self  {#environment#self}%
   \def\m_correspondence_layout_parent{#environment#parent}%
   \ifthirdargument
     \definelayout[\????correspondencelayout\m_correspondence_layout_self][\????correspondencelayout\m_correspondence_layout_parent]%
   \else
     \definelayout[\????correspondencelayout\m_correspondence_layout_self]%
   \fi}

\unexpanded\def\correspondence_layout_setup[#environment][#elements][#parameters]%
  {\def\correspondence_layout_command#element%
     {\def\m_correspondence_layout_current{#environment#element}%
      \setuplayout[\????correspondencelayout\m_correspondence_layout_current][#parameters]}%
   \processcommacommand[#elements]\correspondence_layout_command}

\appendtoks
  \correspondence_layout_define[\currentcorrespondence][\v!firstpage ]%
  \correspondence_layout_define[\currentcorrespondence][\v!secondpage]%
  \correspondence_layout_define[\currentcorrespondence][\v!leftpage  ][\v!secondpage]%
  \correspondence_layout_define[\currentcorrespondence][\v!rightpage ][\v!secondpage]%
\to \everydefinecorrespondence

% Lists

\def\correspondence_elements_define[#environment][#name][#list]%
  {\setvalue{\????correspondenceelements#environment:#name}{#list}}

\def\correspondence_elements_access#environment#name%
  {\begcsname\????correspondenceelements#environment:#name\endcsname}

% Extras

\definesymbol[\v!cutmark][{\blackrule[\c!width=4mm,\c!height=\linewidth]}]

\protect \endinput