WindowsとYaTeXで日本語ファイル名が使えない

WindowsとYaTeXで日本語ファイル名が使えない

- 土屋 勝 の投稿
返信数: 6

Windows 10/11にGNU Emacs ,YaTeXを入れています。Emacsを28にしたところ日本語ファイル名のTeXファイルをCtrl+C,T,Dでタイプセットしようとするとエラーが出るようになりました。と思ったら,Emacs 26.3に戻しても同じ症状です。


Call `platex テスト.tex'

This is e-pTeX, Version 3.141592653-p4.0.0-220214-2.6 (utf8.sjis) (TeX Live 2022) (preloaded format=platex)

 restricted \write18 enabled.

entering extended mode

! I can't find file `郢昴 縺帷ケ昴 tex'.

<*> 郢昴 縺帷ケ昴 tex

                 

(Press Enter to retry, or Control-Z to exit)

Please type another input file name:  

ここで「テスト」と入力すればタイプセットが進行します。


コマンドプロンプトで

latex テスト

とすれば

platex テスト.tex

This is e-pTeX, Version 3.141592653-p4.0.0-220214-2.6 (utf8.sjis) (TeX Live 2022) (preloaded format=platex)

 restricted \write18 enabled.

entering extended mode

(./テスト.tex(guessed encoding: UTF-8 = utf8)

pLaTeX2e <2021-11-15> (based on LaTeX2e <2022-06-01> patch level 5)

L3 programming layer <2022-08-05>

(c:/texlive/2022/texmf-dist/tex/platex/jsclasses/jsarticle.cls(guessed encoding: UTF-8 = utf8)

Document Class: jsarticle 2021/06/28 jsclasses (okumura, texjporg)

(c:/texlive/2022/texmf-dist/tex/platex/jsclasses/jslogo.sty))

(c:/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-dvips.def)

(./テスト.aux) [1] (./テスト.aux) )

Output written on テスト.dvi (1 page, 340 bytes).

Transcript written on テスト.log.

と正しく実行されます。

init.elは

(set-language-environment "Japanese")

(set-default-coding-systems 'utf-8)

(prefer-coding-system 'utf-8)

(setq inhibit-startup-screen t)

;;

;; YaTeX

;;

(add-to-list 'load-path "~/.emacs.d/yatex")

(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)

(setq auto-mode-alist

      (append '(("\\.tex$" . yatex-mode)

                ("\\.ltx$" . yatex-mode)

                ("\\.cls$" . yatex-mode)

                ("\\.sty$" . yatex-mode)

                ("\\.clo$" . yatex-mode)

                ("\\.bbl$" . yatex-mode)) auto-mode-alist))

(setq tex-command "platex")

(setq dvi2-command "SumatraPDF")

(setq dviprint-command-format "dvipdfmx %s")

(setq bibtex-command "latexmk -e \"$latex=q/uplatex %O -kanji=utf8 -no-guess-input-enc -synctex=1 %S/\" -e \"$bibtex=q/upbibtex %O %B/\" -e \"$biber=q/biber %O --bblencoding=utf8 -u -U --output_safechars %B/\" -e \"$makeindex=q/upmendex %O -o %D %S/\" -e \"$dvipdf=q/dvipdfmx %O -o %D %S/\" -norc -gg -pdfdvi")

(setq makeindex-command "latexmk -e \"$latex=q/uplatex %O -kanji=utf8 -no-guess-input-enc -synctex=1 %S/\" -e \"$bibtex=q/upbibtex %O %B/\" -e \"$biber=q/biber %O --bblencoding=utf8 -u -U --output_safechars %B/\" -e \"$makeindex=q/upmendex %O -o %D %S/\" -e \"$dvipdf=q/dvipdfmx %O -o %D %S/\" -norc -gg -pdfdvi")

(setq dvi2-command "rundll32 shell32,ShellExec_RunDLL SumatraPDF -reuse-instance")

(setq tex-pdfview-command "rundll32 shell32,ShellExec_RunDLL SumatraPDF -reuse-instance")

(defun fwdsumatrapdf-forward-search ()

  (interactive)

  (progn

    (process-kill-without-query

     (start-process

      "fwdsumatrapdf"

      nil

      "fwdsumatrapdf"

      (expand-file-name

       (concat (file-name-sans-extension (or YaTeX-parent-file

                                             (save-excursion

                                               (YaTeX-visit-main t)

                                               buffer-file-name)))

               ".pdf"))

      (buffer-name)

      (number-to-string (save-restriction

                          (widen)

                          (count-lines (point-min) (point))))))))


(add-hook 'yatex-mode-hook

          '(lambda ()

             (define-key YaTeX-mode-map (kbd "C-c f") 'fwdsumatrapdf-forward-search)))


(add-hook 'yatex-mode-hook

          '(lambda ()

             (auto-fill-mode -1)))


;;

;; RefTeX with YaTeX

;;

;(add-hook 'yatex-mode-hook 'turn-on-reftex)

(add-hook 'yatex-mode-hook

          '(lambda ()

             (reftex-mode 1)

             (define-key reftex-mode-map (concat YaTeX-prefix ">") 'YaTeX-comment-region)

             (define-key reftex-mode-map (concat YaTeX-prefix "<") 'YaTeX-uncomment-region)))


;;  (defun string-to-int (string &optional base)

;;    (string-to-number string base))

です。

土屋 勝 への返信

Re: WindowsとYaTeXで日本語ファイル名が使えない

- はやて (h20y6m) の投稿

YaTeXもEmacsも分かりませんが……

「郢昴 縺帷ケ昴 」というのはおそらく「テスト」を UTF-8でエンコード⇒Shift_JISとしてデーコード⇒UTF-8でエンコード⇒Shift_JISとしてデーコード したものです。

YaTeXがplatexを起動するときのコマンドラインがUTF-8エンコードされているのではないでしょうか?

(set-default-coding-systems 'utf-8)
(prefer-coding-system 'utf-8)

とありますが『Emacs における日本語文字コードの設定 | プログラマーズ雑記帳』によるとWindowsでprefer-coding-systemにShift-JIS以外を設定する場合は

(prefer-coding-system 'utf-8)
(set-file-name-coding-system 'cp932)
(set-keyboard-coding-system 'cp932)
(set-terminal-coding-system 'cp932)

のようにファイル名やキーボードをcp932に変更する必要があるようです。

はやて (h20y6m) への返信

Re: WindowsとYaTeXで日本語ファイル名が使えない

- 土屋 勝 の投稿
コメントありがとうございます
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(prefer-coding-system 'utf-8)
(set-file-name-coding-system 'cp932)
(set-keyboard-coding-system 'cp932)
(set-terminal-coding-system 'cp932)
にしても日本語ファイル名だとエラーになります
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(prefer-coding-system 'utf-8)
(set-file-name-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
でも同じく。この状態で
Windowsの[設定]-[時刻と言語]-[言語と地域]-[管理用の言語の設定]-[システムロケールの変更]-[ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用]
にチェックを付けてWindowsを再起動したところ,Emacs+YaTeXで日本語ファイル名でもタイプセットできました。
type hoge.tex
でUTF-8のファイルも正しく表示されたので,問題無さそうです。
土屋 勝 への返信

Re: WindowsとYaTeXで日本語ファイル名が使えない

- 和田 勇 の投稿
emacs は主に macOS で gui で利用しているのですが、
windows に scoop で emacs28 を入れて検証してみました。

-「Windowsの[設定]→...[ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用]」

この設定は「ベータ」であることを認識して使ってくださいね。
この設定をすると chcp は 65001 になっています。

- (set-language-environment "Japanese")(set-file-name-coding-system..) 他の設定について

ちょっと前まではこれらの設定が必要でしたが、
最近はOS 情報などから自動導出しているようで
この設定は不要になっています。
記憶は定かではないのですが、二、三年前に知り、
今は (set-language-environment "Japanese")だけにしています。

 少なくとも emacs 28 では何も設定しなくても良いと言っても過言ではないと思います。
 敢えて設定するとすれば「(set-language-environment "Japanese")」だけだと思います。
(ファイルの内部コードを euc とか sjis とかにする場合は要調整です。)

一応土屋さんの yatex に関する設定を取り込んで「テスト.tex」をコンパイルしたときに
 文字化けしないのは確認しています。

- 試しに上記のコマンド類に関するもののデフォルト値を init.el を空にして追ってみました。

- file-name-coding-system --> nil
nil の場合は default-file-name-coding-system の値で
windows は cp932 となっています。

- keyboard-coding-system --> ‘japanese-cp932-unix’ (これは私の環境だから)
この値は、Windows の[設定] のキーボード設定から導出していると思います。
ちなみにデフォルトは nil

- set-terminal-coding-system
この設定は emacs -nw のように windows terminal などで実行する時に有効だと思います。
今回は無視しても良いのかな(emacs -nw のような使い方をされてますか?)
土屋 勝 への返信

Re: WindowsとYaTeXで日本語ファイル名が使えない

- 井汲 景太 の投稿

外部起動するプログラムに渡す引数の文字列の文字コードの問題なので、process-coding-system を設定しないといけないと思います。第一の

> (set-language-environment "Japanese")

> (set-default-coding-systems 'utf-8)

> (prefer-coding-system 'utf-8)

> (set-file-name-coding-system 'cp932)

> (set-keyboard-coding-system 'cp932)

> (set-terminal-coding-system 'cp932)

でも、第二の

> (set-language-environment "Japanese")
> (set-default-coding-systems 'utf-8)
> (prefer-coding-system 'utf-8)
> (set-file-name-coding-system 'utf-8)
> (set-keyboard-coding-system 'utf-8)
> (set-terminal-coding-system 'utf-8)

でも、prefer-coding-system で utf-8 に上書きされた process-coding-system は変更してないので、shift-jis を期待する platex に utf-8 で渡ってしまい、処理が失敗しているのでしょう。

> Windowsの[設定]-[時刻と言語]-[言語と地域]-[管理用の言語の設定]-[システムロケールの変更]-[ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用]

を元に戻して、.emacs の設定を

(set-language-environment "Japanese")

だけにして試すとうまく行くのではないでしょうか。

井汲 景太 への返信

Re: WindowsとYaTeXで日本語ファイル名が使えない

- 宇治 武士 の投稿

サブ的にWindows上のEmacsでYaTeXを使っていますが(ほぼ別のLinux機がメイン)
個人的には土屋さんの解決法は「あり」だと思います。

確かにコンパイルだけならprocess-coding-systemをcp932にするだけでいいのですが,
ソースリストをutf-8で使っている以上,他のところにしわ寄せがいきます。

実は昔w32texでソースのエンコーディングをutf-8にを変更した時に,エラー部分の出力等で
cp932とutf-8の混在が発生してどうしても文字化けとなり
(コマンドプロンプト経由になるため,cp932以外がうまく通らない)
これがどうしても解決できませんでした。
おそらくYaTeXのコンパイルログの表示にshellモードの派生バッファを使っていることが関係すると思います。

この状況に嫌気がさして元々Emacsのシェルモードのバックエンドにcygwinを使っていたのもあり,w32texのサポート切れと同時にcygwinのtexliveに変更して
diiffやgit,python,perl等の周辺ツールはcygwin付属のutf-8ロケールの
ツールに統一して現在は使っています。

ソースリストがutf-8だと,周辺ツール(diff関連やgitなど)をutf-8で統一する方が
個人的には何かと都合がいいような気がします。

utf-8のファイルを編集しているのにshellモードとかで,utf-8の文字列をパイプで渡せないのはかなり不便だと思います。

ただ,latex関連をcygwinにする方法はfakecygptyとか特殊な設定が必要で,
これを他人に説明するのは私の能力では不可能なので,おすすめはしていません。

井汲 景太 への返信

Re: WindowsとYaTeXで日本語ファイル名が使えない

- 井汲 景太 の投稿
訂正です。

> (set-language-environment "Japanese")
> だけにして試すとうまく行くのではないでしょうか。

と書きましたが、これだとエラーは出ずに platex の実行は正しく行きますが、platex からのコンソール出力は文字化けするみたいですね。数年前から、platex のコンソール出力は、emacs 内部で実行する場合のように、他のプロセスに向けて送り出す場合は utf-8 になるようになっているみたいで、それが原因です。(https://texwiki.texjp.org/?W32TeX#qc9f2e7d で platex の「コンソール出力」の所を見ると「パイプ」だと UTF-8 になっている)

YaTeX は使っていないのですが、ざっと見た感じ、(set-language-environment "Japanese") に追加して
(setq latex-message-kanji-code 4) ; 当初1と書きましたが4です
とすると、その文字化けもしなくなるだろうと思います(prefer-coding-system 等は使わずに)。

※ 宇治さんの書かれるように、cp932 と utf-8 が混在する出力だともうどうしようもないですが。