Este equipo de trabajo ha estado horas investigando soluciones a tus preguntas, te ofrecemos la respuesta por eso nuestro deseo es serte de mucha ayuda.
Solución:
Una implementación más simple con expl3
. Se pueden agregar interfaces adicionales para extraer elementos de listas o recorrerlos.
documentclassarticle
%usepackagexparse % not needed with LaTeX 2020-10-01 or later
ExplSyntaxOn
%% first an interface to manage clists
NewDocumentCommandclistsetmm
clist_clear_new:c l__cislist_#1_clist
clist_set:cn l__cislist_#1_clist #2
NewDocumentCommandclistcomplementmmO1m
% #1 = list to set, #2 = list to take from, #3 = start, #4 = end
clist_clear_new:c l__cislist_#1_clist
int_step_inline:nnn #3 #4
clist_if_in:cnF l__cislist_#2_clist ##1
% if the current number doesn't belong to the second list, add to the first
clist_put_right:cn l__cislist_#1_clist ##1
NewDocumentCommandclistusemm
% #1 = list, #2 = separator
clist_use:cn l__cislist_#1_clist #2
ExplSyntaxOff
begindocument
clistsetfirst25, 76,38, 19, 58,29,88,44, 22, 11, 34, 17
clistcomplementsecondfirst25
clistcomplementthirdfirst[18]36
clistusesecond,
clistusethird--
enddocument
los clistcomplement
El comando tiene un tercer argumento opcional para establecer el punto de partida (predeterminado 1).
Después Main
está definido, creo 25 macros z1
, z2
, … que contiene los números 1
, 2
…
Entonces leí Main
en un array lista mynums
.
Luego configuré un bucle, y para cada elemento en el mynums
array, si es menor que 26, redefiní el correspondiente z?
valor a nada. Entonces, por ejemplo, si el mynums
array valor fueron 11
Yo redefiní z11
a nada.
Luego, recorro la lista revisada de z1
, z2
, … y concatenar cada valor a un string newlist
, agregando una coma entre los elementos de la lista, según sea necesario.
El resultado final, por tanto, reside en newlist
.
EDITADO para ponerlo todo en un macro getmissingnumbers
.
documentclassarticle
usepackagelistofitems,pgffor
makeatletter
newcommandgetmissingnumbers[1]%
foreachz in1,...,25%
expandaftergdefcsname zzexpandafterendcsnameexpandafterz%
%
readlist*mynums#1%
foreachitemzinmynums[]%
ifnumz<26relax
expandaftergdefcsname zzendcsname%
fi
%
gdefnewlist%
foreachz in1,...,25%
ifrelaxcsname zzendcsnamerelaxelse
ifrelaxnewlistrelaxelse[email protected]
@macronewlist,fi
expandafter[email protected]@macroexpandafternewlistexpandafter%
csname zzendcsname%
fi
%
makeatother
begindocument
defMain25, 76,38, 19, 58,29,88,44, 22, 11, 34, 17
getmissingnumbersMain
newlist
enddocument
A continuación se proporciona una macro llamado getmissingelements
.
getmissingelements
tomará dos argumentos obligatorios seguidos de un argumento opcional que especifica el rango de números para su lista (por defecto es 1-25
).
Los dos argumentos obligatorios son los macro en el que se debe almacenar el resultado y la lista principal.
También tiene una variante destacada que expandirá la lista una vez (para que pueda usar Main
sin la necesidad de expandafter
eso).
Funciona estableciendo primero una secuencia para contener la lista proporcionada, luego recorre el rango de números enteros y verifica si el número entero está en la secuencia. Si no es así, ese entero se agrega a una lista temporal separada por comas. Después de recorrer los números enteros, el usuario proporcionó macro se establecerá en el contenido de la lista separada por comas. Todo excepto la asignación final al usuario especificado macro se realiza localmente en grupo.
documentclass[]article
ExplSyntaxOn
NewDocumentCommand getmissingelements s m m >SplitArgument1-O1-25
IfBooleanTF #1
cis_get_missing_elements:Nnno
cis_get_missing_elements:Nnnn
#2 #4 #3
msg_new:nnn cis missing-value Missing~value.~Aborting!
cs_new_protected:Npn cis_get_missing_elements:Nnnn #1#2#3#4
tl_if_novalue:nTF #3
msg_error:nn cis missing-value
group_begin:
seq_clear:N l_tmpa_seq
clist_clear:N l_tmpa_clist
seq_set_from_clist:Nn l_tmpa_seq #4
int_step_inline:nnn #2 #3
seq_if_in:NnF l_tmpa_seq ##1
clist_put_right:Nn l_tmpa_clist ##1
exp_args:NNNV
group_end:
cs_set:Npn #1 l_tmpa_clist
cs_generate_variant:Nn cis_get_missing_elements:Nnnn Nnno
ExplSyntaxOff
defMain0,1,2,3,4,5, 10,11, 20,21
begindocument
getmissingelementscistmp25, 76,38, 19, 58,29,88,44, 22, 11, 34, 17
cistmp
getmissingelements*cistmpMain
cistmp
% braces around `-2' to hide the minus from the argument splitting
getmissingelements*cistmpMain[-2-7]
cistmp
enddocument
Si crees que te ha sido de provecho nuestro artículo, nos gustaría que lo compartas con otros seniors de este modo contrubuyes a dar difusión a nuestra información.