スキップしてメイン コンテンツに移動

mozc.elでの日本語入力における句読点の自動修正

通常の日本語の文章を書くときの句読点は「、」や「。」を使うけれど、数式を含む文章を書くときの句読点は「,」と「.」を使いたい派です。

10年くらいほど前にこの機能を実現するpunch.elというEmacsのパッケージを配布されている方がいて、便利に使わせて頂いてました。

このpunch.elはMacやWindowsのOSのIMEを利用した場合には上手く動くものの、mozc.elを利用した入力には対応していませんでした。

mozc.elで同じ機能を実現するelispをGrokにお願いして出力してもらったところ、ほぼそのまま利用できるコードを生成してくれました。

mozc-handle-event関数の実行前後の文字列入力位置を記録しておき、その範囲内の句読点をmozc-handle-event実行後に書き換えるという操作をするコードになっています。以下の内容をpunct-mozc.elという名前でEmacs Lispのライブラリに保存します。
(defgroup punct-mozc nil
  "Punctuation switcher in mozc"
  :group 'punct-mozc
  :prefix "punct-mozc-")

(defun punct-mozc-lighter ()
  " Punct")

(defun punct-mozc-replace-punctuation (beg end)
  "挿入された範囲内の句読点を変換する関数。
BEG と END は挿入された文字列の開始点と終了点を表す。"
  (interactive)
  (when punct-mozc-mode
    (save-excursion
      (goto-char (1- beg))
      (while (< (point) end)
        (let ((char (char-after)))
;	  (message "Position: %d, Char: %c" (point) char)
          (cond
           ((= char ?、)
            (delete-char 1)
            (insert ?,))
           ((= char ?。)
            (delete-char 1)
            (insert ?.))
           (t
            (forward-char 1))))))
    (goto-char end)))
;  (message "Range: %d to %d" beg end))

(defvar punct-mozc-insert-start nil
  "挿入開始位置を記録する変数。")

(defun punct-mozc-before-mozc-handle-event (&rest _)
  "mozc-handle-event の前に挿入開始位置を記録する。"
  (when punct-mozc-mode
    (setq punct-mozc-insert-start (point))))

(defun punct-mozc-after-mozc-handle-event (&rest _)
  "mozc-handle-event の後に挿入された範囲の句読点を変換する。"
  (when (and punct-mozc-mode punct-mozc-insert-start)
    (let ((insert-end (point)))
      (punct-mozc-replace-punctuation punct-mozc-insert-start insert-end))
    (setq punct-mozc-insert-start nil)))

(advice-add 'mozc-handle-event :before #'punct-mozc-before-mozc-handle-event)
(advice-add 'mozc-handle-event :after #'punct-mozc-after-mozc-handle-event)

(define-minor-mode punct-mozc-mode
  "Punct mozc mode."
  :global nil
  :lighter (:eval (punct-mozc-lighter)))

(provide 'punct-mozc)
init.elには次のように設定しています。yatex-modeで読み込む設定です。
;;句読点を全角カンマ、全角ピリオドに統一
(require 'punct-mozc)
(add-hook 'yatex-mode-hook 'punct-mozc-mode)

このブログの人気の投稿

OpenCv-PythonとpdfLaTeXで自炊pdfファイルの位置調整

この記事は TeX & LaTeX Advent Calendar 2021 の11日目の記事です. 10日目は t_kemmochi さん,12日目は yukishita さんです.   動機  書籍の自炊にブックエッジスキャナーの AvisionのFB2280E を利用しています。書籍を裁断せずに1ページずつスキャンを行うため、本の開き具合などの要因で本の序盤、中盤、終盤で得られるスキャン画像の位置ずれが大きくなります。以前からpdfLaTeXを利用して位置調整をしていたのですが、OpenCvを利用して自動化できそうだったので試してみました。 やること 本記事では、pdf化した文書画像の版面(文字の印刷された部分の意味で使います)を半自動的に計算してpdfの画像の位置調整をするために、OpenCvとpdfLaTeXを利用する方法を解説します。手順としては Pythonの画像認識用ライブラリであるOpenCvを利用して版面を計算する。 テンプレートエンジンライブラリのJinja2を使って画像のバウンディングボックスなどを記述したLaTeXファイルを作成する。 pdfLaTeXでpdfを読み込み、位置の調整されたpdfを作成する。 という流れになっています。作業環境としては、 Visual Studio CodeをRemove - WSL拡張機能と併用 しています。PythonやそのライブラリはWSL上のUbuntuにインストールし、他にもpdfファイルを他のファイル形式にするためにpoppler-utilsなんかもインストールしました。 参考記事 OpenCvを利用した文書画像のレイアウト解析については ブログSomething Like Programming内の記事 Document Layout Analysis githubリポジトリ rbaguila/document-layout-analysis OpenCv-Pythonチュートリアル を参考にしました。 pdfLaTeXがpdf加工に使えるという話と、pdfpagesパッケージの存在は doraTeXさんのブログTeX Alchemist Onlineの記事 pdfTeX による見開きPDFの結合・分割 で知ったように思います。 画像pdfをpdfpagesで取り込む ま...

定理環境をmdframedからtcolorboxへ乗り換え

追記:2016/05/02 以前に掲載していた定理環境のマクロでは、カウンターが変化しないような記述をしてしまっていたので、全面的に書き換えました。 追記:2016/06/06 tcolorboxのオプションを追加できるように書き直しをしました( tcolorboxを使った定理環境 )。 LaTeXの話です。 これまで定理環境の修飾にmdframed.styを利用してきました。 mdframedを用いた定理環境の修飾(platex+dvipdfmx, tikz) しかし上の投稿で用いた記述をしていると、定理環境がページの下部にきたとき、まれに以下のように環境が新しいページに送られてしまい変なところで改ページが起こります。 TeX-LaTeX Stack Exchangeでも同様の不具合が報告されていて、mdframed.styの作者が回答して解決しているようなのですが、私の場合は上手く行きませんでした。タイトル部分の位置の計算に問題があるようです。 そういう訳で、mdframed.styよりも高い表現力を持つtcolorbox.styには興味を持っていました。今回は、mdframed.styで記述していた部分を、ソースの変更無しにtcolorboxで置き換えてみたので、その紹介をします。 tcolorbox.styで置き換えた結果は次のようになりました。 見た目はほとんど変わっていません。中のboxは別のtcolorbox環境です。 この定理環境のソースコードは次のようになります。 \usepackage{tcolorbox} \usepackage{varwidth} \tcbuselibrary{breakable} \tcbuselibrary{skins} \definecolor{frameinnercolor}{RGB}{49,44,44} \newcounter{theorem} \numberwithin{theorem}{section}% numberwithinはamsmath.styで定義されている \newenvironment{theorem}[2][]{% %#1 = タイトル, #2 = 定理環境名 \refstepcounter{theorem}% \newtcolorbox{...

定理を再掲したときに定理番号も揃える(amsmathのtagと似た挙動の定理環境を作る).

LaTeXの話題です.amsmath.styで定義されているtagコマンドは,数式環境の式番号部分を自由な文字列で置き換えることができるようになっています.下に例を挙げます. この画像を生成するLaTeXのコードは次のようになります. \documentclass[a4paper,dvipdfmx,uplatex]{jsarticle} \usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true,% ,colorlinks=true,linkcolor=blue]{hyperref}% \usepackage{showkeys} \usepackage{amsmath} \numberwithin{equation}{section} \begin{document} \section{amsmath.styに含まれるtagコマンドの挙動} \begin{equation} \label{eq:euler} e^{i\theta}=\cos\theta +i\sin\theta \end{equation} \eqref{eq:euler} \section{amsmath.styに含まれるtagコマンドの挙動の検証} \begin{equation} \label{eq:euler2} \tag{\ref{eq:euler}} e^{i\theta}=\cos\theta +i\sin\theta \end{equation} \eqref{eq:euler2} \end{document} 最初のequation環境にeq:eulerというlabelをつけ,第2のequation環境ではtagコマンドを使って数式番号部分に¥ref{eq:euler}と書くことで,実際に表示される式番号が第1のequation環境のものと同じになっています.この第2のequation環境にはeq:euler2というlabelを付けており,これを¥eqref{eq:euler2}と参照すると表示される番号は第1のequation環境のものであるにも関わらず,リンクをクリックすると第2のequation環境にジャンプします. このような現象が起こるのは,上記のファイルをタイプセット...