
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, 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