TeX - LaTeX Asked on August 17, 2021
I would like to have macro that given splits the text that occurs before a given item count and after a given item count. That is TypesetPartialList[2]{MyList}
should typese only the first two items in the list, and the starred variant TypesetPartialList*[2]{MyList}
should typeset items except the first two items.
The desired output from the MWE below is
TypesetPartialList
.TypesetPartialList
will stricly be a single list.documentclass{article}
usepackage{enumitem}
usepackage{xcolor}
usepackage{xparse}
newcommand{MyList}{%
textcolor{magenta}{This is the text before the list.}
begin{itemize}
item
This is the textcolor{red}{first} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{red}{second} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{blue}{third} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{blue}{fourth} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{blue}{fifth} item of the list.
There is some additional text so that it occupies at least two lines.
end{itemize}%
textcolor{magenta}{This is the text after the list.}%
}%
NewDocumentCommand{TypesetPartialList}{%
s% #1 = star means to typeset items AFTER item number in #2
O{-1}% #2 = item number to split the list at
%% Ex. TypesetPartialList{-1}{<list>} typsets ALL items
%% TypesetPartialList{2}{<list>} typsets ONLY items 1 and 2
%% TypesetPartialList*{2}{<list>} typsets ONLY items 3 and after
m% #3 = list to split
}{%
#3%
}%
begin{document}
noindenttextbf{First Two Items:}par
TypesetPartialList[2]{MyList}
medskippar
noindenttextbf{Skipping First Two Items:}par
TypesetPartialList*[2]{MyList}
end{document}
It would be much simpler if you remove the text before and after and also the begin{itemize}
and end{itemize}
tags which you can reinsert when you want to typeset and don't really belong to the list.
I'm not sure what's the purpose of the texts before and after and when they should be output, so I propose a key-value interface for printing them.
documentclass{article}
usepackage{enumitem}
usepackage{xcolor}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{definelist}{ m O{} +m }
{% #1 = list name
% #2 = key-value list
% #3 = list
grill_lists_define:nnn { #1 } { #2 } { #3 }
}
NewDocumentCommand{printlist}{ s O{} m O{2} }
{
IfBooleanTF { #1 }
{
grill_lists_print:nnnn {#4+1} {seq_count:c{ l_grill_lists_#3_seq }} { #3 } { #2 }
}
{
grill_lists_print:nnnn {1} {#4} { #3 } { #2 }
}
}
cs_generate_variant:Nn seq_set_split:Nnn { c }
cs_generate_variant:Nn seq_pop_left:NN { c }
keys_define:nn { grill/lists }
{
pre .bool_set:N = l__grill_lists_pre_bool,
post .bool_set:N = l__grill_lists_post_bool,
pre .default:n = true,
post .default:n = true,
}
cs_new_protected:Nn grill_lists_define:nnn
{
prop_clear_new:c { l_grill_lists_#1_prop }
prop_set_from_keyval:cn { l_grill_lists_#1_prop } { type=itemize, color={.}, #2 }
seq_clear_new:c { l_grill_lists_#1_seq }
seq_set_split:cnn { l_grill_lists_#1_seq } { item } { #3 }
seq_pop_left:cN { l_grill_lists_#1_seq } l_tmpa_tl % discard the empty first item
}
cs_new_protected:Nn grill_lists_print:nnnn
{
group_begin:
keys_set:nn { grill/lists } { #4 }
bool_if:NT l__grill_lists_pre_bool
{
textcolor{ prop_item:cn { l_grill_lists_#3_prop } { color } }
{
prop_item:cn { l_grill_lists_#3_prop } { pre }
}
}
begin{ prop_item:cn { l_grill_lists_#3_prop } { type } } % itemize or ...
int_step_inline:nnn { #1 } { #2 } { item seq_item:cn { l_grill_lists_#3_seq } { ##1 } }
end{ prop_item:cn { l_grill_lists_#3_prop } { type } } % itemize or ...
bool_if:NT l__grill_lists_post_bool
{
textcolor{ prop_item:cn { l_grill_lists_#3_prop } { color } }
{
prop_item:cn { l_grill_lists_#3_prop } { post }
}
}
group_end:
}
ExplSyntaxOff
definelist{MyList}[
color=magenta,
pre={This is the text before the list.},
post={This is the text after the list.},
]{
item
This is the textcolor{red}{first} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{red}{second} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{blue}{third} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{blue}{fourth} item of the list.
There is some additional text so that it occupies at least two lines.
item
This is the textcolor{blue}{fifth} item of the list.
There is some additional text so that it occupies at least two lines.
}
begin{document}
noindenttextbf{First Two Items:}par
printlist{MyList}
medskip
noindenttextbf{Skipping First Two Items:}par
printlist*[pre,post]{MyList}
medskip
noindenttextbf{First Three Items:}par
printlist[pre]{MyList}[3]
medskip
noindenttextbf{Skipping First Three Items:}par
printlist*[post]{MyList}[3]
end{document}
The options are stored in a property list to be used at print time. The list is split at item
which is then inserted back at print time.
Answered by egreg on August 17, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP