Conversão de sinal de comprimento no modo matemático

Conversão de sinal de comprimento no modo matemático

Estou configurando um documento que gera uma equação, com algumas partes sendo exibidas ou não, dependendo dos comandos que defini em um arquivo diferente.

os comandos ficam assim:

\newcommand\coefficient{1.25}

Quero que esse coeficiente apareça na equação se for diferente de zero e não 1 ou -1. Se for positivo, deverá resultar em -1,25 (sinal de mudança). Até agora estou fazendo assim:

\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}

O que isso faz é exibir o valor quando não for 0, 1 ou -1, mostrar um - se for -1 e não mostrar a parte x(k-1) caso o valor seja 0.

Agora, para minha equação, gostaria de alterar o sinal para que cada valor positivo definido no comando seja negativo na equação e cada valor negativo seja positivo (o que é mais difícil).

Como posso fazer isso (de preferência sem usar pacotes adicionais)?

Responder1

Aqui está uma solução que faz o que você deseja. Infelizmente, não é possível fazer matemática de ponto flutuante com um esquema de entrada lógico sem carregar um pacote, então este comando não pode fazer nenhuma aritmética.

\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} 

Responder2

Vocêpoderiafaça isso sem pacotes adicionais, mas por quê?

\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}

O *-version serve para imprimir o primeiro coeficiente: se for positivo, o +sinal deve ser omitido.

insira a descrição da imagem aqui

informação relacionada