anchor.diff:  
   (defmethod counter-join ((obj counter-text) n number-kana counter-kana
                            &aux (digit (mod n 10))
  -                           (head (gethash (char counter-kana 0) *char-class-hash*)))                   
  +                           (head (gethash (char counter-kana 0) *char-class-hash*))
  +                           (digit-opts (assoc digit (digit-opts obj))))
  +  (when digit-opts
  +    (loop for opt in digit-opts
  +       do (case opt
  +            (:g (geminate number-kana))
  +            (:r (rendaku counter-kana))
  +            (:h (rendaku counter-kana :handakuten t))))
  +    (return-from counter-join (call-next-method)))
  +  
     (case digit
       (1 (case head
            ((:ka :ki :ku :ke :ko
  
positive.code:   (args 'counter-tsu "つ" "つ"))
  
  (defclass counter-hifumi (counter-text)
    ((digitset :reader digitset :initarg :digitset)))
  
  (defmethod get-kana ((obj counter-hifumi) &aux (value (number-value obj)))
    (cond
      ((find value (digitset obj))
       (concatenate 'string
                    (case value
                      (1 "ひと")
  
negative.code:    (number :reader number-value)
     (source :reader source :initform nil :initarg :source)
     (ordinalp :reader ordinalp :initform nil :initarg :ordinalp)
     (digit-opts :reader digit-opts :initform nil :initarg :digit-opts
                 :documentation "alist of form (digit opt1 opt2 ...)
      where opt can be :g (geminate) :d (dakuten) :h (handakuten) (only one of :d and :h is meaningful)
      These options are used in counter-join, if digit is present then the usual rules are ignored.
      Empty options are equivalent to simple concatenation.")
     ))
  
  (defgeneric verify (counter unique)
  