New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

utf8.def と plcore.ltx の \DeclareFontEncoding の衝突 #68

Closed
aminophen opened this Issue Mar 28, 2018 · 4 comments

Comments

Projects
None yet
2 participants
@aminophen
Member

aminophen commented Mar 28, 2018

#67 (comment) のコメントについて,さらに調べました。

LaTeX(従来版・新版共通)

  • LaTeX は \DeclareFontEncoding@ を \def する。(latex.ltx) … [定義A]
  • inputenc の utf8.def は [定義A] ベースの新定義を \def する。 … [定義B]

LaTeX(新版のみ)

  • 既定を UTF-8 にするため,latex.ltx の最後の方で utf8.def を読み込む。 … 正味として [定義B]
  • latexrelease で過去をエミュレートできるように,latexrelease.sty にも [定義A] を持たせる。

pLaTeX

  • pLaTeX は [定義A] ベースの新定義を \def する。(plcore.ltx) … [定義C]

これらのことから,pLaTeX の状況を以下のようにまとめることができます:

従来の pLaTeX の挙動

  • フォーマット作成 … latex.ltx → plcore.ltx を読むので,[定義C] が有効。
    → 期待通り。
  • pLaTeX で \usepackage[utf8]{inputenc} した場合 … utf8.def が読まれるので,[定義B] が有効。
    → この時,pLaTeX による [定義C] は吹っ飛ぶ。 … (★1)

新しい LaTeX の下での pLaTeX の挙動

  • フォーマット作成 … latex.ltx → utf8.def → plcore.ltx を読むので,[定義C] が有効。
    → せっかく utf8.def を読み込んだのに,[定義B] が pLaTeX によって吹っ飛ばされる。 … (☆)
  • pLaTeX で \RequirePackage[2017/01/01]{platexrelease} した場合 … latexrelease.sty が読まれるので,[定義A] が有効。
    → この時,pLaTeX による [定義C] は吹っ飛ぶ。 … (★2)
  • pLaTeX で \usepackage[utf8]{inputenc} した場合 … utf8.def は読まれない(元々 utf8 なので)。
    → パッケージ読込前の定義が踏襲される。

ここで何かしらの対処を取らなければ,新しい LaTeX では (☆) の現象が起きてきます。(★2) は (★1) と内容的には同じですが,(★1) よりも「吹っ飛ぶ」タイミングが早くなる(\documentclass より前)ので,もしこの現象が問題だとすれば,その程度は大きくなるはずです。

一つの方法としては,

  • plcore.ltx に [定義B] (utf8.def) + [定義C] (plcore.ltx) な新定義を \def する。 … [定義D]
  • platexrelease.sty には [定義C] を持たせる。

という方法がありえます。ただし,[定義D] の内容についてはよく考えないといけません。

もう一つの方法としては,根本的に pLaTeX の [定義C] が重要でないのであれば,削除する(あるいは互いに干渉しない別実装を作る)というのがありえます。従来の (★1) の挙動は 20 年近く存在したはずですが,報告例が見当たらないので,「20 年近く誰も問題視していなかった」と見ても差し支えないかもしれません。

さあ,どうするのが良いでしょうか。

@h-kitagawa

This comment has been minimized.

Member

h-kitagawa commented Mar 28, 2018

根本的に pLaTeX の [定義C] が重要でないのであれば,

補足です.LaTeX の [定義A] と pLaTeX の [定義B] の差異は,後者に

 \expandafter\let\csname#1-cmd\endcsname\@changed@cmd
+\def\enc@elt{\noexpand\enc@elt}%
+\xdef\fenc@list{\fenc@list\enc@elt<#1>}%
 \else

という 2 行が付け加わっている点です.

このコードで更新される \fenc@list は「定義済みの欧文エンコーディングのリスト」です.pLaTeX の \fontfamily 命令では引数(ここでは仮に hoge とする)によって和文ファミリ・欧文ファミリ・あるいは両方を切り替えますが,その判定の以下の部分で \fenc@list が使われます.

\fenc@list 内にある各欧文コーディング <enc> に対して,フォント定義ファイル <enc>hoge.fd があるか調べる

@aminophen

This comment has been minimized.

Member

aminophen commented Mar 29, 2018

補足ありがとうございます。

最初のコメントに書いた「新しい LaTeX の下での pLaTeX の挙動」の

せっかく utf8.def を読み込んだのに,[定義B] が pLaTeX によって吹っ飛ばされる。 … (☆)

によって問題がおきる例を挙げます。

従来の pdfLaTeX,新しい pdfLaTeX,従来の pLaTeX では通っていた以下のソースが,「新しい LaTeX の下での pLaTeX」では通らなくなります。(注意:新しい LaTeX ではもともと utf8 なので,\usepackage[utf8]{inputenc} しても utf8.def は読まれない」ことに注意。)

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[LY1]{fontenc}
%\makeatletter\input{ly1enc.dfu}\makeatother
\begin{document}
[ƒ]\par
\end{document}

! Package inputenc Error: Unicode char Æ^^92 (U+192)
(inputenc)                not set up for use with LaTeX.

See the inputenc package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.6 [^^c6^^92
             ]\par
? 

これは,utf8.def による [定義B] が吹っ飛ばされた結果,本来 \usepackage[LY1]{fontenc} の時に読まれるべき ly1enc.dfu が読まれなくなるためです。実際に,追加で

\makeatletter\input{ly1enc.dfu}\makeatother

を書いておくと通るようになりますから,この (☆) の挙動は問題だと思われます。

aminophen added a commit that referenced this issue Mar 31, 2018

@aminophen

This comment has been minimized.

Member

aminophen commented Apr 6, 2018

本件, @h-kitagawa さんのコードで解消します。また,LaTeX 本家のリリースと pLaTeX のリリースのどちらが先でも大丈夫なように微調整を加えたので,明日 4/7 にリリースします。

pLaTeX2e <2018-04-01> based on …

という表示になります。(LaTeX と同じく yyyy-mm-dd 表記に変えました)

@aminophen aminophen closed this in 66f8ffd Apr 6, 2018

@aminophen

This comment has been minimized.

Member

aminophen commented Apr 9, 2018

http://tug.org/pipermail/tex-live/2018-April/041437.html

  • mathtext.sty による \DeclareFontEncoding@ の再定義によって,LaTeX カーネルがプリロードしている utf8.def の定義が上書きされる(結果として dfu が読まれずエラーになる)

というのが議論されています。私も知りませんでしたが,同じ理由で mathtext.sty はずっと昔から pLaTeX2e と衝突しているんですね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment