
Ich implementiere nicht standardmäßige Operatoren, indem ich sie mithilfe des pict2e
Pakets als Bilder zeichne und sie dann so skaliere, dass sie in die verschiedenen mathematischen Modi passen. Ich speichere die Parameter des Bildes in externen Makros und rufe sie im picture
Textkörper auf.
Hier ist ein Minimalbeispiel:
\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}
Beim Kompilieren auf Overleaf und meiner lokalen TeX Live-Installation tritt jedoch ein Fehler auf:Fehlt = eingefügt für\ifnum
. Darauf folgt ein weiterer Fehler:Fehlende Nummer, wird als 0 behandelt\decimal
. Beachten Sie, dass sich dieses Verhalten wiederholt, wenn ich das Makro mit definiere \newcommand
. Es passiert auch, wenn die Zahl einen Dezimalpunkt, aber keinen Bruchteil hat (z. B. 3. und 3.0).
Dieses Verhalten tritt bei auf \vector
, jedoch nicht bei \qbezier
oder einem der anderen Bildbefehle.
Wenn ich den \decimal
Aufruf durch eine wörtliche Dezimalzahl ersetze, ist die Kompilierung erfolgreich. Ich weiß, dass pict2e
echte Steigungsargumente unterstützt werden, im Gegensatz zur Koprimalitätsbeschränkung von picture
. Ich weiß auch, dass \ifnum
nur auf Ganzzahlen wirkt.
Warum schlägt die Kompilierung in diesem Fall fehl, und warum nur mit \line
? Wie kann ich \line
aus einem Makro richtig ein Dezimalargument für die Steigung angeben?
Antwort1
Dies war ein Fehler in pict2e
. Ich habe den Betreuern eine E-Mail geschickt und Rolf hat positiv geantwortet. Er hat die folgenden Änderungen vorgenommen und das Problem sollte jetzt behoben sein (Version 0.3c, 20.08.2019).
Das Makro \pIIe@checkslopeargs
führte früher Folgendes aus:
\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}
Es speichert das erste Argument in einem temporären Makro ( \def\@tempa{#1}
), erweitert dann dieses temporäre Makro und ruft \pIIe@checkslopearg
damit auf. Die Zeile
\def\@tempa{#1}\expandafter\pIIe@checkslopearg\@tempa.:{#3}
macht genau das gleiche wie die einfachere
\pIIe@checkslopearg#1.:{#3}
und wenn erweitert wird und in \pIIe@checkslopearg
aufgeteilt wird , findet es den Punkt nicht, wenn er in Ihrem Makro versteckt ist, aber es funktioniert, wenn Sie ihn explizit übergeben. Danach geht eine Dezimalzahl in einen Test und wird im Wesentlichen zu , was mit fehlschlägt .#1
.
\decimal
\ifnum
\ifnum3.2<\z@
Missing = inserted for \ifnum
Die Tatsache, dass das Argument in einem temporären Makro gespeichert ist und der CodetutDezimalzahlen unterstützen, lässt mich glauben, dass es sich hier um einen Fehler handelt. Um ihn zu beheben, können Sie die beiden \def
durch ersetzen \edef
. Ich habe außerdem ein fehlendes Leerzeichen in einem Makro hinzugefügt, das eine unnötige Erweiterung auslösen würde.
Fügen Sie dies nach dem Laden in Ihre Präambel ein 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