pict2e: マクロから挿入された小数点の傾き引数は使用できません

pict2e: マクロから挿入された小数点の傾き引数は使用できません

私は、パッケージを使用して非標準演算子を画像として描画し、さまざまな数学モードに合うようにスケーリングすることで、非標準演算子を実装しています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

関連情報