简化算术 +-, -+, --, 1x, -1x

简化算术 +-, -+, --, 1x, -1x

我制作了一些命令 \pcoef 和 \mcoef,它们分别将算术表达式中的 +- 和 -+ 简化为 -,将 -- 简化为 +,以及将 1x 和 -1x 分别简化为 x 和 -x。它们并不令人满意,因为它们的使用是一种非自然的算术转录。

我想要生成可以以“自然”方式使用的 +、- 和 * 命令。

以下代码包含我所做的命令以及我想要的内容:

\documentclass[12pt,a4paper,notitlepage]{extarticle}
\usepackage{xfp} %for \fpeval,randint
\pagenumbering{gobble}
\setlength\parindent{0pt}

% the commands i made: not very natural use
\newcommand{\coef}[1]{\ifnum\numexpr#1=1\else\ifnum\numexpr#1=-1 -\else #1\fi\fi}
\newcommand{\pcoef}[1]{\ifnum\numexpr#1=1 + \else\ifnum\numexpr#1=-1 - \else\ifnum\numexpr#1>0 + #1 \else\ifnum\numexpr#1=0 + #1 \else #1\fi\fi\fi\fi}
\newcommand{\mcoef}[1]{\ifnum\numexpr#1=1 - \else\ifnum\numexpr#1=-1 + \else\ifnum\numexpr#1>0 - #1\else + \fpeval{-#1}\fi\fi\fi}

% the commands i would like:
\newcommand{\+}{} % i don't need to move margin
\renewcommand{\-}{}
\renewcommand{\*}{} % i don't need line break in maths

\begin{document}

% data
% later \a, \b, \c, \d will take random values, positive or negative
\edef\a{ 15 }
\edef\b{ -17 }
\def\c{ 1 }
\def\d{ -1 }

{\bf what i can do, but with non natural arithmetic transcription } \\[2mm]
$\a \pcoef{\b}$ \\ % a+b : 15+-17 is changed to 15-17
$\a \mcoef{\b}$ \\ % a-b : 15--17 is changed to 15+17
$\coef{\a} x \pcoef{\b}$ \\ % ax+b : 15x+-17  is changed to 15x-17
$\coef{\b} x \pcoef{\a}$ \\ % bx+a : -17x+15  is not changed

{\bf how to correct this, for a more natural arithmetics, like $\backslash$a$\backslash$+$\backslash$b, $\backslash$a$\backslash$-$\backslash$b, $\backslash$a$\backslash$*x$\backslash$+$\backslash$b,etc } \\[2mm]

$\backslash$+:\\ %\+ :
$\a + \b =\ $ \leftarrow the $\backslash$+ instead of + should replace +- by -. \\

$\backslash$-:\\ %\- :
$\a - \b =\ $ \leftarrow the $\backslash$- instead of - should replace -+ by -, and -- by +. \\

$\backslash$*:\\ %\*
%\* not sure if possible, since it might regcognize an arbitraby long integer before
% an alternative would therefore be \*{c}x 
$\c * x =\ $\leftarrow the $\backslash$* instead of * should replace 1*x by x. \\
$\d * x =\ $\leftarrow the $\backslash$* instead of * should replace -1*x by -x. \\
$\a * x =\ $\leftarrow the $\backslash$* instead of * should replace a*x by ax if a is neither 1 or -1. \\

\end{document}

任何能帮助实现这一目标的帮助都将不胜感激。

答案1

附有\regex_replace_all文档interface3.pdf

编辑2:

EDIT3:根据数学老师的评论,更正 de \regex_replace_all:nnN { 1x } { x } #1en\regex_replace_all:nnN { (^|[^\d])1([a-zA-Z\c{[A-Za-z]*}]+) } { \1\2 } #1

代码

            \documentclass{article}
    %https://tex.stackexchange.com/questions/668419/simplify-arithmetics-1x-1x
    \ExplSyntaxOn

    \NewDocumentCommand { \simp } { m m }
    {
    %https://www.alanshawn.com/latex3-tutorial/#macro-expansion-control-v
    %
    %   Constructing a command in token list
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % #1 to hold the result of the simplication
    % #2 the expression
    \tl_set:Nx #1 { #2 }
    \regex_replace_all:nnN { +- } { - } #1
    \regex_replace_all:nnN { -- } { + } #1
    %\regex_replace_all:nnN { 1x } { x } #1 <-- wrong (for instance 11x)
    \regex_replace_all:nnN { (^|[^\d])1([a-zA-Z\c{[A-Za-z]*}]+) } { \1\2 } #1
    }

    \ExplSyntaxOff
    \begin{document}
    \simp{\mysimp}{5+1x}
    $\mysimp$


    \simp{\mysimp}{5+11x}
    $\mysimp$

    \simp{\mysimp}{5+1\cos(t)}
    $\mysimp$

    \simp{\mysimp}{1\ln(x)}
    $\mysimp$

    \simp{\mysimp}{11\ln(t)}
    $\mysimp$

    %\newcommand{\a}{1}<----  ERROR
    \newcommand{\mya}{1}
    \newcommand{\myb}{-1}
    %
    % i use the name \mysimp, you can use another name
    %
    \simp{\mysimp}{\mya+\myb}
    $\mysimp$


    \renewcommand{\mya}{2}
    \renewcommand{\myb}{-2}
    \newcommand{\myc}{1}
    \newcommand{\myd}{-3}
    \simp{\mysimp}{\mya+\myb}
    \simp{\mysimpdeux}{\myc x-\myd}
    $\frac{\mysimp}{\mysimpdeux}$

    \renewcommand{\mya}{-3}
    \renewcommand{\myb}{3}
    \renewcommand{\myc}{-1}
    \renewcommand{\myd}{5}
    \simp{\mysimp}{\frac{\mya+\myb}{\myc \cos(t)-\myd}}
    $\mysimp$
    \end{document}

在此处输入图片描述

EDIT4 分数简化的答案的开头。

            \documentclass{article}
        \ExplSyntaxOn
        \begin{document}
        \tl_set:Nn \l_tmpa_tl { -\ln(x) }
        $\l_tmpa_tl \rightarrow$           
        \regex_replace_all:nnN { \- \c{ln} } { \c{log} } \l_tmpa_tl        
        $\l_tmpa_tl$\\
        %
        \tl_set:Nn \l_tmpa_tl { -\frac{-3}{4} }
        %\tl_analysis_show:N \l_tmpa_tl 
        $\l_tmpa_tl \rightarrow$           
        \regex_replace_all:nnN { \- \c{frac} \cB\{ \- 3 \cE\} }  { \c{frac} \cB\{ 3 \cE\} } \l_tmpa_tl        
        $\l_tmpa_tl$
        \ExplSyntaxOff
    \end{document}

在此处输入图片描述

答案2

如果你坚持使用 LaTeX,这绝对是一个乏味的问题。如果你愿意使用外部程序,就会变得容易得多。LaTeX 是一个了不起的文档准备系统。使用鼠尾草该软件包将允许你访问计算机代数系统,称为智者和 Python 编程语言。下面是使用 的快速解决方案sagetex

\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
a = 15
b= -17
c = 1 
d = -1

def Add(a,b):
  if b>=0:
    return r"%s+%s"%(a,b)
  else:
    return r"%s-%s"%(a,abs(b))

def Sub(a,b):
  if b>=0:
    return r"%s-%s"%(a,b)
  else:
    return r"%s+%s"%(a,abs(b))

def Poly(a,b):
  R.<x>=ZZ[] 
  return a*x+b
\end{sagesilent}
Calculating $a+b$ where $a = \sage{a}$ and $b = \sage{b}$ 
yields $\sagestr{Add(a,b)}=\sage{a+b}$. Moreover $a-b$ is 
$\sagestr{Sub(a,b)}=\sage{a-b}$. For the linear expression $ax+b$ where
$a=\sage{d}$ and $b=\sage{b}$ we have $\sage{Poly(d,b)}$. Reversing the
terms gives $\sage{Poly(b,d)}$. Sage can even handle the multiplication of 
polynomials: $(\sage{Poly(c,d)})\cdot(\sage{Poly(b,b)})=\sage{Poly(c,d)*Poly(b,b)}$.
\end{document}

在Cocalc中运行的结果如下: 在此处输入图片描述

分配变量和定义函数的草稿(设置)位于sagesilent块中。这不会显示在您的文档中。此处使用的 Sage 输出涉及\sage\sagestr\sage用于计算(即数学模式中的事物),而\sagestr用于字符串。为了避免各种 LaTeX 字符出现问题,例如\我们使用 r""(原始字符串)。函数 Add(a,b) 可以推理如下:如果 b>=0,则返回原始字符串 r"%s+%s"%(a,b)。%s 是字符串数据的占位符。进入 2 个位置的是ab。由于此字符串涉及数字,我将其称为 $\sagestr{Add(a,b)}=\sage{a+b}$。Sage 是一种 CAS,在调用a+b时会以数字形式给出答案。如果为负数,则返回原始字符串减去 b 的绝对值,从而避免了这个问题。有了多项式,Sage 的威力就开始显现。该函数首先声明我们在具有整数系数的多项式环中工作,。告诉 Sage和是什么,它会负责解决您的问题。此外,通过使用数学对象而不是字符串,我可以让 Sage 负责将多项式与 相乘。\sage{a+b}breturn r"%s-%s"%(a,abs(b))a+-Poly(a,b)R.<x>=ZZ[]ab+-\sage{Poly(c,d)*Poly(b,b)}

搜索此网站以了解更多sagetex示例。我回答过涉及多项式的问题这里这里

最后,Sage 不是您的 LaTeX 发行版的一部分。您可以免费注册可钙帐户来尝试使用sagetexSage。如果您喜欢,可以将 Sage 下载到您的计算机并将其与您的 LaTeX 发行版同步。这对某些人来说是个问题;Cocalc 是最简单的入门方式。

相关内容