訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 二瓶 孝之 の投稿
返信数: 17
「LuaLaTeXで漢文の訓点を使いたい」の質問をした者です。
再度質問させてください。

前回質問時は、漢文の振り仮名のみのソースで試したのですが、その後、一二点などを使うとエラーが出て止まる事が判明しました。

日を空けず似たような質問をするのもバツが悪く、ネットで情報を集めて、以下のサイトに辿り着きました。

私家版日本語 LaTeX テンプレート(2017年5月版)
<https://id.fnshr.info/2017/05/20/my-latex-templates-201705/#toc26>

上記ページ記載のGiTHubのレポジトリからtate-book-template.texを入手して、以下の環境でupLaTeXを指定してコンパイルするとエラーが出て停止します。添付したtate-book-template_oku.logがその内容です。

【環境】
win10 home 64ビット ver1803
TeX Live 2019(2019年6月14日にアップデートしてます)
タイプセット upLaTeX
ドキュメントクラス jlreq

とりあえず、エラー元のokumacroを使わないようにして再コンパイルすると、sfkanbun.styの処理の途中でエラーが出て停止します。添付したtate-book-template_sfk.logがその内容です。

レポジトリにはコンパイル後のpdfファイルも有るので、自分の環境に問題があるのだと思いますが、原因がわからず、サブマシンのTeX Live 2017でコンパイルしたところ、問題なくPDFファイルが出力できました。

環境は以下です。
【サブマシン環境】
win10 home 64ビット ver1803
TeX Live 2017(ISOイメージからインストールしたまま、アップデートしていない)
タイプセット upLaTeX
ドキュメントクラス jlreq

問題の切り分けすら自分には手に余る状態です。

最終的にはTeX Live 2019でLuaLaTeXを使いたいのですが、その前にupLaTeXだけでも使えるようにするにはどのような方法がありますでしょうか。


以下を添付いたしました。
tate-book-template.tex
以下からコピーして保存したソース(UTF-8)
<https://github.com/fnshr/latex-templates>

sfkanbun.sty
SJIS。藤田眞作さんのWEBサイトからダウンロードしたもの
<http://xymtex.com/fujitas2/texlatex/index.html>

tate-book-template_oku.log
okumacroで止まった時のログ

tate-book-template_sfk.log
okumacroをコメントアウト後、sfkanbunで止まった時のログ
ログ2本はSJISですが、全角文字が化けています。

/lualatex用
配下にlualatex用に修正したsfkanbun.styとjdkintou.styを収めてあります

二瓶 孝之 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- aminophen の投稿
> tate-book-template.texを入手して、以下の環境でupLaTeXを指定して
> コンパイルするとエラーが出て停止します。
> 添付したtate-book-template_oku.logがその内容です。

! Undefined control sequence.
l.131 \bou

このエラーは,明らかに \bou というコマンドが定義されていないことが原因ですね。
\bou というコマンドは plext パッケージで定義されていますので,
\usepackage{plext}
を追加してみてください。
ちなみに LuaLaTeX (luatexja) では plext パッケージが使えませんが,
lltjext パッケージで代用可能です。

「TeX Live 2019はNG、TeX Live 2017ではOK」の理由は,
2017年頃の jlreq クラスは縦組みでは plext パッケージを読み込んでいたが,
最近のバージョンは読み込まなくなったからだと思います。

> sfkanbun.styの処理の途中でエラーが出て停止

こちらについては未調査です。
aminophen への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿
2017 での検証は aminophen さんの報告があったので中止。

3箇所問題が有りました。

1)\bou

  aminophen  の報告通り \usepackage{plext} を追加してください。

2)\sidenote が未定義になる

  texdoc jlreq などで sidenote を検索すると、jlreq 読み込み時に sidenote_length を有意な値に設定しないと未定義になるためです。

3)\kundoku で \prevdepth’ in horizontal mode エラーが出る

  https://oversleptabit.com/archives/1170 に似た現象がほうこくされていたので理由は説明できないのですが類似の \relax を入れてみたところ通るようになりました。

  ※どなたかこの対処が妥当か、より良い回答があればフォローしてください。

以下パッチ情報です。

diff --git a/UTF-8/sfkanbun.sty b/UTF-8/sfkanbun.sty
index 8bb2134..5a0f456 100644
--- a/UTF-8/sfkanbun.sty
+++ b/UTF-8/sfkanbun.sty
@@ -154,7 +154,7 @@
%
\newif\if@nagairuby \@nagairubyfalse
\def\kundoku{\@ifnextchar[%]
-{\@kundoku}{\@kundoku[1]}}
+{\@kundoku}{\@kundoku[1]}\relax}%% SEE https://oversleptabit.com/archives/1170
\def\@kundoku[#1]#2#3#4#5{\@ifnextchar[%]
{\@k@ndoku[#1]{#2}{#3}{#4}{#5}}{\@k@ndoku[#1]{#2}{#3}{#4}{#5}[]}}
%
diff --git a/UTF-8/tate-book-template.tex b/UTF-8/tate-book-template.tex
index d142c61..de5ede7 100755
--- a/UTF-8/tate-book-template.tex
+++ b/UTF-8/tate-book-template.tex
@@ -5,6 +5,9 @@
hanging_punctuation, % ぶら下げ組
paper=b6, % 用紙サイズ
reference_mark=interlinear, %注の合標を行間に
+ sidenote_length=10zw, % この値(デフォルト0)を設定しないと
+ % \sidenote は未定義となる texdoc jlreq か
+ % 参考URL http://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/latex/jlreq/jlreq-ja.html
book % 書籍のためのスタイル
]{jlreq}

@@ -28,6 +31,7 @@
\usepackage{okumacro} % 圏点などのために
\usepackage{pxrubrica} % ルビをつける(okumacroのrubyは使わない)
\usepackage{sfkanbun} % 漢文
+\usepackage{plext} % 傍点 美文書7 p305 傍注参照
% sfkanbun パッケージは、
% http://xymtex.my.coocan.jp/fujitas2/texlatex/index.html
% から入手可能
和田 勇 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 二瓶 孝之 の投稿
aminophenさん、和田 勇さん、早々にお返事頂戴しながら、ご報告遅くなって申し訳ありません。

コンパイルは通りましたが、割注、訓点の位置とサイズが変でした。

教えていただいた内容を織り込んだソースファイル、sfkanbun.sty、ログ、出力結果のPDFを添付いたします。

二瓶 孝之 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿
修正内容をコピペで対応されたようですね。これからは修正したファイルのみを zip で固めて添付します。

それはともかく ...現在原因は特定できたけど未解決ですが...これから午後まで外出なので経過報告。

まずは、お詫び。コンパイルを通すことしか考えていませんでした。 :-(

■割注

 jlreq.cls ファイル(c:/texlive/2019/texmf-dist/tex/latex/jlreq/jlreq.cls) の 3476 行目に条件付き強制改行処理が影響して「強制改行」が発生しています。コメントのつぶやきもありますが、この条件を調査中。

   % 「初回」時はここに強制改行を入れる.これにより現在位置の取得がより正しくなる……といいなぁ
   \jlreq@savepos@iflabelundefined{\\}{}%

■訓点の位置とサイズ ... これは\relax を強制的にいれたための弊害。
 対処策検討中
和田 勇 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿
まだ解決していませんが、誰か詳しい人に目に触れるのを期待して、経過報告です。

もともとの作者の作成情報からだと2017/05 までは問題なくコンパイルできたようですが、その後の TeXLive アップデートしたjlreq.cls や plext.sty のものではエラーになってしまいます。そのため 2017 と 2019 の比較も儘ならぬ状態です。


■割注   条件によって強制改行発生(jlrteq.cls 3476行目)
    時間ななく未調査
  

■漢文(訓点の位置とサイズ).. 添付のファイルを参考にしてください。

もともとのエラーは以下の通り。

   ! You can't use `\prevdepth' in horizontal mode.
   \nointerlineskip ->\prevdepth
    -\@m \p@

\kundoku に関するマクロ内で \nointerlineskip の直前に \par を挿入することでコンパイルはひとまず通りますが「左送り仮名」と「句読点」の表示位置不正です。

      % \kundoku{漢字}{ルビ}{送り仮名}{返り点}[肩返り点](句読点)
 NG    \kundoku{未}{いま}{ダ}{レ}

       左送り仮名表示位置不正 

 暫定OK  \kundoku{知}{}{ラ}{二}
 暫定OK  仁
 暫定OK  \kundoku{義}{}{ヲ}{一}
 NG    \kundoku{也}{}{}{}(。)

       句読点(。) の表示位置不正

和田 勇 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 二瓶 孝之 の投稿
ご教示・調査、ありがとうございます。

後ろ向きの回避法でシャクですが、当面TeX Live 2017を使います。
自分でマクロ組んだほうが早くね? と一瞬思いましたが、
スタイルファイルを開いても、何が書いてあるかおぼろげにしかわかりませんでした。

どなたか詳しい方の指南を気長に待ちます。
二瓶 孝之 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿

> 後ろ向きの回避法でシャクですが、当面TeX Live 2017を使います

力不足で申し訳ないです。割注と漢文必須だと当面その選択もありですね。

なお、藤田さんのマクロ集には warichu.sty がありますね。残念なことにjlreq とは書式が違うのでどちらかに決める必要がありますね。

その後、検討した結果

■漢文のほうの文字表示位置不正はほぼ解消。
\nointerlineskip の直前に \par を挿入した分だけ文字位置を補正すれば妥当な場所へ配置してできるようになりました。

ただし、横書きの漢文は考えなくてもいいかもしれませんが、tate オプションを取り除くと句読点がおかしなところに配置されてしまいます。\tate マクロ使っているからしょうがないとはいえ。。。

以上の修正が妥当化どうか作者の藤田さんに問い合わせてみようと思います。

なお添付の sfkanbun.sty にはデバックコメントをいれままです。

■割注
強制改行を制御できるかトレースしたのですが対処策できず github で公開されていたので現在質問中。

■添付ファイルの中身(ファイル名に日付をつけときました)
UTF-8/sfkanbun.sty
UTF-8/sfkanbun.sty.diff
UTF-8/tate-book-template.tex sfkanbun を読み込む場所を変更した
UTF-8/tate-book-template.tex.diff
UTF-8/tate-book-template.pdf
和田 勇 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- aminophen の投稿
和田さんが

> ■漢文のほうの文字表示位置不正はほぼ解消。
> \nointerlineskip の直前に \par を挿入した分だけ文字位置
> 補正すれば妥当な場所へ配置してできるようになりました。

という回避策を報告されていますが,当方では
「TeX Live 2019はNG、TeX Live 2017ではOK」
をもう少し探ってみます。

まず,

> ! You can't use `\prevdepth' in horizontal mode.
> \nointerlineskip ->\prevdepth
>                              -\@m \p@

のエラーを再現する最小ソースを作ってみました。

\documentclass[tate]{jlreq}
\def\kintou{}% sfkanbun.styの「\kintouが未定義の時jdkintou.styを呼ぶ」というコードを防ぐ
\usepackage{sfkanbun} % 漢文
% sfkanbun パッケージは、
% http://xymtex.my.coocan.jp/fujitas2/texlatex/index.html
% から入手可能

\begin{document}

\section{漢文}

% \kundoku{漢字}{ルビ}{送り仮名}{返り点}[肩返り点](句読点)

\kundoku{未}{いま}{ダ}{レ}
\kundoku{知}{}{ラ}{二}

\kundoku{義}{}{ヲ}{一}
\kundoku{也}{}{}{}(。)

\end{document}

ここで試しに「LaTeX を昔の挙動に巻き戻す機能」を使ってみます。
# そろそろ latexrelease パッケージの知名度が上がってほしい…

上記のソース冒頭に

\RequirePackage[2018/11/30]{platexrelease}

を足すとOKで,

\RequirePackage[2018/12/01]{platexrelease}

を足すとエラーになるので,まずは
「LaTeX か pLaTeX の 2018/12/01 付けの変更が原因である」
と特定できます。ところが,platexrelease.sty の中には
「2018/12/01 を境に機能が切り替わるようなコード」が入っていません。

$ cat `kpsewhich platexrelease.sty` | grep -C3 2018/12/01
→何も返ってこない

したがって,原因は pLaTeX ではなく LaTeX の変更にあるとわかります。

$ cat `kpsewhich latexrelease.sty` | grep -C3 2018/12/01

の結果を眺めてめぼしいところを切り出すと

\IncludeInRelease{2018/12/01}%
                {\finph@nt}{Start LR-mode}%
\IncludeInRelease{2018/12/01}%
                {\finsm@sh}{Start LR-mode}%
\IncludeInRelease{2018/12/01}%
                {\addcontentsline}{Mask line endings}%
\IncludeInRelease{2018/12/01}%
                {\@dottedtocline}{Prevent protrusion}%
\IncludeInRelease{2018/12/01}%
                {\thinspace}{Start LR-mode}%
\IncludeInRelease{2018/12/01}%
                {\Big}{Start LR-mode}%
\IncludeInRelease{2018/12/01}%
                {\protected@file@percent}{Mask line endings}%
\IncludeInRelease{2018/12/01}%
                {\verbvisiblespace}{Setup visible space for verb}%

のように「2018/12/01 を境に機能が切り替わるようなコード」が列挙されます。
この中のどれかが当たりだと思うのですが,これから調べます。
aminophen への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- aminophen の投稿
> 「2018/12/01 を境に機能が切り替わるようなコード」
> この中のどれかが当たりだと思うのですが,これから調べます。

どうやら \finsm@sh の定義変更が効いているようです。
昔の定義は

\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}

ですが,2018/12/01 付けの LaTeX2e で

\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \leavevmode@ifvmode\box\z@}

に変わっています。昔の定義に戻すとエラーが出なくなるので,
\leavevmode@ifvmode
の影響ということになります。
\leavevmode@ifvmode も 2018/12/01 付で新設されたマクロで,

\protected\def\leavevmode@ifvmode{\ifvmode\expandafter\indent\fi}

ですね。

さて,エラーを出している sfkanbun.sty の \nointerlineskip
ですが,これは \orig@@kundoku の中で二箇所見つかります。
いずれも \smash の後に登場していて,LaTeX の \smash の定義には
\finsm@sh が登場しますから,この影響が出ているのは間違いありません。

さて,この本家 LaTeX の変更が妥当なのかどうか???
aminophen への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- aminophen の投稿
\smash と \nointerlineskip を検索すると,
https://tex.stackexchange.com/questions/273851/
のように
「\smash で余分なスペースができるなら \nointerlinskip を入れろ」
という回答が付いています。
(しかも egreg さんは今 LaTeX チームの中の人!)
推測するに,このハックは割とよく使われていた方法だったはずです。

しかし,この使い方を封じることになる \finsm@sh の定義変更は
意図的だとのことです。
https://github.com/latex3/latex2e/issues/108
もう元に戻ることはないんでしょうね…。

日本のトピックでも
https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/40129.html
のようなマクロが出てきました。

この LaTeX の仕様変更は,影響がけっこうあるかもしれません。
aminophen への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿
> ! You can't use `\prevdepth' in horizontal mode.
> \nointerlineskip ->\prevdepth
> -\@m \p@
 ......

やっぱりマクロ名の衝突でしたか。

その他、調査・解析されたものから判断すると、和田の回避策は良くない方法ですね。\par で当座しのいだため、文字位置を再調整せざるをえなくなって余計わかり辛くなってしまいますしね。

■# そろそろ latexrelease パッケージの知名度が上がってほしい…

有益なデバッグ方法なのでメモ書きにしっかり書き込みました。Thanks

和田 勇 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- aminophen の投稿
さっきリンクを貼った TeX.SX における回答者の egreg さんに問い合わせたところ,
即座に「\smash を使う時は \hbox に入れてくれ」と回答が来ました。
コメントにも書いてくださいました

sfkanbun もこの方法で直すとよいかもしれません。
aminophen への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿
さっそく
 \smash{...} を \hbox{\smash{...}}
にして、問題なく漢文の処理表示が元野と同じになりました。

元ソースは条件分の中で smash を発行しその外で無条件に nointerlineskip を発行しているのですが、サジェスチョン内容からだと

 \hbox{\smash{...}}\nointerlineskip

のようにしたほうがベターですが修正量をできるだけ少なくするため smash 部分のみ hbox に入れ込んでみました。

残りは割注ですが、問い合わせ中。

aminophen への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 二瓶 孝之 の投稿
調査・追跡、ありがとうございます。

掲載のソースにplatexreleaseの有無で結果が変わる、というのをこちらでも追試できました。

実は、FAQを見れば解決できる質問をしてたらどうしよう、とドキドキしてました。



二瓶 孝之 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 和田 勇 の投稿
割注のほうも作成者の方からバグ修正した旨連絡いただきました。
もうしばらくすればアップデートで取り込まれるかと思いますがお急ぎのときは添付のzip ファイルから UTF-8/jlreq-helpers.sty をコンパイルするフォソースと同じフォルダーに配置してコンパイルしてみてください。

#添付ファイル名、ちょっと前に回答したものと基本同じですが jlreq-helpers.sty を追加しています。
和田 勇 への返信

Re: 訓点を使うとTeX Live 2019はNG、TeX Live 2017ではOK

- 二瓶 孝之 の投稿
ありがとうございます。
文字表示位置がおかしかったのが、キチンとなりました。
なんだか魔法を見ているようです。

>力不足で申し訳ないです
とんでもないです。ニッチな需要にもかかわらずありがとうございます。