JLuc wrote:
Mais la solution préconisée sur ce forum :
recopier les boucles incluses, à vide, dans le fichier appelant,
n'est pas du tout satisfaisante...
C'est bien la seule solution 
Alors comment faire pour que différents fichiers inclus
puissent utiliser une même liste de {doublons}?
j'ai l'impression qu'on ait déjà discutté cela la semaine dernière...
les fichiers inclus ont un cache différent, un temps de recalcul potentiellement différent donc. A ce moment là, c'est un peu ingérable cette question de doublons partagés entre les inclusions.
Par exemple, si tu as un squelette principal qui calcul des doublons et se recalcul toutes les heures, mais que le squelette inclus se recalcul tous les 10 jours, alors les doublons utilisés au calcul de l'inclusion ne sont plus les mêmes...
Il faudrait donc recalculer l'inclusion en même temps que le squelette qui l'inclus. Du coup, côté perf du cache, ça revient au même que d'avoir un temps de recalcul identique, et donc, que d'avoir la boucle incluse directement dans le squelette.
Côté modularisation du squelette, c'est effectivement pratique de mettre des blocs de code dans un inclure, mais avoir des squelettes inclus qui se comportent différement en fonction d'où ils sont inclus (si le doublons etait passé par exemple) devient un peu difficile à gerer (à mon avis) puisqu'on ne sait plus exactement ce qu'on va inclure.
Je pense donc que le choix d'extraire la boucle de l'inclusion pour ne garder que le bloc statique dedans est un meilleur choix côté "propreté" de la noisette 
Enfin, voilà l'idée. Si tu veux transferer les doublons d'un squelette à un autre, tu peux jouer du set, eval et get j'imagine:
<BOUCLE_makedbl(ARTICLES) {!doublons blabla}>
#EVAL{array_push($doublons_blabla,#ID_ARTICLE)}
</BOUCLE_makedbl>
<INCLURE{fond=truc}{doublons=[(#GET{doublons_blabla}|toregexp)]}>
et dans le inclure:
<BOUCLE_art(ARTICLES) {id_article !== #ENV{doublons}}>
...
et en filtre dans mes_fonctions:
function toregexp($array) {
return '('.join('|',$array).')';
}
Pierre
PS: c'est juste un debut de code, je suis sûr qu'il y a un ou deux details qui manquent 