auctex 11.88 の LaTeX-env-label のバグ(?) により、ラベルを自動的に挿入できない

auctex 11.88 の LaTeX-env-label のバグ(?) により、ラベルを自動的に挿入できない

最近、emacs 24.4(win7+mac) で auctex 11.88 を試しています。 今のところとてもいいです!

auctex11.87 を使用していたとき、.emacs emacs ファイルに次の内容が含まれていました (stackexchange のどこかでこれに遭遇しました)

(setq reftex-label-alist
  '(
    ("theorem" ?h "thm:" "~\\ref{%s}" t  ("theorem" "th."))
    ("lemma" ?l "lem:" "~\\ref{%s}" t  ("lemma" "lem." ))
    ("exercise" ?x "ex:" "~\\ref{%s}" t  ("exercise" "ex." ))
    ("question" ?q "ques:" "~\\ref{%s}" t  ("question" "q." ))
    ))

(add-hook 'LaTeX-mode-hook
   (lambda ()
     (LaTeX-add-environments
       '("lemma" LaTeX-env-label)
       '("exercise" LaTeX-env-label)
       '("theorem" LaTeX-env-label)
       '("question" LaTeX-env-label)
       )))

(setq  reftex-insert-label-flags '("s" "ft"))

新しく定義された環境を挿入すると、ラベルが自動的に生成されます。たとえば、 を実行するとC-c C-e exercise RET

\begin{exercise}
  \label{ex:1}
  (cursor here)
\end{exercise}

今、auctex11.88では、私は得ることができる

\begin{exercise}
  (cursor here)
\end{exercise}

C-c (そこに追加するにはさらに実行する必要があります\label{ex:1}

私が使用していた Lisp コードが古くなったかどうかはわかりません。短い部分を実行してみました(LaTeX-env-label "exercise")。auctex11.87 では目的の結果が得られましたが、auctex11.88 では得られませんでした。

アドバイスをお願いします!よろしくお願いします!

ところで、これは本当にバグなのだろうか? メール それとも、auctex11.88で何か他のものを調整する必要がありますか?いくつかの新機能と下位互換性の問題が言及されています メーリングリスト 私はこの件について専門家ではないのですが、誰か詳しく説明してもらえませんか?よろしくお願いします!

答え1

AUCTeX と RefTeX は 2 つの別個の独立したパッケージであり、一方がなくても他方を使用できます。AUCTeX にはラベルと引用の管理に関する機能がいくつかあり、RefTeX の方がこの点では優れています。

RefTeXを誰もが使っているわけではないので、AUCTeX 11.88では、挿入するラベルをユーザーが選択できるように変更されました。この選択はRefTeXとは独立していますが、副作用として、別のAUCTeX(RefTeXではない)変数をカスタマイズする必要がありますLaTeX-label-alistマニュアル

ユーザーオプション:LaTeX ラベルリスト

サポートされている各環境のラベルに使用されるプレフィックスを一覧表示します。

これは、car が環境名であり、cdr がプレフィックスまたは環境を参照するシンボルである alist です。

名前が見つからない場合、または cdr が nil の場合、その環境に対してラベルは自動的に挿入されません。

環境のラベルを自動的に挿入したいがプレフィックスが空の場合は、""対応するエントリの cdr として空の文字列を使用します。

LaTeX-label-alistしたがって、 環境の へのエントリも追加する必要がありますexcercise。 で.emacs、 をadd-hook次のものに置き換えます。

(add-hook
 'LaTeX-mode-hook
 (lambda ()
   (LaTeX-add-environments
    '("lemma" LaTeX-env-label)
    '("exercise" LaTeX-env-label)
    '("theorem" LaTeX-env-label)
    '("question" LaTeX-env-label))
   (add-to-list 'LaTeX-label-alist '("exercise" . "ex:"))))

混乱を避けるために、AUCTeX は を見てラベルを挿入するかどうかを決定しますLaTeX-label-alistが、RefTeX が有効になっている場合、特に が でLaTeX-label-functionある場合reftex-label、ラベルの挿入は RefTeX に転送され、実際に挿入されるラベルは RefTeX 変数 の値によって選択されますreftex-label-alist

exerciseRefTeX ユーザーにとって、エントリの CDR の値はLaTeX-label-alistほとんど役に立ちません。重要なのは、それが有効な文字列であることです。

カスタマイズのポイントは、LaTeX-label-alistRefTeX ユーザーと非 RefTeX ユーザーに対して同じ動作を実現することです。


.emacsわかりやすくするために、テストに使用した最小限のものを以下に示します。

;; Enable RefTeX automatically in AUCTeX buffers.
(autoload 'turn-on-reftex "reftex" "RefTeX Minor Mode" nil)
(add-hook 'TeX-mode-hook
      (lambda ()
        (turn-on-reftex)))
(setq reftex-plug-into-AUCTeX t)

;; RefTeX-related settings.
(setq
 reftex-label-alist
 '(("theorem" ?h "thm:" "~\\ref{%s}" t  ("theorem" "th."))
   ("lemma" ?l "lem:" "~\\ref{%s}" t  ("lemma" "lem." ))
   ("exercise" ?x "ex:" "~\\ref{%s}" t  ("exercise" "ex." ))
   ("question" ?q "ques:" "~\\ref{%s}" t  ("question" "q." )))
 reftex-insert-label-flags '("s" "ft"))

;; AUCTeX-related settings.
(add-hook
 'LaTeX-mode-hook
 (lambda ()
   (LaTeX-add-environments
    '("lemma" LaTeX-env-label)
    '("exercise" LaTeX-env-label)
    '("theorem" LaTeX-env-label)
    '("question" LaTeX-env-label))
   (add-to-list 'LaTeX-label-alist '("exercise" . "ex:"))))

関連情報