Luatex + Bxjscls + ja=standardを使うと自作sty内で一部の命令を再定義できない

Luatex + Bxjscls + ja=standardを使うと自作sty内で一部の命令を再定義できない

- Nakata Masato の投稿
返信数: 3
MacTeX の最新版(2018/04/17)を macOS Sierra 10.12.6 で使っています.以前のバージョン(正確には覚えていないが TeXLive 2017)ではこのようなエラーは出ませんでした.

\barを\overlineに再定義しようと思い,同じディレクトリ内に次のようなファイルを用意しました:

%a.tex
\documentclass[lualatex,a4paper,ja=standard]{bxjsarticle}
\usepackage{hoge}
\begin{document}
Hello, TeX!
\end{document}

%hoge.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{hoge}[2018/09/12 by Naughie]
\renewcommand{\bar}[1]{\overline{#1}}

そしてこれらのファイルを

$ lualatex -halt-on-error -interaction=nonstopmode -file-line-error a.tex

でタイプセットしようとしたところ,「\barがすでに定義されている」というエラーが出てしまいました:

This is LuaTeX, Version 1.07.0 (TeX Live 2018)
restricted system commands enabled.
(./a.tex
LaTeX2e <2018-04-01> patch level 5
(using write cache: /Users/me/Library/texlive/2018/texmf-var/luatex-cache/
generic)(using read cache: /usr/local/texlive/2018/texmf-var/luatex-cache/gener
ic /Users/me/Library/texlive/2018/texmf-var/luatex-cache/generic)
luaotfload | main : initialization completed in 0.512 seconds
(/usr/local/texlive/texmf-local/tex/latex/bxjscls/bxjsarticle.cls
Document Class: bxjsarticle 2018/02/04 v1.7c BXJS document classes
(/usr/local/texlive/2018/texmf-dist/tex/latex/tools/calc.sty)
(/usr/local/texlive/2018/texmf-dist/tex/latex/graphics/keyval.sty)
(/usr/local/texlive/texmf-local/tex/latex/bxjscls/bxjscompat.sty)
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifpdf.sty)
(/usr/local/texlive/2018/texmf-dist/tex/latex/type1cm/type1cm.sty)

LaTeX Font Warning: Font shape `TU/cmr/m/n' undefined
(Font) using `TU/lmr/m/n' instead on input line 913.

(load luc: /Users/me/Library/texlive/2018/texmf-var/luatex-cache/generic/f
onts/otl/lmroman10-regular.luc)
(/usr/local/texlive/2018/texmf-dist/tex/latex/geometry/geometry.sty
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifvtex.sty)
(/usr/local/texlive/2018/texmf-dist/tex/generic/ifxetex/ifxetex.sty))
(/usr/local/texlive/texmf-local/tex/latex/bxjscls/bxjsja-standard.def
(/usr/local/texlive/texmf-local/tex/latex/bxjscls/bxjsja-minimal.def)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/luatexja.sty
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/luatexja-core.sty
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
(/usr/local/texlive/2018/texmf-dist/tex/luatex/ctablestack/ctablestack.sty))
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ltxcmds.sty)
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/infwarerr.sty)
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/ifluatex.sty))
(/usr/local/texlive/2018/texmf-dist/tex/latex/xkeyval/xkeyval.sty
(/usr/local/texlive/2018/texmf-dist/tex/generic/xkeyval/xkeyval.tex
(/usr/local/texlive/2018/texmf-dist/tex/generic/xkeyval/xkvutils.tex)))
(/usr/local/texlive/2018/texmf-dist/tex/generic/oberdiek/atbegshi.sty)
(/usr/local/texlive/2018/texmf-dist/tex/latex/etoolbox/etoolbox.sty)
(/usr/local/texlive/2018/texmf-dist/tex/latex/everyhook/everyhook.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/svn-prov/svn-prov.sty))(load cach
e: /Users/me/Library/texlive/2018/texmf-var/luatexja/ltj-cid-auto-adobe-ja
pan1.luc)(load cache: /Users/me/Library/texlive/2018/texmf-var/luatexja/ex
tra_lmroman10-regular.luc)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/ltj-base.sty)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/ltj-latex.sty
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/base/tuenc.def)
(/usr/local/texlive/2018/texmf-dist/tex/latex/ms/everysel.sty)
ABD: EverySelectfont initializing macros)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty(lo
ad luc: /Users/me/Library/texlive/2018/texmf-var/luatex-cache/generic/font
s/otl/ipaexm.luc)(load cache: /Users/me/Library/texlive/2018/texmf-var/lua
texja/extra_ipaexmincho.luc)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/jfm-ujisv.lua)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/jfm-ujis.lua))
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/patches/lltjcore.sty)
(/usr/local/texlive/2018/texmf-dist/tex/latex/filehook/filehook.sty)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.
sty)))
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/luatexja-compat.sty(loa
d cache: /Users/me/Library/texlive/2018/texmf-var/luatexja/ltj-jisx0208.lu
c)))
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspe
c.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3kernel/expl3.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3kernel/expl3-code.tex)
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3kernel/l3pdfmode.def)))
(/usr/local/texlive/2018/texmf-dist/tex/latex/fontspec/fontspec.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3packages/xparse/xparse.sty)
(/usr/local/texlive/2018/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/base/fontenc.sty
(/usr/local/texlive/2018/texmf-dist/tex/latex/base/tuenc.def))
(/usr/local/texlive/2018/texmf-dist/tex/latex/fontspec/fontspec.cfg)(load luc:
/Users/me/Library/texlive/2018/texmf-var/luatex-cache/generic/fonts/otl/lm
roman10-bold.luc)(load luc: /Users/me/Library/texlive/2018/texmf-var/luate
x-cache/generic/fonts/otl/ipaexg.luc)(load cache: /Users/me/Library/texliv
e/2018/texmf-var/luatexja/extra_ipaexgothic.luc)(load luc: /Users/me/Libra
ry/texlive/2018/texmf-var/luatex-cache/generic/fonts/otl/lmroman10-italic.luc)

LaTeX Font Warning: Font shape `JT3/mc/m/it' undefined
(Font) using `JT3/mc/m/n' instead on input line 3764.


LaTeX Font Warning: Font shape `JY3/mc/m/it' undefined
(Font) using `JY3/mc/m/n' instead on input line 3764.

))
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/patches/lltjp-fontspec.
sty)
(/usr/local/texlive/2018/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspe
c-26h.sty)))) (./hoge.sty) (./a.aux)
*geometry* driver: auto-detecting
*geometry* detected driver: luatex
ABD: EverySelectfont initializing macros

./a.tex:3: LaTeX Error: Command `\bar' already defined.

See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...

l.3 \begin{document}

2304 words of node memory still in use:
6 hlist, 4 rule, 1 dir, 24 kern, 811 attribute, 52 glue_spec, 49 attribute_l
ist, 4 if_stack, 1 write, 9 user_defined nodes
avail lists: 1:5,2:273,3:3,4:4,5:7,7:6,8:4,9:4
./a.tex:3: ==> Fatal error occurred, no output PDF file produced!
Transcript written on a.log.

さらに次のようなことも試しましたがどれも同じエラーになりました:

- 「\renewcommand{\bar}[1]{\overline{#1}}」を「\def\bar#1{\overline{#1}}」「\renewcommand{\bar}{\overline}」「\let\bar\overline」「\let\bar\relax\newcommand{\bar}[1]{\overline{#1}}」「\let\bar\relax\def\bar#1{\overline{#1}}」等に変える.

しかし以下のいずれかをすればエラーは起きません:

- \renewcommand を,hoge.sty ではなく a.tex に直接書く;
- ドキュメントクラスのオプションから ja=standard を消す;
- ドキュメントクラスのエンジンを lualatex から uplatex + dvipdfmx に変える;
- ドキュメントクラスを bxjsarticle から ltjsarticle や article に変える;

また,\bar を \hat に変えても同様のエラーになりますが,自分で \newcommand した命令を \renewcommand してもエラーにはなりません.他の命令の \renewcommand でもエラーになるかは確認していません.

個人的には些細なことであまり問題はないのですが,一体なぜこうなるでしょうか?

どうすればエラーを避けて \def\bar\overline とできますか?


Nakata Masato への返信

Re: Luatex + Bxjscls + ja=standardを使うと自作sty内で一部の命令を再定義できない

- 和田 勇 の投稿
回答にはならないと思いますが

macOS をご利用とのことなのでターミナルにて以下のようにすることで \bar の定義されている箇所を探すことができます。

1) ログファイルが 79 文字で改行されてしまうのを防ぐための前処理

export max_print_line=1000
export error_line=254
export half_error_line=238

参考URL
[https://tex.stackexchange.com/questions/52988/avoid-linebreaks-in-latex-console-log-output-or-increase-columns-in-terminal
Avoid linebreaks in LaTeX console / log output (or increase columns in terminal)

2) lualatex で再コンパイルしログを取り直し

lualatex -halt-on-error -interaction=nonstopmode -file-line-error a.tex

3) ログファイルから読み込んだファイルリストを抜き出しそれらについて bar という文字列検索(多少エラーメッセージが出ますが無視 :-) )

cat a.log | tr '() ' '\n' | grep -e /usr/local -e hoge.sty | xargs grep -w bar

4) 結果から見ると /usr/local/texlive/2018/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty で

\DeclareMathAccent{\bar} {\mathalpha}{legacymaths}{22}

という定義があるのでこれに引っかかったのではないのかしら?

ちなみに少なくとも 2014 年から定義されていましたので念のため試してみた結果は以下の通り。

2014 ... Package keyval Error: lualatex undefined.
2015 ... luaotfload | db: .... のところで abort
2016 / 2017 は今回の症状と同じメッセージでエラー
Nakata Masato への返信

Re: Luatex + Bxjscls + ja=standardを使うと自作sty内で一部の命令を再定義できない

- Z. R. の投稿

根本的な原因は「独自の再定義とfontspecが衝突している」ことです。次のソースで同じ現象が起こります。

\documentclass{article}
\usepackage{fontspec} % no-math無し
\renewcommand{\bar}[1]{\overline{#1}}
\begin{document}
\end{document}

要するに、「fotnspecの既定動作は、数式フォント関連の拡張と衝突を起こしやすい」(参考記事)わけです。

そして、LuaLaTeXで動作するBXjsclsは、クラスオプションの設定を実現するためにfontspecを読み込む仕様であるため、このfontspecの特質の影響を受けるわけです。(ltjs系クラスはfontspecを読み込まない。)

次のいずれかの方法で回避できます。

  1. fontspecにno-mathオプションを渡す(前掲の記事を参考)ために、クラスオプションにno-mathを付ける。
    \documentclass[lualatex,a4paper,ja=standard,no-math]{bxjsarticle}
  2. \barの再定義を、文書本体開始時まで遅延させる。つまり、hoge.sty内の記述を以下のように修正します。
    \AtBeginDocument{%
      \renewcommand{\bar}[1]{\overline{#1}}}

[詳細情報]

既定(no-math無し)のfontspecは「数式英字フォントをテキスト用フォントに追随させる」という機能をもちます。これを実現するため、fontspecはLaTeXの数式英字フォントを再設定するのですが、その際にいくつかの数式記号(\barが含まれます)の定義を修正しています。

ところが、この「追随」の動作は、数式フォント用のパッケージ(newtxmath等)を利用している場合はユーザの意図に合いません。そのため、fontspecは、「再設定」の実行を文書本体開始時まで遅延させて、そこで「数式フォント用のパッケージが読み込まれているか」を検査し、読み込まれている場合は再設定を抑止します。

従って、プレアンブル中で\bar等が再定義されると、fontspec側の再定義が失敗して、文書本体開始時にエラーになる、ということのようです。こういう場合は、no-mathを指定して手動で「再設定」を抑止する必要があるわけです。

あるいは、\bar の独自の再設定を \AtBeginDocument で遅延させる(かつそれをfontspecの読込の後で行う)ことにすれば、独自の再設定はfontspecの処理が終わった後で行われるので正常に実行できます。

Z. R. への返信

Re: Luatex + Bxjscls + ja=standardを使うと自作sty内で一部の命令を再定義できない

- Nakata Masato の投稿
丁寧にありがとうございます.

今までエラーが出なかったのは no-math オプションを付けていたからみたいですね.(MacTeX をアップデートしたときになぜか外していた.)

no-math を付ければ成功しました.fontspec との conflict には注意します.