Hello Bruno,
A very good observation!
The explanation is that GF parsing and linearization ignores all whitespace, except as separator of tokens.  Hence " " == "  " == "\t" == "\n" == "\t\n  \n\n\t" etc. From this follows that
- In the grammar compiler, an expression of type Str is hence normalized to a list of strings without whitespaces. 
- Linearization, therefore, can never produce specific whitespace characters, but just (by default) single ' ' characters to separate tokens.
- The parser will read as its input a sequence of tokens. 
  - in the GF shell, the "p" command expects the tokens to be separated by whitespace, more precisely, by any sequence defined by the regexp (' '|'\t'|'\n')+   
  - in the C runtime, special tokens such as BIND are inserted in accordance to the grammar, even if no whitespace is given in the input
The recommended way to control the whitespace characters is to encode them by some special tokens and use simple pre- and postprocessing. The ps command of the GF shell gives some support to this. In many applications, the proper way is to use a high level approach to layout, e.g. HTML tags or LaTeX macros.
Regards
  Aarne.