texjporg / platex

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

ドライバをグローバルオプションで指定した場合の LaTeX Warning: Unused global option(s) について #13

Closed yudai-nkt closed 7 years ago

yudai-nkt commented 8 years ago

はじめまして。jsclasses の方でいろいろと議論しているなか恐縮ですが,素人ながら思ったことがあるので issue を立てます。

私は日本語文書の作成には基本的に upLaTeX + jsarticle + dvipdfmx を使用しており,その際にどのパッケージを使用するかに関係なくつねに dvipdfmx をグローバルオプションに指定しています。

pLaTeX を用いて次のソースを処理すると dvipdfmx オプションについて LaTeX Warning: Unused global option(s) という警告が出ます。

\documentclass[dvipdfmx]{jsarticle}
\begin{document}
\end{document}

次のようにドライバ依存するパッケージを読み込むと,“Unused” ではなくなりこの警告は消えます。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{graphicx}
\begin{document}
\end{document}

TeX Wiki の記事中の

この方式を採用しておくと,パッケージの使用者(文書作成者)は,「dvips を使う場合と dvipdfmx を使う場合で,ソースの記述が一か所しか異ならない」というメリットが得られます。

や ZR さんの解説中の

なお、最近ではドライバ指定はパッケージ毎に指定するのではなく、「グローバルオプション」とする、すなわち文書クラスのオプションとして指定することが推奨されています。

および

これを踏まえると、LaTeX文書では常にドライバオプションを文書クラスに指定する(DVI出力の場合)のが現代のベストプラクティスとして考えられるでしょう。

から考えるに少なくとも (u)pLaTeX を用いた文書作成時には DVI ドライバを文書クラスのオプションとしてグローバルに設定することが現在は推奨されていると捉えています。また,DVI が最終成果物でない場合にグローバルオプションとしてドライバを指定することは,jsclasses を upLaTeX で使用する際には正しい組版結果を規定するために自動判別だけに頼らずオプションで明示的に uplatex をユーザに指定させるという設計思想にも通ずると思います。

この警告の理由や警告が出ていても問題ないことの理解は決して難しくないとは思いますが,“Unused” なのは事実である一方で推奨されている方法に則っているにもかかわらず警告が出ることは私の感覚では気持ち悪く感じます。LaTeX に不慣れな方であれば Warning という文字だけを見て無用の心配をしてしまうかもしれません。

pdfTeX など PDF 出力のエンジンが主流のラテン文字圏ではドライバオプションという概念がもしかすると希薄なのかもしれませんが,PDF を直接出力しない (u)pLaTeX を使用するならドライバ指定は依然として意識を向けるべき事柄だと思います。

本題に入るまえに釈迦に説法とでもいうべき話で長くなりましたが,LaTeX に詳しい個々人の見解ではなく,もし Japanese TeX Development Community という組織として「ドライバは文書クラスのグローバルオプションで指定する」ことを推奨するとすれば(TeX Wikiの LaTeX 入門ではグローバルオプションではなく \usepackage[dvipdfmx]{graphicx} となっていたので,これは私の想像です),LaTeX カーネルでの定義を書き換えることになりますが「ドライバオプションが指定されている場合は例外的に “Unused global option” とみなさない」というようなフックを加えることは可能でしょうか。

提案の妥当性以前に事実誤認等ありましたらお教えいただけると幸いです。

aminophen commented 8 years ago

まず、ご提案ありがとうございます。

組織として(複数ある正しい書き方のうち)特定の書き方を推奨するか否かは、過去に決めたことも今後決める予定もないのではと私個人は考えています。

Unused の警告が「LaTeX に不慣れな方であれば Warning という文字だけを見て無用の心配をしてしまう」可能性は確かにあると思います。一般論として、この Unused の警告は「オプションのスペルミス等でクラスファイル若しくはパッケージの何れかの機能が働かなかった場合」にそれを気づかせてくれるもの、なのでしょう(これは、私自身の経験上そういう時に助けられてきたことからの推測です)。議論の取っ掛かりとして、仮に「この警告ルーチンからドライバオプションと思しきものを除外」とした場合に何が起こるのか、を考えることから始めようかと思います。 → いまちょっと手一杯なので続きはいつになるか判りません。

yudai-nkt commented 8 years ago

コメントありがとうございます。

組織としてグローバルオプションを推奨すると決めることは個人的な見通しとしてはおそらくないのではとの旨,了解しました。

私自身は文書クラスのオプションには uplatex, dvipdfmx, a4paper(のうち必要なもの)くらいしか普段は書かないので思い至りませんでしたが,この警告がオプションのタイポなどに気づかせるものというのは確かにあると思いました。意味のある警告を出すケースもあるとなれば,やはり特定のものを例外処理するという行為は起こりうる副作用の洗い出しや例外扱いに値するかなども含めて慎重に検討すべきですね。そもそもこの警告を好ましく思っておらず変えてほしいと考えているユーザが私以外にいるのかもまだ分かっていません。

aminophen commented 8 years ago

(ひとりごと)誰が作ってくださったのかは分かりませんが、このコードは本 issue に無関係に書かれたコードではないように思います。どなたが書いたんでしょう… → と思ったらどうやら元はこれですね;)

yudai-nkt commented 8 years ago

それは私が $TEXMFDIST/tex/latex/base 内を grep してめぼしい箇所を見つけて弄ったものを自分の Gist にアップしたものです。提案が採用されたわけでもない上に色々とお粗末なので特にここでお知らせすることはしなかったのですが,なぜ他所に載っているのかはよく分かりません……

aminophen commented 8 years ago

改めて考えてみました。結論をいえば、警告ルーチンからドライバオプションを除外するのはまずいのではないか、と思っています。

おそらく、(u)pLaTeX で例外扱いすべきなのは dvipdfmx / dvipdfm / dvips でしょう。ただ、これらを例外扱いする場合、たとえば「当該ドライバオプションをサポートしないパッケージが使われた場合」に気づきにくくなる可能性があります。

たとえば昔の xcolor.sty を拾ってきてインストールし

\documentclass[dvipdfmx]{jsarticle}
\usepackage{xcolor}
\begin{document}
あいうえお\textcolor{red}{かきくけこ}さしすせそ
\end{document}

をコンパイルすると、必要だと思って付けた dvipdfmx オプションが無駄になります。仮に警告を消した場合、何の警告も出ません。しかし、現状では

LaTeX Warning: Unused global option(s):
    [dvipdfmx].

が出て、予想外の事態に気づく可能性が少し高まります。最近も forum:1992 の事例がありましたので、古い xcolor.sty が意図せず見つかることはあり得るのでしょう。

DVI は元来 driver independent だったのですから、「処理したいソースにドライバ依存性があるのかないのか」を常に意識するように心がけておくとよいかもしれません。あるいは「要らないことは書かない=ソースの最小化」も勉強のひとつという考え方もできると思います。

yudai-nkt commented 8 years ago

リンク先の古い xcolor パッケージを試してみましたが,たしかに dvipdfmx には非対応のようですね。

基本的に TeX Live の最新版か前年の frozen しか使わないせいでそのような事例を考慮できずに Issue を立ててしまいましたが,仰るとおり何処かに古いパッケージなどが残っていてそちらが読まれるということは環境次第では起こりえます。そのような場合を考えると Unused global option(s) は例外を作るべきでないかもしれません(フォーラムの事例のようにログの他の箇所から原因を探ることもできますが,やはり警告やエラーの方が目につきやすく効果的でしょうし)。

aminophen commented 7 years ago

pLaTeX としては特になにもしない、ということで close します。

aminophen commented 4 years ago

古い issue ですが,TeX Live 2020 で予定されている LaTeX2e 2020-02-02 で「expl3 (LaTeX3) がフォーマットに組み込まれる」という予定になっています。expl3 はドライバ依存なので,(LaTeX2e 方式のクラスやパッケージが解釈しなくても)グローバルオプションは実質的に有効になるので,本家に issue を立てました。 → https://github.com/latex3/latex3/issues/657

aminophen commented 4 years ago

先ほどのリンク先にて,早速ですが「expl3 が解釈できるドライバオプションは,グローバルに指定されても Unused global option(s) の警告を発しない」という改善が入りました。TeX Live 2020 以降はドライバ依存性を持つ expl3 パッケージが必ずどんな latex でも読み込まれることになるため,世の中は「DVI 経由の場合はドライバオプションを必ずグローバルに指定すべし!」という方向で進むことになりそうです。