anchor.diff:  %% @see null_text/1
   %% @see text_par/2
   
  +
   text(S) ->
  -    mktext(string(S)).   % convert to internal representation
  +    text(S, 8).
  +
  +text(S, TabWidth) ->
  +    mktext(string(S, TabWidth)).   % convert to internal representation
   
   %% This function is used internally only, and expects a string on
   %% the internal representation:
  
positive.code: %% not really nice to give to a prettyprinter, and this seems to be the
  %% best interpretation.
  
  strwidth(S) ->
      strwidth(S, 0).
  
  strwidth([$\t | Cs], N) ->
      strwidth(Cs, N - (N rem 8) + 8);
  strwidth([_ | Cs], N) ->
      strwidth(Cs, N + 1);
  strwidth([], N) ->
      N.
  
  %% =====================================================================
  
negative.code: %% @see text/1
  %% @see par/2
  
  
  text_par(S,0) ->
      text_par(S,0,8);
  text_par(S,N) when N>0 ->
      text_par(S,N,8);
  text_par(S,N) when N<0 ->
      text_par(S,N,8).
  
  text_par(S, 0, TabWidth) ->
      par(words(S, TabWidth));
  text_par(S, N, TabWidth) when N > 0 ->
      nest(N, par(words(S, TabWidth),  -N));
  text_par(S, N, TabWidth) when N < 0 ->
      par(words(S, TabWidth),  -N).
  
  words(S, TabWidth) ->
      words(S, [], [], TabWidth).
  
  words([$\s| Cs], As, Ws,TabWidth) -> 
      words_1(Cs, As, Ws, TabWidth);
  words([$\t| Cs], As, Ws,TabWidth) -> 
      words_1(Cs, As, Ws, TabWidth);
  words([$\n| Cs], As, Ws, TabWidth) -> 
      words_1(Cs, As, Ws, TabWidth);
  words([C| Cs], As, Ws,  TabWidth) -> 
      words(Cs, [C| As], Ws, TabWidth);
  words([], [], Ws,  _TabWidth) -> 
      lists:reverse(Ws);
  words([], As, Ws, TabWidth) -> 
      words_1([], As, Ws, TabWidth).
  
  words_1(Cs, [], Ws, TabWidth) ->
      words(Cs, [], Ws,  TabWidth);
  words_1(Cs, As, Ws, TabWidth) ->
      words(Cs, [], [text(lists:reverse(As), TabWidth)| Ws], TabWidth).
  
  %% =====================================================================
  %% @spec empty() -> document()
  