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. Я отправил письмо сопровождающим, и Рольф ответил положительно. Он включил изменения ниже, и проблема должна быть исправлена ​​сейчас (версия 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

Связанный контент