数時間前、次のコードは完璧に動作しました (LuaLatex、Ubuntu 上の TeXlive 2016)。
\DeclareDocumentCommand \SetBaseFont { o m }
{ \__fontspec_pass_args:nnn \__fontspec_SetBaseFont:nn {#1} {#2} }
\cs_new:Nn \__fontspec_SetBaseFont:nn
{
\long\xdef\@basefontfeatures{#1}
\long\xdef\@basefontname{#2}
\global\@basefontsettrue
\ignorespaces
}
今では、失敗しています。その間に私がやったことは、tlmgr 経由で texlive を更新しただけです。自分のコードには何も変更していません。更新されたパッケージの中に fontspec があることに気付きました。
それをその中の一行に絞りましたfontspec_pass_args
。
他にも同じような問題を抱えている人はいますか?
編集: 間違いなく fontspec コードの変更です (この謙虚なユーザーが言うには)。\__fontspec_pass_args:nnn
自分のコードでそれが現れるところはすべて編集しました。すると、フォント定義では、以前とは異なり、オプションの括弧を使用する必要がありました (機能が不要な場合でも)。これで、\SetBaseFont[]{Some Font}
コードはコンパイルされます。幸いなことに、問題のあるコードが何をしようと、それは私にとって必要のないことだったのです。より単純な定義のフォントに同様のコードを使用したので、これは問題ではない\long\xdef
ことに注意してください。
さらに編集:
ログ ファイル (上記のように編集してコードをコンパイルしたら) に、次のようなメッセージが多数表示されます。以前に見た覚えはありませんが、単に気付かなかっただけかもしれません。これはTU
fontspec に関係しているので、例を示します。この問題は実際には microtype によって検出されました。私が使用しているフォントはすべて Open Type です。
Package microtype Warning: Unknown slot number of character
(microtype) `\textgreater '
(microtype) in font encoding `TU' in protrusion list
(microtype) `T1-default'.
それは関連しているかもしれないし、そうでないかもしれない。
さらにもう一度:
私の質問は、実はそれ自体で答えが出ています。エラーの原因はfontspec_pass_args
、fontspec の最新バージョン (3 週間前の 2.5c) にそのコマンドがなくなったというだけのことです。したがって、他の人が私の問題を経験していないのは、彼らが自分のコードで古い fontspec コードを模倣していないからです。しかし、TU に関する奇妙なメッセージは依然として存在し、謎に包まれています。
答え1
あなたの質問には2つの側面があります:
microtype / TU 関連の問題は、近々予定されている LaTeX2e のアップデートで修正される予定です。
コード破損に関しては、expl3 プログラミング スタイル ガイド (l3styleguide.pdf) を参照してください。
プライベート関数 ( で始まるもの
\__
) はモジュール間で使用しないでください。
しかし、それはおそらくあまりにも簡潔な説明だ:)
この\__fontspec_pass_args:nnn
関数はオプションの引数を操作するために設計されており、次のように記述できます。
\fontspec[<options>]{fontname}
または
\fontspec{fontname}[<options>]
だがしかし
\fontspec[<options>]{fontname}[<options>]
これは、何と言うべきか、むしろ不利にxparse
これは、コマンド引数を処理するための一貫した方法を提供するというパッケージの一般的な理念に反するため、tex.sx チャット ルームの LaTeX3 専門家の間では反対されています。
そのため、残念ながら、これを削除するのにしばらく時間がかかりましたが、現在はfontspec
「二重オプション」形式も許可されています。
\fontspec[<options>]{fontname}[<options>]
これは次のようなものを使用します
\DeclareDocumentCommand \fontspec { O{} m O{} }
サードパーティのコードでは、 によって提供された古い動作を再現する必要はありませんでした\__fontspec_pass_args:nnn
。
実際、 の API は、fontspec
内部コマンドを使用せずにフォントをロードする標準的な方法を提供します\__
。それでも必要なものが提供されない場合は、Github リポジトリで機能リクエストを自由に提出してください。