数式モードでの長さの符号変換

数式モードでの長さの符号変換

別のファイルに設定したコマンドに応じて、一部の部分が表示されたり表示されなかったりする方程式を出力するドキュメントを設定しています。

コマンドは次のようになります:

\newcommand\coefficient{1.25}

この係数が 0 以外で、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 の場合は - を表示し、値が 0 の場合は x(k-1) の部分を表示しません。

ここで、私の方程式では、コマンドで定義されたすべての正の値が方程式で負の値として出力され、すべての負の値が正の値として出力されるように、符号を変更したいと思います (これはより困難です)。

これをどうすれば実行できますか (できれば追加のパッケージを使用せずに)?

答え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}

-バージョン*は印刷する最初の係数用です。係数が正の場合、符号は+省略する必要があります。

ここに画像の説明を入力してください

関連情報