diff --git a/doc/family/simple.md b/doc/family/simple.md
index c0ce2d330..ac3e9cdc7 100644
--- a/doc/family/simple.md
+++ b/doc/family/simple.md
@@ -44,7 +44,7 @@ En plus de la description, il est possible de préciser une aide complémentaire
## Mode de la famille
-Le [mode](../mode.md) par défaut d'une famille correspond au [mode](../mode.md) le plus petite des variables ou des familles qui sont contenu dans cette famille.
+Le [mode](../mode.md) par défaut d'une famille correspond au [mode](../mode.md) du mode le plus petit entre la famille parente, les variables enfants ou des familles enfants qui sont contenu dans cette famille.
Changer le [mode](../mode.md) d'une famille permet de définir le [mode](../mode.md) par défaut des variables ou des familles inclusent dans cette famille.
diff --git a/doc/variable/leadership.md b/doc/variable/leadership.md
index 90033c679..1e4ca5cd7 100644
--- a/doc/variable/leadership.md
+++ b/doc/variable/leadership.md
@@ -8,6 +8,8 @@ Une variable meneuse est une [variable](simple.md) qui est obligatoirement de ty
Une variable meneuse peut être obligatoire.
+Le [mode](../mode.md) par défaut correspond au plus petit mode définit par l'utilisateur des variables suiveuses.
+
## Variable suiveuse
Une variable suiveuse est une variable donc la longueur n'est pas déterminé par elle-même, mais est identique à celle de la variable meneuse dont elle dépend.
diff --git a/doc/variable/simple.md b/doc/variable/simple.md
index c539e422b..b481d51d8 100644
--- a/doc/variable/simple.md
+++ b/doc/variable/simple.md
@@ -74,18 +74,6 @@ Pour définir une variable à valeur multiple :
```
-## Mode de la variable
-
-Le [mode](../mode.md) par défaut d'une variable correspond au [mode](../mode.md) de la [famille](../family/README.md).
-
-Si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut.
-
-Pour définir le [mode](../mode.md) :
-
-```
-
-```
-
## Variable invisible
Il est possible de cacher une variable.
@@ -236,3 +224,19 @@ Il est possible de préciser plusieurs valeurs avec le séparateur "|" :
```
```
+
+## Mode de la variable
+
+Le [mode](../mode.md) par défaut d'une variable correspond au [mode](../mode.md) de la [famille](../family/README.md).
+
+Cas particuliers :
+
+- une variable à valeur automatiquement modifiée ou une variable en lecture seule automatique est par défaut en mode "basic".
+- si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut.
+- une variable obligatoire sans valeur par défaut (calculer ou non) aura le mode "basic".
+
+Pour définir le [mode](../mode.md) :
+
+```
+
+```
diff --git a/src/rougail/annotator/family.py b/src/rougail/annotator/family.py
index 856d7a1e8..eec0c4ffc 100644
--- a/src/rougail/annotator/family.py
+++ b/src/rougail/annotator/family.py
@@ -145,7 +145,8 @@ class FamilyAnnotator(Walk):
(variable.auto_save is True or variable.auto_freeze is True):
self._set_auto_mode(variable, modes_level[0])
# mandatory variable without value is a basic variable
- elif variable.mandatory is True and \
+ elif not self._has_mode(variable) and \
+ variable.mandatory is True and \
not hasattr(variable, 'default') and \
not hasattr(variable, 'default_multi'):
self._set_auto_mode(variable, modes_level[0])
@@ -170,11 +171,12 @@ class FamilyAnnotator(Walk):
msg = f'leader/followers "{follower.name}" could not be auto_freeze'
raise DictConsistencyError(_(msg), 30, leadership.xmlfiles)
if leader_mode is not None:
- # leader's mode is minimum level
if modes[leader_mode] > modes[follower.mode]:
if self._has_mode(follower) and not self._has_mode(leadership.variable[0]):
+ # if follower has mode but not the leader
self._set_auto_mode(leadership.variable[0], follower.mode)
else:
+ # leader's mode is minimum level
if self._has_mode(follower):
msg = _(f'the follower "{follower.name}" is in "{follower.mode}" mode '
f'but leader have the higher mode "{leader_mode}"')
@@ -219,7 +221,6 @@ class FamilyAnnotator(Walk):
def _change_variable_mode(self,
variable,
family_mode: str,
- is_follower=False,
) -> None:
# none basic variable in high level family has to be in high level
if modes[variable.mode] < modes[family_mode]:
@@ -233,13 +234,10 @@ class FamilyAnnotator(Walk):
leadership,
family_mode: str,
) -> None:
- is_follower = False
for follower in leadership.variable:
self._change_variable_mode(follower,
family_mode,
- is_follower,
)
- is_follower = True
leadership.variable[0].mode = None
def dynamic_families(self):