// Simulate text lines
real em=10pt; // Computer Modern
real baselineskip=1.2*em;
real textpen_wd=0.8*em;
pen textpen = linewidth(textpen_wd)+mediumgray+squarecap+opacity(0.5); // simulate text lines
pen surrounding_environmentpen = textpen; // simulate text lines
pen labelpen = black+font("OT1","cmr","m","it")+fontsize(7);
// basic list
real pagewidth=8cm;
real pageleftmargin=0.25cm;
real pagerightmargin=0.25cm;
real baseline; // keep track of vert location of baseline
int num_lines_above = 2;
int num_lines_first_item_first_paragraph = 3;
int num_lines_first_item_second_paragraph = 1;
int num_lines_second_item = 3;
int num_lines_below = 2;
// list parameters
// LaTeX's book 10 defaults; not suitable for illustration
// real leftmargin=2.5*em;
// real rightmargin=0*em;
// real topsep=8pt;
// real parskip=0pt;
// real partopsep=2pt;
// real labelwidth=leftmargin;
// real labelsep=0.5*em;
// real parsep=4pt;
// real itemindent=parsep;
// real listparindent=itemindent;
// real itemsep=4pt;
// parameters shown on the diagram
real leftmargin=2.5*em;
real rightmargin=1.5*em;
real topsep=8pt;
real parskip=4pt;
real partopsep=2pt;
real labelwidth=3em;
real labelsep=0.5*em;
real parsep=4pt;
real itemindent=16pt;
real listparindent=5pt;
real itemsep=8pt;
real labelleftedge = (pageleftmargin+leftmargin+itemindent)-(labelwidth+labelsep);
real labelrightedge = labelleftedge+labelwidth;
// lines above list
baseline=0;
lne = (pageleftmargin,baseline)--(pagewidth-pagerightmargin,baseline);
draw(lne,surrounding_environmentpen);
for (int line_no=0; line_no<(num_lines_above-1); ++line_no) {
baseline = baseline-baselineskip;
lne=(pageleftmargin,baseline)--(pagewidth-pagerightmargin,baseline);
draw(lne,surrounding_environmentpen);
}
label("Surrounding environment, preceding material",(0.5*(pageleftmargin+pagewidth-pagerightmargin),baseline),labelpen);
real bot_preceding_material = baseline-0.5*textpen_wd;
// list first item
baseline=baseline-baselineskip-topsep-parskip-partopsep;
real top_item_one = baseline+0.5*textpen_wd;
draw((labelleftedge,baseline)--(labelrightedge,baseline),textpen); // label
label("Label",(0.5*(labelleftedge+labelrightedge),baseline),labelpen);
draw((labelrightedge+labelsep,baseline)--(pagewidth-pagerightmargin-rightmargin,baseline),textpen); // rest of label line
label("\makebox[0em][l]{First item}",((pageleftmargin+leftmargin)+3.5em,baseline),labelpen);
for (int line_no=0; line_no<(num_lines_first_item_first_paragraph-1); ++line_no) {
baseline = baseline-baselineskip;
draw((pageleftmargin+leftmargin,baseline)--(pagewidth-pagerightmargin-rightmargin,baseline),textpen);
}
real bot_item_one_par_one = baseline-0.5*textpen_wd;
// first item's second paragraph
baseline = baseline-baselineskip-parsep;
real top_item_one_par_two = baseline+0.5*textpen_wd;
draw((pageleftmargin+leftmargin+listparindent,baseline)--(pagewidth-pagerightmargin-rightmargin,baseline),textpen);
label("\makebox[0em][l]{First item, second paragraph}",((pageleftmargin+leftmargin)+3.5em,baseline),labelpen);
for (int line_no=0; line_no<(num_lines_first_item_second_paragraph-1); ++line_no) {
baseline = baseline-baselineskip;
draw((pageleftmargin+leftmargin,baseline)--(pagewidth-pagerightmargin-rightmargin,baseline),textpen);
}
real bot_item_one = baseline-0.5*textpen_wd;
// list second item
baseline=baseline-baselineskip-itemsep-parsep;
real top_item_two = baseline+0.5*textpen_wd;
draw((labelleftedge,baseline)--(labelrightedge,baseline),textpen); // label
label("Label",(0.5*(labelleftedge+labelrightedge),baseline),labelpen);
draw((labelrightedge+labelsep,baseline)--(pagewidth-pagerightmargin-rightmargin,baseline),textpen); // rest of label line
label("\makebox[0em][l]{Second item}",((pageleftmargin+leftmargin)+3.5em,baseline),labelpen);
for (int line_no=0; line_no<(num_lines_second_item-1); ++line_no) {
baseline = baseline-baselineskip;
draw((pageleftmargin+leftmargin,baseline)--(pagewidth-pagerightmargin-rightmargin,baseline),textpen);
}
real bot_item_two = baseline-0.5*textpen_wd;
// lines after list
baseline=baseline-baselineskip-topsep-parsep-partopsep;
real top_following_material = baseline+0.5*textpen_wd;
label("Surrounding environment, following material",(0.5*(pageleftmargin+pagewidth-pagerightmargin),baseline),labelpen);
draw((pageleftmargin,baseline)--(pagewidth-pagerightmargin,baseline),surrounding_environmentpen);
for (int line_no=0; line_no<(num_lines_below-1); ++line_no) {
baseline = baseline-baselineskip;
draw((pageleftmargin,baseline)--(pagewidth-pagerightmargin,baseline),surrounding_environmentpen);
}