
Я реализую нестандартные операторы, рисуя их как картинки с помощью пакета 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
. Я отправил письмо сопровождающим, и Рольф ответил положительно. Он включил изменения ниже, и проблема должна быть исправлена сейчас (версия 0.3c, 20-08-2019).
Макрос, \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