pict2e: Aus Makro eingefügtes Dezimallinien-Steigungsargument kann nicht verwendet werden

pict2e: Aus Makro eingefügtes Dezimallinien-Steigungsargument kann nicht verwendet werden

Ich implementiere nicht standardmäßige Operatoren, indem ich sie mithilfe des pict2ePakets 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 pictureTextkö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 \qbezieroder einem der anderen Bildbefehle.

Wenn ich den \decimalAufruf durch eine wörtliche Dezimalzahl ersetze, ist die Kompilierung erfolgreich. Ich weiß, dass pict2eechte Steigungsargumente unterstützt werden, im Gegensatz zur Koprimalitätsbeschränkung von picture. Ich weiß auch, dass \ifnumnur auf Ganzzahlen wirkt.

Warum schlägt die Kompilierung in diesem Fall fehl, und warum nur mit \line? Wie kann ich \lineaus 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@checkslopeargsfü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@checkslopeargdamit 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@checkslopeargaufgeteilt 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 \defdurch 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

verwandte Informationen