我制作了一些命令 \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:
\newcommand{\a}
导致错误,该命令\a
必须已在其他地方定义,我将其替换为\mya
- 我创建了第二个参数来保存简化的结果
- 附有教程https://www.alanshawn.com/latex3-tutorial/#macro-expansion-control-v,替换
\tl_set:Nn #1 { #2 }
为\tl_set:Nx #1 { #2 }
EDIT3:根据数学老师的评论,更正 de \regex_replace_all:nnN { 1x } { x } #1
en\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}
分配变量和定义函数的草稿(设置)位于sagesilent
块中。这不会显示在您的文档中。此处使用的 Sage 输出涉及\sage
和\sagestr
;\sage
用于计算(即数学模式中的事物),而\sagestr
用于字符串。为了避免各种 LaTeX 字符出现问题,例如\
我们使用 r""(原始字符串)。函数 Add(a,b) 可以推理如下:如果 b>=0,则返回原始字符串 r"%s+%s"%(a,b)。%s 是字符串数据的占位符。进入 2 个位置的是a
和b
。由于此字符串涉及数字,我将其称为 $\sagestr{Add(a,b)}=\sage{a+b}$。Sage 是一种 CAS,在调用a+b
时会以数字形式给出答案。如果为负数,则返回原始字符串减去 b 的绝对值,从而避免了这个问题。有了多项式,Sage 的威力就开始显现。该函数首先声明我们在具有整数系数的多项式环中工作,。告诉 Sage和是什么,它会负责解决您的问题。此外,通过使用数学对象而不是字符串,我可以让 Sage 负责将多项式与 相乘。\sage{a+b}
b
return r"%s-%s"%(a,abs(b))
a
+-
Poly(a,b)
R.<x>=ZZ[]
a
b
+-
\sage{Poly(c,d)*Poly(b,b)}
搜索此网站以了解更多sagetex
示例。我回答过涉及多项式的问题这里和这里。
最后,Sage 不是您的 LaTeX 发行版的一部分。您可以免费注册可钙帐户来尝试使用sagetex
Sage。如果您喜欢,可以将 Sage 下载到您的计算机并将其与您的 LaTeX 发行版同步。这对某些人来说是个问题;Cocalc 是最简单的入门方式。