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用文字十进制数替换调用,编译就会成功。我知道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

事实上,参数存储在一个临时宏中,并且代码支持十进制数,这让我相信这是一个错误。要修复它,你可以用 替换这两个\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

相关内容