
Ich erstelle ein Dokument, das eine Gleichung ausgibt, wobei einige Teile je nach den Befehlen, die ich in einer anderen Datei festgelegt habe, angezeigt werden oder nicht.
die Befehle sehen folgendermaßen aus:
\newcommand\coefficient{1.25}
Ich möchte, dass dieser Koeffizient in der Gleichung angezeigt wird, wenn er ungleich Null und nicht 1 oder -1 ist. Wenn er positiv ist, sollte er als -1,25 ausgegeben werden (Vorzeichen ändern). Bisher mache ich es so:
\documentclass[border=10pt,convert={density=300,size=1080x800,outext=.png}]{standalone}
\input{coefficients.tex}
\usepackage{amsmath}
\begin{document}
$\displaystyle
y(k) =
\ifdim\dimexpr\coefficient pt =0pt
\else
\ifdim\dimexpr\coefficient pt >0pt
+
\else
\fi
\ifdim\dimexpr\coefficient pt=1pt
\else
\ifdim\dimexpr\coefficient pt=-1pt
-
\else
\coefficient
\fi
\fi
x(k-1)
\fi
+ 5
$
\end{document}
Dies bewirkt, dass der Wert angezeigt wird, wenn er nicht 0, 1 oder -1 ist, ein - angezeigt wird, wenn er -1 ist, und der Teil x(k-1) nicht angezeigt wird, wenn der Wert 0 ist.
Nun möchte ich für meine Gleichung das Vorzeichen ändern, sodass jeder im Befehl definierte positive Wert in der Gleichung als negativ und jeder negative Wert als positiv ausgegeben wird (was schwieriger ist).
Wie kann ich dies tun (vorzugsweise ohne zusätzliche Pakete zu verwenden)?
Antwort1
Hier ist eine Lösung, die das tut, was Sie wollen. Leider ist es nicht möglich, Gleitkommaberechnungen mit einem vernünftigen Eingabeschema durchzuführen, ohne ein Paket zu laden, daher kann dieser Befehl keine Arithmetik durchführen.
\documentclass{article}
\makeatletter
\def\printcoefficient#1#2{%
\ifdim\dimexpr#1pt=0pt\else
\ifdim\dimexpr#1 pt >0pt%
+%
\fi
\ifdim\dimexpr#1pt=1pt\else
\ifdim\dimexpr#1pt=-1pt%
-%
\else
\expandafter\pc@removepoint\the\dimexpr#1pt%
\fi
\fi
#2%
\fi
}
\def\printnegativecoefficient#1{\printcoefficient{-#1}}
\begingroup\lccode`8=`p\lccode`9=`t\lowercase{\endgroup
\def\pc@removepoint#189{#1}
}
\makeatother
\begin{document}
$1\printcoefficient{0}{x}$
$1\printcoefficient{1}{x}$
$1\printcoefficient{2}{x}$
$1\printcoefficient{-1}{x}$
$1\printcoefficient{-1.2}{x}$
$1\printcoefficient{1.2}{x}$
$1\printnegativecoefficient{0}{x}$
$1\printnegativecoefficient{1}{x}$
$1\printnegativecoefficient{2}{x}$
$1\printnegativecoefficient{-1}{x}$
$1\printnegativecoefficient{-1.2}{x}$
$1\printnegativecoefficient{1.2}{x}$
\end{document}
Antwort2
Dukönnteohne Zusatzpakete machen, aber warum?
\documentclass[border=10pt]{standalone}
\usepackage{amsmath}
\usepackage{xfp} % also loads expl3
\ExplSyntaxOn
\NewExpandableDocumentCommand{\cf}{sm}
{
\fp_compare:nF { #2 < \c_zero_fp } { \IfBooleanF { #1 } { + } }
\fp_compare:nF { #2 = \c_one_fp }
{
\fp_compare:nTF { #2 = -\c_one_fp }
{ - }
{ #2 }
}
}
\ExplSyntaxOff
\newcommand{\constA}{-2.5}
\newcommand{\constB}{1.35}
\newcommand{\constC}{1}
\newcommand{\constD}{-1}
\begin{document}
$\displaystyle
y(k) =
\cf{\constA}x(k-1)
\cf{\constB}x^2
\cf{\constC}x^3
\cf{\constD}x^4
\qquad
z(k) =
\cf*{\constC}{x^3}
$
\end{document}
Die *
-Version ist für den ersten zu druckenden Koeffizienten: Wenn er positiv ist, +
sollte das Vorzeichen weggelassen werden.