
私は、パッケージを使用して非標準演算子を画像として描画し、さまざまな数学モードに合うようにスケーリングすることで、非標準演算子を実装していますpict2e
。画像のパラメータを外部マクロに保存し、本体で呼び出しますpicture
。
以下に最小限の例を示します。
\documentclass{article}
\usepackage{pict2e}
\def\num{3}
\def\decimal{3.2}
\newcommand*\testfigure{%
\begin{picture}(3,3)(0,0)
\put(0, 0){\line(0, \decimal){\num}}
\end{picture}
}
\begin{document}
\testfigure
\end{document}
しかし、これを Overleaf とローカルの TeX Live インストールでコンパイルすると、エラーが発生します。欠落 = 挿入\ifnum
. これに続いて別のエラーが発生します:欠番は0として扱われます\decimal
マクロを で定義すると、この動作が繰り返されることに注意してください\newcommand
。数値に小数点があっても小数部がない場合にも発生します (例: 3. と 3.0)。
この動作は では再現されます\vector
が、\qbezier
や他の画像コマンドでは再現されません。
\decimal
呼び出しをリテラルの 10 進数に置き換えると、コンパイルは成功します。pict2e
の相互素数制限とは対照的に、 は実数の傾き引数をサポートすることがわかっています。 は整数にのみ作用するpicture
こともわかっています。\ifnum
この場合、なぜコンパイルが失敗し、 の場合のみ失敗するのでしょうか?マクロから小数傾斜引数を\line
適切に与えるにはどうすればよいですか?\line
答え1
これは のバグでしたpict2e
。メンテナーにメールしたところ、Rolf から肯定的な返信がありました。彼は以下の変更を組み込み、問題は修正されたはずです (バージョン 0.3c、2019 年 8 月 20 日)。
マクロは\pIIe@checkslopeargs
次のことを実行します:
\renewcommand*\pIIe@checkslopeargs[3]{%
\def\@tempa{#1}\expandafter\pIIe@checkslopearg\@tempa.:{#3}%
\def\@tempa{#2}\expandafter\pIIe@checkslopearg\@tempa.:{#3}%
\ifdim #1\p@=\z@ \ifdim #2\p@=\z@ \@badlinearg \fi\fi}
最初の引数を一時マクロ(\def\@tempa{#1}
)に格納し、その一時マクロを展開して呼び出します\pIIe@checkslopearg
。ただし、
\def\@tempa{#1}\expandafter\pIIe@checkslopearg\@tempa.:{#3}
より単純なものと全く同じです
\pIIe@checkslopearg#1.:{#3}
\pIIe@checkslopearg
が展開され、#1
で分割されるとき.
、ドットがマクロ内に隠れている場合はドットが見つかりません\decimal
が、明示的に渡した場合は機能します。その後、小数が\ifnum
テストに入り、基本的に になり\ifnum3.2<\z@
、 で失敗しますMissing = inserted for \ifnum
。
引数が一時マクロに保存され、コードがする小数点数をサポートしていないため、これはバグだと思われます。これを修正するには、 2 つを\def
に置き換えます\edef
。また、マクロに不足しているスペースを追加したため、不要な展開がトリガーされていました。
ロード後のプリアンブルに以下を記入してくださいpict2e
:
\makeatletter
\renewcommand*\pIIe@checkslopeargs[3]{%
% V \edef instead of \def
\edef\@tempa{#1}\expandafter\pIIe@checkslopearg\@tempa.:{#3}%
\edef\@tempa{#2}\expandafter\pIIe@checkslopearg\@tempa.:{#3}%
\ifdim #1\p@=\z@ \ifdim #2\p@=\z@ \@badlinearg \fi\fi}
\def\pIIe@checkslopearg #1.#2:#3{%
\def\@tempa{#1}%
\ifx\@tempa\empty\def\@tempa{0}\fi
\ifx\@tempa\space\def\@tempa{0}\fi% V added space
\ifnum\ifnum\@tempa<\z@-\fi\@tempa>#3 \@badlinearg \fi}
\makeatother