texjporg / platex

pLaTeX community edition
BSD 3-Clause "New" or "Revised" License
49 stars 8 forks source link

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

Closed aminophen closed 6 years ago

aminophen commented 6 years ago

https://github.com/texjporg/platex/issues/67#issuecomment-376529431 のコメントについて,さらに調べました。

LaTeX(従来版・新版共通)

LaTeX(新版のみ)

pLaTeX


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

従来の pLaTeX の挙動

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


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

一つの方法としては,

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

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

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

h-kitagawa commented 6 years ago

根本的に 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 commented 6 years ago

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

最初のコメントに書いた「新しい 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 commented 6 years ago

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

pLaTeX2e <2018-04-01> based on …

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

aminophen commented 6 years ago

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

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