diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3
index 199321d509c27b38ebc4ac507acfbad53e23cde7..9572ba85b0b828bbaaf2a645781ee18d426961a5 100644
--- a/inc-compilo-index.php3
+++ b/inc-compilo-index.php3
@@ -57,6 +57,7 @@ class Boucle {
 class Champ {
 	var $type = 'champ';
 	var $nom_champ;
+	var $nom_boucle; // seulement si boucle explicite
 	var $cond_avant, $cond_apres; // tableaux d'objets
 	var $fonctions;  // filtre explicites
 	var $etoile;
@@ -80,15 +81,13 @@ class Champ {
 // Si ca reference un champ SQL, on le memorise dans la structure $boucles
 // afin de construire un requete SQL minimale (plutot qu'un brutal 'SELECT *')
 
-function index_pile($idb, $nom_champ, &$boucles) {
+function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
 	global $exceptions_des_tables, $table_des_tables, $tables_principales;
 
-	// Recherche d'un champ dans un etage superieur
 	$i = 0;
-	if ($c=strpos($nom_champ, ':')) {
-		$idbs = substr($nom_champ, 0, $c);
-		$nom_champ = substr($nom_champ, $c+1);
-		while (($idb != $idbs) && $idb) {
+	if ($$explicite) {
+	// Recherche d'un champ dans un etage superieur
+		while (($idb != $explicite) && $idb) {
 			$i++;
 			$idb = $boucles[$idb]->id_parent;
 		}
@@ -159,37 +158,39 @@ function champ_sql($champ, $p) {
 # Retourne une EXPRESSION php 
 function calculer_champ($p) {
 
+	$nom_champ = $p->nom_champ;
+
 	// regarder s'il existe une fonction personnalisee balise_NOM()
-	$f = 'balise_' . $p->nom_champ;
+	$f = 'balise_' . $nom_champ;
 	if (function_exists($f))
 		$p = $f($p);
 
 	else {
 	// regarder s'il existe une fonction standard balise_NOM_dist()
-	$f = 'balise_' . $p->nom_champ . '_dist';
+	$f = 'balise_' . $nom_champ . '_dist';
 	if (function_exists($f))
 		$p = $f($p);
 
 	else {
 	// S'agit-il d'un logo ? Une fonction speciale les traite tous
-	if (ereg('^LOGO_', $p->nom_champ))
+	if (ereg('^LOGO_', $nom_champ))
 		$p = calcul_balise_logo($p);
 
 	else {
 	// On regarde ensuite s'il y a un champ SQL homonyme,
 	// et on definit le type et les traitements
-	$p->code = champ_sql($p->nom_champ, $p);
-	if (($p->code) && ($p->code != '$Pile[0][\''.$p->nom_champ.'\']')) {
+	$p->code = index_pile($p->id_boucle, $nom_champ, $p->boucles, $p->explicite);
+	if (($p->code) && ($p->code != '$Pile[0][\''.$nom_champ.'\']')) {
 
 		// Par defaut basculer en numerique pour les #ID_xxx
-		if (substr($p->nom_champ,0,3) == 'ID_') $p->statut = 'num';
+		if (substr($nom_champ,0,3) == 'ID_') $p->statut = 'num';
 	}
 
 	else {
 	// si index_pile a ramene le choix par defaut, 
 	// ca doit plutot etre un champ SPIP non SQL,
 	// ou ni l'un ni l'autre => on le renvoie sous la forme brute '#TOTO'
-	$p->code = "'#" . $p->nom_champ . "'";
+	$p->code = "'#" . $nom_champ . "'";
 	$p->statut = 'php';	// pas de traitement
 	
 	}}}}
diff --git a/inc-html-squel.php3 b/inc-html-squel.php3
index 9695a474e9a43d0fb29dcd3f8489cb3c60497fa0..0e82016c27750607a8cd32dc38fbda955254afea 100644
--- a/inc-html-squel.php3
+++ b/inc-html-squel.php3
@@ -10,7 +10,7 @@ define("_INC_HTML_SQUEL", "1");
 # pour permettre differentes syntaxes en entree
 
 define(NOM_DE_BOUCLE, "[0-9]+|[-_][-_.a-zA-Z0-9]*");
-define(NOM_DE_CHAMP, "#(((" . NOM_DE_BOUCLE . "):)?([A-Z_]+))(\*?)");
+define(NOM_DE_CHAMP, "#((" . NOM_DE_BOUCLE . "):)?([A-Z_]+)(\*?)");
 define(CHAMP_ETENDU, '\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^]\[)]*)\)([^]\[]*)\]');
 define(PARAM_DE_BOUCLE,'\{[^}]*\}');
 define(TYPE_DE_BOUCLE, "[^)]*");
@@ -73,12 +73,12 @@ function parser_champs($texte) {
 			$result = array_merge($result,
 					      parser_texte(substr($texte, 0, $p)));
 		}
-		$texte = $regs[6];
 
 		$champ = new Champ;
-		$champ->nom_champ = $regs[1];
-		$champ->etoile = $regs[5];
-
+		$champ->nom_boucle = $regs[2];
+		$champ->nom_champ = $regs[3];
+		$champ->etoile = $regs[4];
+		$texte = $regs[5];
 		$result[] = $champ;
 	}
 	if (!$texte)
@@ -123,17 +123,13 @@ function parser_champs_interieurs($texte, $sep, $nested) {
 
 	$i = 0;
 	while (ereg(CHAMP_ETENDU . '(.*)$', $texte, $regs)) {
-		$fonctions = $regs[7];
 		$champ = new Champ;
-		$champ->nom_champ = $regs[2];
-
-		// installer les processeurs standards (cf inc-balises.php3)
-
-		$champ->etoile = $regs[6];
-
+		$champ->nom_boucle = $regs[3];
+		$champ->nom_champ = $regs[4];
+		$champ->etoile = $regs[5];
 		$champ->cond_avant = parser_champs_exterieurs($regs[1],$sep,$nested);
-		$champ->cond_apres = parser_champs_exterieurs($regs[8],$sep,$nested);
-
+		$champ->cond_apres = parser_champs_exterieurs($regs[7],$sep,$nested);
+		$fonctions = $regs[6];
 		if ($fonctions) {
 			$fonctions = explode('|', ereg_replace("^\|", "", $fonctions));
 			foreach($fonctions as $f) $champ->fonctions[]= $f;
@@ -153,7 +149,7 @@ function parser_champs_interieurs($texte, $sep, $nested) {
 		    }  
 		  }
 		$result[$i++] = $champ;
-		$texte = $regs[9];
+		$texte = $regs[8];
 		
 	}
 	if ($texte) { $result[$i++] = $texte;}