我正在通过使用包将非标准运算符绘制为图片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