
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.