anchor.diff:  %% 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) ->
  +
  +strwidth(S, TabWidth) ->
  +    strwidth(S, 0, TabWidth).
  +
  +strwidth([$\t| Cs], N, TabWidth) ->
  +    strwidth(Cs, N - (N rem TabWidth) + TabWidth, TabWidth);
  +strwidth([_| Cs], N,  TabWidth) ->
  +    strwidth(Cs, N + 1, TabWidth);
  +strwidth([], N,_TabWidth) ->
       N.
   
   %% =====================================================================
  
positive.code: %% @see text/1
  %% @see par/2
  
  text_par(S, 0) ->
      par(words(S));
  text_par(S, N) when N > 0 ->
      nest(N, par(words(S), -N));
  text_par(S, N) when N < 0 ->
      par(words(S), -N).
  
  words(S) ->
      words(S, [], []).
  
  words([$\s | Cs], As, Ws) -> words_1(Cs, As, Ws);
  words([$\t | Cs], As, Ws) -> words_1(Cs, As, Ws);
  words([$\n | Cs], As, Ws) -> words_1(Cs, As, Ws);
  words([C | Cs], As, Ws) -> words(Cs, [C | As], Ws);
  words([], [], Ws) -> lists:reverse(Ws);
  words([], As, Ws) -> words_1([], As, Ws).
  
  words_1(Cs, [], Ws) ->
      words(Cs, [], Ws);
  words_1(Cs, As, Ws) ->
      words(Cs, [], [text(lists:reverse(As)) | Ws]).
  
  
  %% =====================================================================
  %% @spec empty() -> document()
  
negative.code: %% Null strings are strings whose "official width" is zero, typically
  %% used for markup that is not supposed to affect the indentation.
  
  
  string(S, TabWidth) ->
      [strwidth(S, TabWidth)| S].
  
  null_string(S) ->
      [0 | S].
  