
Я создаю документ, который выводит уравнение, некоторые части которого отображаются или не отображаются в зависимости от команд, которые я задал в другом файле.
команды выглядят так:
\newcommand\coefficient{1.25}
Я хочу, чтобы этот коэффициент отображался в уравнении, если он не равен нулю и не равен 1 или -1. Если он положительный, он должен выдаваться как -1,25 (сменить знак). Пока что я делаю это так:
\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}
Это отображает значение, если оно не равно 0, 1 или -1, показывает знак «-», если оно равно -1, и не отображает часть x(k-1), если значение равно 0.
Теперь для моего уравнения я хотел бы изменить знак так, чтобы каждое положительное значение, определенное в команде, выводилось как отрицательное в уравнении, а каждое отрицательное значение выводилось как положительное (что сложнее).
Как это сделать (желательно без использования дополнительных пакетов)?
решение1
Вот решение, которое делает то, что вам нужно. К сожалению, невозможно выполнять арифметические операции с плавающей точкой с разумной схемой ввода без загрузки пакета, поэтому эта команда не может выполнять никаких арифметических операций.
\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}
решение2
Тымогсделать это без дополнительных пакетов, но зачем?
\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}
Версия *
- предназначена для печати первого коэффициента: если он положительный, знак +
следует опустить.