texlive[67055] Master: sympycalc (8may23)

commits+karl at tug.org commits+karl at tug.org
Mon May 8 22:13:54 CEST 2023


Revision: 67055
          http://tug.org/svn/texlive?view=revision&revision=67055
Author:   karl
Date:     2023-05-08 22:13:54 +0200 (Mon, 08 May 2023)
Log Message:
-----------
sympycalc (8may23)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/libexec/ctan2tds
    trunk/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/lualatex/sympycalc/
    trunk/Master/texmf-dist/doc/lualatex/sympycalc/README.md
    trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.pdf
    trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.tex
    trunk/Master/texmf-dist/tex/lualatex/sympycalc/
    trunk/Master/texmf-dist/tex/lualatex/sympycalc/SympyCalc.sty
    trunk/Master/tlpkg/tlpsrc/sympycalc.tlpsrc

Added: trunk/Master/texmf-dist/doc/lualatex/sympycalc/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/sympycalc/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/lualatex/sympycalc/README.md	2023-05-08 20:13:54 UTC (rev 67055)
@@ -0,0 +1,7 @@
+SympyCalc is a package to work with Sympy with TeX printing.
+-----------------------------------------------------------------------------
+SympyCalc un package pour travailler avec le module Sympy et sa sortie LaTeX.
+-----------------------------------------------------------------------------
+Author : Cédric Pierquet
+email : cpierquet at outlook.fr
+Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/lualatex/sympycalc/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.pdf	2023-05-08 20:12:06 UTC (rev 67054)
+++ trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.pdf	2023-05-08 20:13:54 UTC (rev 67055)

Property changes on: trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.tex	2023-05-08 20:13:54 UTC (rev 67055)
@@ -0,0 +1,817 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
+% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[french,a4paper,11pt]{article}
+\def\SCversion{0.1.0}
+\def\SCdate{5 mai 2023}
+\usepackage[executable=python.exe]{pyluatex}
+\usepackage[svgnames]{xcolor}
+\usepackage{siunitx}
+\sisetup{locale=FR,output-decimal-marker={,},group-minimum-digits=4}
+\usepackage{amsmath,amssymb}
+%\usepackage{mathtools}
+\usepackage[bold-style=ISO,math-style=french]{unicode-math}
+\setmainfont{TeX Gyre Schola}
+\setmathfont{TeX Gyre Schola Math}
+\usepackage{SympyCalc}
+\usepackage{awesomebox}
+\usepackage{fontawesome5}
+\usepackage{enumitem}
+\usepackage{tabularray}
+\usepackage{fancyvrb}
+\usepackage{fancyhdr}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\lfoot{\sffamily\small [SympyCalc]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\providecommand\PSTricks{\textsf{PSTricks}\xspace}
+\let\pstricks\PSTricks
+\let\TikZ\tikzlogo
+\newcommand\TableauDocumentation{%
+	\begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}}
+		{\LARGE \LaTeX} & & & & &\\
+		& {\LARGE \hologo{pdfLaTeX}} & & & & \\
+		& & {\LARGE \hologo{LuaLaTeX}} & & & \\
+		& & & {\LARGE \TikZ} & & \\
+		& & & & {\LARGE \TeXLive} & \\
+		& & & & & {\LARGE \hologo{MiKTeX}} \\
+	\end{tblr}
+}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\usepackage[margin=1.5cm]{geometry}
+\setlength{\parindent}{0pt}
+\definecolor{LightGray}{gray}{0.9}
+
+\usepackage[most]{tcolorbox}
+\NewDocumentCommand\e{ }{\mathrm{e}}
+\RenewDocumentCommand\i{ }{\mathrm{i}}
+\newtcblisting{bloctext}[1][]{%
+	enhanced,width=0.93\linewidth,flush right,%
+	bicolor,size=title,%
+	colback=cyan!5!white,%
+	colbacklower=cyan!1!white,%
+	colframe=cyan!75!black,%
+	listing options={%
+		style=tcblatex,basicstyle=\small\ttfamily,%
+		tabsize=4,%
+		commentstyle={\itshape\color{violet}},
+		keywordstyle={\bfseries\color{DodgerBlue}},%
+		classoffset=0,%
+		keywords={frac,dfrac,int,sqrt},%
+		keywordstyle={\bfseries\color{DodgerBlue}},%
+		classoffset=1,%
+		morekeywords={sympycalc,dsympycalc,sympydev,dsympydev,sympyfact,dsympyfact,sympyderiv,dsympyderiv,sympyprim,dsympyprim,sympyintegr,dsympyintegr,sympylim,dsympylim,sympyfexpo,dsympyfexpo,sympyresol,dsympyresol,sympyresolC,dsympyresolC},%
+		keywordstyle={\bfseries\color{purple}},%
+		classoffset=2,%
+		morekeywords={solve},%
+		keywordstyle={\bfseries\color{ForestGreen}},%
+		classoffset=3,%
+		morekeywords={NoSimplif,Simplif},%
+		keywordstyle={\bfseries\color{OliveDrab}}
+	},%
+	overlay={\draw[cyan!75!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faCode} ;},%
+	#1
+}
+
+\usepackage{babel}
+\usepackage{textualicomma}
+\DeclareMathSymbol{;}\mathbin{operators}{'73} % \mathpunct à l'origine
+
+\tcbset{vignettes/.style={%
+	nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
+	boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,%
+	}
+}
+
+\tcbset{vignetteMaJ/.style={%
+	fontupper={\vphantom{pf}\footnotesize\ttfamily},
+	vignettes,colframe=ForestGreen!50!black,coltitle=white,colback=ForestGreen!25,%
+	overlay={\begin{tcbclipinterior}%
+			\fill[fill=ForestGreen!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{Black}{\scalebox{0.85}[0.75]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);%
+	\end{tcbclipinterior}}
+	}
+}
+
+\newcommand\Cle[1]{{\bfseries\sffamily\textlangle #1\textrangle}}
+\newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace}
+
+\begin{document}
+
+\setlength{\aweboxleftmargin}{0.07\linewidth}
+\setlength{\aweboxcontentwidth}{0.93\linewidth}
+\setlength{\aweboxvskip}{8pt}
+
+\pagestyle{fancy}
+
+\thispagestyle{empty}
+
+\vspace{2cm}
+
+\begin{center}
+	\begin{minipage}{0.75\linewidth}
+	\begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+		\begin{center}
+			\begin{tabular}{c}
+				{\Huge \texttt{SympyCalc [fr]}}\\
+				\\
+				{\LARGE Des outils pour utiliser les} \\
+				\\
+				{\LARGE capacités de \textsf{sympy} de \faPython, } \\
+				\\
+				{\LARGE avec le package \textsf{pyluatex}.} \\
+			\end{tabular}
+			
+			\bigskip
+			
+			{\small \texttt{Version \SCversion{} -- \SCdate}}
+		\end{center}
+	\end{tcolorbox}
+\end{minipage}
+\end{center}
+
+\begin{center}
+	\begin{tabular}{c}
+	\texttt{Cédric Pierquet}\\
+	{\ttfamily c pierquet -- at -- outlook . fr}\\
+	\texttt{\url{https://github.com/cpierquet/SympyCalc}}
+\end{tabular}
+\end{center}
+
+\vspace{0.25cm}
+
+{$\blacktriangleright$~~Compilation en \hologo{LuaLaTeX}, avec un accès \textsf{--shell-escape}, en \textit{partenariat} avec \textsf{pyluatex}.}
+
+\smallskip
+
+{$\blacktriangleright$~~Du calcul \textit{exact} avec des racines, de l'exponentielle, du logarithme, des complexes\ldots}
+
+\smallskip
+
+{$\blacktriangleright$~~Du calcul symbolique avec du développement, de la factorisation.}
+
+\smallskip
+
+{$\blacktriangleright$~~Des résolutions d'équations.}
+
+\smallskip
+
+{$\blacktriangleright$~~Du calcul différentiel, intégral.}
+
+\smallskip
+
+{$\blacktriangleright$~~Tout ce que \textsf{sympy} peut faire !}
+
+\vspace{1cm}
+
+\begin{center}
+	\begin{tcolorbox}[enhanced,colframe=ForestGreen,colback=lightgray!5,center,width=0.95\linewidth,drop fuzzy shadow=lightgray]
+	$1+\dfrac76 = \dsympycalc{1+7/6}$ et $\left(\e^5 +1 \right) \times \left(\e^5-1 \right) = \sympycalc{(exp(5)+1)*(exp(5)-1)}$
+	
+	\medskip
+	
+	\hfill$3+\i\sqrt{3} = \dsympyfexpo{3+I*sqrt(3)}$\hfill~
+	
+	\medskip
+	
+	\hfill$I=\displaystyle\int_0^{4} (x+3)\,\e^{2x}\,\text{d}x = \dsympyintegr{(x+3)*exp(2*x)}{0}{4}$
+	
+	\medskip
+	
+	\hfill$\lim\limits_{x \to +\infty} \sqrt{\dfrac{2x^2+1}{x^2-5}} = \sympylim{sqrt((2*x**2+1)/(x**2-5))}{+oo}$\hfill~
+	
+	\medskip
+	
+	$10\,\e^{4x+5}=2$ : $\mathcal{S}=\dsympyresol{10*exp(4*x+5)=2}$
+	
+	\hfill$f(t)=(t+3)\,\e^{2t} \implies f'(t) = \sympyderiv{(t+3)*exp(2*t)}[t]$
+	\end{tcolorbox}
+\end{center}
+
+\vspace{0.5cm}
+
+%\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !}
+
+%\smallskip
+
+\vfill
+
+\hrule
+
+\medskip
+
+\TableauDocumentation
+
+\medskip
+
+\hrule
+
+\medskip
+
+\newpage
+
+\phantomsection
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\newpage
+
+\part{Introduction}
+
+\section{Le package SympyCalc}
+
+\subsection{Introduction et conventions}
+
+\begin{noteblock}
+Le package \textit{propose} des outils pour utiliser les capacités du module \textsf{sympy} de \textsf{python} et les \textit{formater} en \LaTeX{} :
+
+\begin{itemize}
+	\item calcul exact (dans la mesure du possible) ;
+	\item calcul symbolique (dans la mesure du possible) :
+	\begin{itemize}
+		\item factorisation, développement, simplification ;
+		\item dérivation, intégration, limites ;
+		\item résolution d'équations.
+	\end{itemize}
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{noteblock}
+
+\begin{importantblock}
+À noter que les calculs -- en interne -- sont :
+
+\begin{itemize}
+	\item effectués par le module \textsf{sympy} ;
+	\item formatés par la fonction \texttt{latex()} du module \textsf{sympy} ;
+	\item sortis en \LaTeX{} avec quelques ajustements.
+\end{itemize}
+
+Les ajustements (qu'on pourrait qualifier de \textit{mini-patchs}) permettent :
+
+\begin{itemize}
+	\item de forcer les résultats sous forme de fraction (grâce -- en interne -- au recours à \texttt{S.One}) ;
+	\item d'utiliser la notation \texttt{ln} (\textsf{sympy} utilise \texttt{log} par défaut) ;
+	\item d'utiliser l'écriture du \texttt{e} et du \texttt{i} en \textsf{romain} ;
+	\item de forcer l'écriture du \og + \fg{} avant \og $\infty$ \fg.
+\end{itemize}
+
+Hormis le \textit{forçage} du \texttt{ln}, et du $\mathtt{+\infty}$, conventions sur \texttt{e} et \texttt{i} peuvent être \textit{désactivées}.
+\end{importantblock}
+
+\begin{tipblock}
+Le package propose également de quoi utiliser (et formater) toute commande exprimée en syntaxe \textsf{sympy}.
+
+\smallskip
+
+Le module \textsf{sympy} est chargé par le package, avec les variables symboliques \texttt{x}, \texttt{y}, \texttt{z} et \texttt{t}.
+\end{tipblock}
+
+\begin{warningblock}
+L'utilisation de \textsf{pyluatex} (en tant que passerelle entre \textsf{python} et \LaTeX) nécessite une compilation adaptée, à savoir en \hologo{LuaLaTeX} et en activant le mode \textsf{--shell-escape}. Le module \textsf{sympy} doit donc être installé pour que l'exécutable \textsf{python} qui sera paramétré le \textit{trouve} !.
+\end{warningblock}
+
+\subsection{Chargement du package}
+
+\begin{importantblock}
+Le package (qui ne charge \textit{que} \textsf{xstring}) se charge de manière classique, une fois \textsf{pyluatex} lui-même correctement chargé.
+
+\smallskip
+
+Compte-tenu de la spécificité de \textsf{pyluatex} et du paramétrage du chemin \textsf{python}, c'est à l'utilisateur de le charger en adéquation avec son installation !
+
+\smallskip
+
+Les packages adaptés aux formules mathématiques sont également nécessaires, mais compte-tenu de leurs diversités, l'utilisateur choisira celui (ceux) qu'il jugera nécessaire(s).
+\end{importantblock}
+
+\begin{bloctext}[listing only]
+%compilation en lualatex + shell-escape !!
+\usepackage{mathtools}                           %package pour les maths
+\usepackage[executable=python.exe]{pyluatex}     %à adapter !
+\usepackage{SympyCalc}
+\end{bloctext}
+
+\newpage
+
+\section{Philosophie du package}
+
+\subsection{Fonctionnement global}
+
+\begin{noteblock}
+Le package propose des commandes génériques, qui permettent de \textit{traiter} tout commande \textsf{sympy}, ainsi que des commandes spécifiques qui sont en fait des \textit{raccourcis} de commandes usuelles en \textsf{sympy}.
+
+\smallskip
+
+Autant que peut se faire, les commandes sont assez explicites sur leur fonctionnement, et elles reposent sur le même principe :
+
+\begin{itemize}
+	\item \texttt{\textbackslash \textcolor{purple}{sympy...}} : commande qui simplifie (par défaut), avec règles typographiques \texttt{[fr]} \textsf{romain} ;
+	\item \texttt{\textbackslash \textcolor{purple}{dsympy...}} : commande qui simplifie (par défaut), avec règles typographiques \texttt{[fr]} \textsf{romain}, et affichage en \texttt{\textbackslash displaystyle} ;
+	\item \texttt{\textbackslash \textcolor{purple}{sympy...*}} : commande qui simplifie (par défaut), avec règles typographiques \texttt{[fr]} \textsf{italique} ;
+	\item \texttt{\textbackslash \textcolor{purple}{dsympy...*}} : commande qui simplifie (par défaut), avec règles typographiques \texttt{[fr]} \textsf{romain}, et affichage en \texttt{\textbackslash displaystyle}.
+\end{itemize}
+
+Dans certains cas la \textit{simplification} ne propose pas une sortie \textit{classique}, et il est possible d'empêcher la simplification grâce à l'argument optionnel \texttt{<\textcolor{OliveDrab}{NoSimplif}>}.
+
+\smallskip
+
+La variable est par défaut \texttt{x}, mais peut-être modifiée grâce à l'argument \texttt{[variable]}.
+\end{noteblock}
+
+\subsection{Commandes disponibles}
+
+\begin{bloctext}[listing only]
+%commandes génériques
+\sympycalc(*)<NoSimplif>{commande sympy}
+\dsympycalc(*)<NoSimplif>{commande sympy}
+
+%commandes spécifiques, sortie standard, détaillées plus loin
+\sympydev(*)<NoSimplif>{expr sympy}[variable]
+\sympyfact(*)<NoSimplif>{expr sympy}
+\sympyderiv(*)<NoSimplif>{expr sympy}[variable]
+\sympyprim(*)<NoSimplif>{expr sympy}[variable]
+\sympyintegr(*)<NoSimplif>{expr sympy}[variable]{borne inf}{borne sup}
+\sympylim(*)<NoSimplif>{expr sympy}[variable]{point}[côté]
+\sympyfexpo(*)<NoSimplif>{complexe sympy}
+\sympyresol(*){equation sympy}[variable]
+\sympyresolC(*){equation sympy}[variable]
+
+%commandes spécifiques, sortie displaystyle, détaillées plus loin
+\dsympydev(*)<NoSimplif>{expr sympy}[variable]
+\dsympyfact(*)<NoSimplif>{expr sympy}
+\dsympyderiv(*)<NoSimplif>{expr sympy}[variable]
+\dsympyprim(*)<NoSimplif>{expr sympy}[variable]
+\dsympyintegr(*)<NoSimplif>{expr sympy}[variable]{borne inf}{borne sup}
+\dsympylim(*)<NoSimplif>{expr sympy}[variable]{point}[côté]
+\dsympyfexpo(*)<NoSimplif>{complexe sympy}
+\dsympyresol(*){equation sympy}[variable]
+\dsympyresolC(*){equation sympy}[variable]
+\end{bloctext}
+
+\begin{importantblock}
+Dans certains cas, la sortie obtenue n'est pas celle attendue, que ce soit avec ou sans \texttt{<Simplif>}, et donc il s'agira de saisir les commandes \textsf{sympy} \textit{manuellement}.
+\end{importantblock}
+
+\begin{tipblock}
+L'\og infini \fg{} est disponible en \textsf{sympy}, grâce à \texttt{+oo} ou \texttt{-oo}.
+
+\smallskip
+
+Un petit \textit{guide} pour \textsf{sympy} est disponible à : \url{https://hashdork.com/fr/sympy-library-guide/}.
+\end{tipblock}
+
+\newpage
+
+\section{Limitations}
+
+\begin{warningblock}
+Pour le moment c'est le package \textsf{pyluatex} qui est privilégié, mais des tests sont en cours pour une compatibilité éventuelle avec d'autres packages pouvant travailler avec \textsf{python}.
+\end{warningblock}
+
+\begin{warningblock}
+Le formatage des flottants n'est pas géré par \texttt{\textbackslash num} de \textsf{sinuitx}, donc l'écriture des éventuelles valeurs approchées ne seront pas forcément cohérentes avec les autres formatages dans le document\ldots
+
+\smallskip
+
+Le remplacement éventuel du \texttt{e} en \textsf{romain} risque de ne pas fonctionner quand le résultat contient du \og e tout seul \fg\ldots
+
+\smallskip
+
+Des espacements \textit{non voulus} peuvent apparaître lors de la transcription en \LaTeX, donc le résultat formaté peut être légèrement différent de ce que peut attendre l'utilisateur\ldots
+
+\smallskip
+
+La transformation automatique du \texttt{oo} en \texttt{+oo} ne détecte pas si le calcul est effectué avec des complexes, donc prudence sur les limites notamment\ldots
+\end{warningblock}
+
+\newpage
+
+\part{Les commandes}
+
+\section{La commande générique}
+
+\subsection{Présentation}
+
+\begin{cautionblock}
+La commande générique pour formater une sortie \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympycalc}} ou \texttt{\textbackslash \textcolor{purple}{dsympycalc}}.
+
+\smallskip
+
+Elle permet de \textit{parser} du code \textsf{sympy} et de formater la sortie avec les règles typographiques usuelles.
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes génériques
+\sympycalc(*)<NoSimplif>{commande sympy}
+\dsympycalc(*)<NoSimplif>{commande sympy}
+\end{bloctext}
+
+\subsection{Arguments}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le second argument, obligatoire et entre \texttt{\{...\}} est quant à lui la commande, en langage \textsf{sympy} à passer en \textsf{python}.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\subsection{Exemples}
+
+\begin{bloctext}
+On a $1+\frac76 = \sympycalc{1+7/6}$, ou $1+\dfrac76 = \dsympycalc{1+7/6}$
+\end{bloctext}
+
+\begin{bloctext}
+$1+\frac14+\frac17 + \sqrt{45} + \frac{2}{\sqrt{12}} =
+\sympycalc{1+1/4+1/7+sqrt(45)+2/sqrt(12)}$
+
+$1+\dfrac14+\dfrac17 + \sqrt{45} + \dfrac{2}{\sqrt{12}} =
+\dsympycalc{1+1/4+1/7+sqrt(45)+2/sqrt(12)}$
+\end{bloctext}
+
+\begin{bloctext}
+On a $\left(\e^5 +1 \right) \times \left(\e^5-1 \right) = \sympycalc{(exp(5)+1)*(exp(5)-1)}$
+\end{bloctext}
+
+\begin{bloctext}
+On a $\dfrac{x}{x+1} - \dfrac{x+2}{x-3} = \dsympycalc{radsimp(factor(x/(x+1) - (x+2)/(x-3)))}$
+\end{bloctext}
+
+\begin{bloctext}
+Les solutions de $\dfrac13x^2+9x+4=0$ sont
+$x_1 = \dsympycalc{solve(1/3*x**2+9*x+4,x)[0]}$ et
+$x_2 = \dsympycalc{solve(1/3*x**2+9*x+4,x)[1]}$
+\end{bloctext}
+
+\section{Quelques commandes spécifiques}
+
+\subsection{Développement}
+
+\begin{cautionblock}
+La commande pour développer une sortie \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympydev}} ou \texttt{\textbackslash \textcolor{purple}{dsympydev}}.
+
+Il vaut mieux vérifier si le résultat formaté est conforme aux attentes, et sinon utiliser la commande générique.
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes pour développer
+\sympydev(*)<NoSimplif>{commande sympy}[variable]
+\dsympydev(*)<NoSimplif>{commande sympy}[variable]
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le deuxième argument, obligatoire et entre \texttt{\{...\}} est quant à lui la commande, en langage \textsf{sympy} à passer en \textsf{python} ;
+	\item le dernier argument, optionnel et entre \texttt{[...]} est la variable éventuelle.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+$(1+\text{i})^5 = \sympydev{(1+I)**5}$          %typo [fr]
+
+$(1+i)^5 = \sympydev*{(1+I)**5}$
+
+$\dfrac{1}{(1+\text{i})^5} = \dsympydev{1/(1+I)**5}$
+\end{bloctext}
+
+\begin{bloctext}
+On a $(1+2x)^4 = \sympydev{(1+2*x)**4}$
+
+On a $\left(2t+\dfrac13\right)^3 = \dsympydev{(2*t+1/3)**3}[t]$
+\end{bloctext}
+
+\begin{bloctext}
+$\sin^2(x)+\cos^2(x) = \dsympydev{sin(x)**2+cos(x)**2}$
+
+$\left(\cos(x)+\sin(x)\right)^2 = \dsympydev{(sin(x)+cos(x))**2}$
+\end{bloctext}
+
+\subsection{Factorisation}
+
+\begin{cautionblock}
+La commande pour factoriser une sortie \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympyfact}} ou \texttt{\textbackslash \textcolor{purple}{dsympyfact}}.
+
+Il vaut mieux vérifier si le résultat formaté est conforme aux attentes, et sinon utiliser la commande générique.
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes pour factoriser
+\sympyfact(*)<NoSimplif>{commande sympy}
+\dsympyfact(*)<NoSimplif>{commande sympy}
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le dernier argument, obligatoire et entre \texttt{\{...\}} est quant à lui la commande, en langage \textsf{sympy} à passer en \textsf{python}.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+On a $x^3-x^2+x-1 = \sympyfact{x**3-x**2+x-1}$
+
+On a $\e^x-3\e^{2x} = \sympyfact{exp(x)-3*exp(2*x)}$   %typo [fr]
+
+On a $e^t-3e^{2t} = \sympyfact*{exp(t)-3*exp(2*t)}$
+\end{bloctext}
+
+\subsection{Résolution d'équations}
+
+\begin{cautionblock}
+La commande pour résoudre (dans les réels) une équation, grâce à \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympyresol}} ou \texttt{\textbackslash \textcolor{purple}{dsympyresol}}.
+
+La commande pour résoudre (dans les complexes) une équation, grâce à \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympyresolC}} ou \texttt{\textbackslash \textcolor{purple}{dsympyresolC}}.
+\end{cautionblock}
+
+\smallskip
+
+\begin{importantblock}
+Pour cette commande, la simplification en \textsf{sympy} n'est pas \textit{désactivable}.
+
+\smallskip
+
+Pour \textit{forcer} les résultats sous forme exact (fractions), il vaut mieux écrire les nombres sous forme fractionnaire.
+
+\smallskip
+
+Il vaut mieux vérifier si le résultat formaté est conforme aux attentes, et sinon utiliser la commande générique.
+\end{importantblock}
+
+\begin{bloctext}[listing only]
+%commandes pour résoudre dans R
+\sympyresol(*){equation sympy}[variable]
+\dsympyresol(*){equation sympy}[variable]
+
+%commandes pour résoudre dans C
+\sympyresolC(*){equation sympy}[variable]
+\dsympyresolC(*){equation sympy}[variable]
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, obligatoire et entre \texttt{\{...\}} est quant à lui l'équation, en langage \textsf{sympy} à passer en \textsf{python} (avec le signe \texttt{=}) ;
+	\item le second argument, optionnel et entre \texttt{[...]} est la variable.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+Les solutions de $x^2-3=\num{0.5}$ sont $\mathcal{S}=\dsympyresol{x**2-3=0.5}$
+
+%mieux vaut passer par les écritures en fraction ;-)
+Les solutions de $x^2-3=\num{0.5}$ sont $\mathcal{S}=\dsympyresol{x**2-3=1/2}$
+\end{bloctext}
+
+\begin{bloctext}
+Les solutions réelles de $x^3-2,5x+16x=40$ sont $\mathcal{S}=\dsympyresol{x**3-5/2*x**2+16*x = 40}$
+
+Les solutions de $x^3-2,5x+16x=40$ sont $\mathcal{S}=\dsympyresolC{x**3-5/2*x**2+16*x = 40}$
+\end{bloctext}
+
+\begin{bloctext}
+Les solutions de $10\,\e^{4x+5}=2$ sont $\mathcal{S}=\dsympyresol{10*exp(4*x+5)=2}$
+\end{bloctext}
+
+\subsection{Dérivation}
+
+\begin{cautionblock}
+La commande pour dériver, grâce à \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympyderiv}} ou \texttt{\textbackslash \textcolor{purple}{dsympyderv}}.
+
+Il vaut mieux vérifier si le résultat formaté est conforme aux attentes, et sinon utiliser la commande générique.
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes pour dériver
+\sympyderiv(*)<NoSimplif>{expression sympy}[variable]
+\dsympyderiv(*)<NoSimplif>{expression sympy}[variable]
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le deuxième argument, obligatoire et entre \texttt{\{...\}} est quant à lui l'expression en langage \textsf{sympy} à passer en \textsf{python} ;
+	\item le troisième argument, optionnel et entre \texttt{[...]} est la variable.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+Si $f(x)=(x+3)\,\e^{2x}$, alors on peut montrer que $f'(x) = \sympyderiv{(x+3)*exp(2*x)}$
+\end{bloctext}
+
+\begin{bloctext}
+La dérivée de $g(t)=\ln\left(\dfrac{1+x}{1-x}\right)$ sur
+$\left]-1;1\right[$ est $g'(t) = \dsympyderiv<NoSimplif>{ln((1+t)/(1-t))}[t]
+= \dsympyderiv{ln((1+t)/(1-t))}[t]$
+\end{bloctext}
+
+\begin{bloctext}
+La dérivée de $f(t)=t^2-8\ln(t)$ est 
+$f'(t)= \dsympyderiv{t**2-8*log(t)}[t] = \dsympycalc<NoSimplif>{cancel(2*t-8/t)}$
+\end{bloctext}
+
+\subsection{Intégration}
+
+\begin{cautionblock}
+Les commandes pour déterminer une primitive, grâce à \textsf{sympy} sont \texttt{\textbackslash \textcolor{purple}{sympyprim}} ou \texttt{\textbackslash \textcolor{purple}{dsympyprim}}.
+
+\smallskip
+
+Les commandes pour calculer une intégrale, grâce à \textsf{sympy} sont \texttt{\textbackslash \textcolor{purple}{sympyintegr}} ou \texttt{\textbackslash \textcolor{purple}{dsympysympyintegr}}.
+
+\smallskip
+
+Il vaut mieux vérifier si le résultat formaté est conforme aux attentes, et sinon utiliser la commande générique.
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes pour primitiver
+\sympyprim(*)<NoSimplif>{expr sympy}[variable]
+\dsympyprim(*)<NoSimplif>{expr sympy}[variable]
+
+%commandes pour intégrer
+\sympyintegr(*)<NoSimplif>{expr sympy}[variable]{borne inf}{borne sup}
+\dsympyintegr(*)<NoSimplif>{expr sympy}[variable]{borne inf}{borne sup}
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le deuxième argument, obligatoire et entre \texttt{\{...\}} est quant à lui l'expression en langage \textsf{sympy} à passer en \textsf{python} ;
+	\item le troisième argument, optionnel et entre \texttt{[...]} est la variable ;
+	\item les derniers arguments, obligatoires et entre \texttt{\{...\}} correspondent aux bornes d'intégration (pour l'intégrale !).
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+Une primitive de la fonction $f(x)=(1+x)^2$ est $F(x) = \dsympyprim{(1+x)**2}$
+
+Une primitive de la fonction $f(x)=(1+x)^2$ est $F(x) = \dsympyprim<NoSimplif>{(1+x)**2}$
+
+Une primitive de la fonction $f(x)=(1+t)^2$ est $F(t) = \dsympyprim<NoSimplif>{(1+t)**2}[t]$
+\end{bloctext}
+
+\begin{bloctext}
+On a $\displaystyle\int_1^3 (1+x)^2\,\text{d}x = \dsympyintegr{(1+x)**2}{1}{3}$
+
+$I=\displaystyle\int_0^{4} (t+3)\,\e^{2t}\,\text{d}t = \dsympyintegr{(t+3)*exp(2*t)}[t]{0}{4}$
+\end{bloctext}
+
+\subsection{Limites}
+
+\begin{cautionblock}
+Les commandes pour déterminer une limite, grâce à \textsf{sympy} sont \texttt{\textbackslash \textcolor{purple}{sympylim}} ou \texttt{\textbackslash \textcolor{purple}{dsympylim}}.
+
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes pour détemriner une limite
+\sympylim(*)<NoSimplif>{expr sympy}[variable]{point}[côté]
+\dsympylim(*)<NoSimplif>{expr sympy}[variable]{point}[côté]
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le deuxième argument, obligatoire et entre \texttt{\{...\}} est quant à lui l'expression en langage \textsf{sympy} à passer en \textsf{python} ;
+	\item le troisième argument, optionnel et entre \texttt{[...]} est la variable ;
+	\item les derniers arguments, obligatoire et entre \texttt{\{...\}} et optionnel entre \texttt{[...]} correspondent à la valeur (et la position \texttt{[g]} ou \texttt{[d]}) en laquelle on souhaite travailler.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+On a $\lim\limits_{x \to +\infty} \dfrac{1+\e^x}{x^2+1} = \sympylim{(1+exp(x))/(x**2+1)}{+oo}$
+\end{bloctext}
+
+\begin{bloctext}
+On a $\lim\limits_{x \to 1^+} \dfrac{x+2}{x^2-1} = \sympylim{(x+2)/(x**2-1)}{1}[d]$
+
+On a $\lim\limits_{x \to 1^-} \dfrac{x+2}{x^2-1} = \sympylim{(x+2)/(x**2-1)}{1}[g]$
+\end{bloctext}
+
+\begin{bloctext}
+On a $\lim\limits_{x \to +\infty} \sqrt{\dfrac{2x^2+1}{x^2-5}} = \sympylim{sqrt((2*x**2+1)/(x**2-5))}{+oo}$
+\end{bloctext}
+
+\subsection{Forme exponentielle d'un complexe}
+
+\begin{cautionblock}
+La commande pour déterminer une forme exponentielle, grâce à \textsf{sympy} est \texttt{\textbackslash \textcolor{purple}{sympyfexpo}} ou \texttt{\textbackslash \textcolor{purple}{dsympyfexpo}}.
+
+Il vaut mieux vérifier si le résultat formaté est conforme aux attentes, et sinon utiliser la commande générique.
+\end{cautionblock}
+
+\begin{bloctext}[listing only]
+%commandes pour détemriner une forme exponentielle
+\sympyfexpo(*)<NoSimplif>{complexe sympy}
+\dsympyfexpo(*)<NoSimplif>{complexe sympy}
+\end{bloctext}
+
+\begin{tipblock}
+Concernant son fonctionnement :
+
+\begin{itemize}
+	\item la version \Cle{*} permet de ne pas formater le \texttt{e} et le \texttt{i} en \textsf{romain} ;
+	\item le premier argument, optionnel et pouvant valoir \texttt{<\textcolor{OliveDrab}{NoSimplif}>} permet d'\textit{annuler} la simplification (attention au comportement de la \textit{simplification} par \textsf{sympy}\ldots)
+	\item le second argument, obligatoire et entre \texttt{\{...\}} est quant à lui le complexe en version \textsf{sympy} à passer en \textsf{python}.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{bloctext}
+On a $1+\i = \dsympyfexpo{1+I}$
+
+On a $3+\i\sqrt{3} = \dsympyfexpo{3+I*sqrt(3)}$
+
+On a $\dfrac{-\sqrt{2}}{1+\i} = \dsympyfexpo{(-sqrt(2))/(1+I)}$
+\end{bloctext}
+
+\newpage
+
+\part{Historique et évolutions}
+
+\section{Évolutions}
+
+\begin{tipblock}
+L'utilisateur du package pourra utiliser ses propres fonctions ou commandes \textsf{sympy}, qui pourront être déclarés grâce à l'environnement \texttt{python}.
+\end{tipblock}
+
+\begin{bloctext}[listing only]
+\begin{python}
+def tangente(expr,var,a) :
+	f = lambdify(x, expr)
+	deriveef = diff(expr,x)
+	derf = lambdify(x, deriveef)
+	pente = simplify(derf(a))
+	ordonnee = simplify(f(a))
+	tgte = simplify(pente*(x-a) + ordonnee)
+	return tgte
+	
+\end{python}
+\end{bloctext}
+
+\begin{python}
+def tangente(expr,var,a) :
+	f = lambdify(x, expr)
+	deriveef = diff(expr,x)
+	derf = lambdify(x, deriveef)
+	pente = simplify(derf(a))
+	ordonnee = simplify(f(a))
+	tgte = simplify(pente*(x-a) + ordonnee)
+	return tgte
+	
+\end{python}
+
+\begin{bloctext}
+La tangente à la courbe de la fonction $f(x)=\e^{2x}+3$ en $a=1$ a pour équation (appochée) :
+
+$y \approx \sympycalc{tangente(exp(2*x)+3,x,1)}$.
+\end{bloctext}
+
+\section{Historique}
+
+\verb|v0.1.0|~:~~~~Version initiale.
+
+
+
+
+
+\end{document}
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/lualatex/sympycalc/SympyCalc-doc.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/lualatex/sympycalc/SympyCalc.sty
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/sympycalc/SympyCalc.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/lualatex/sympycalc/SympyCalc.sty	2023-05-08 20:13:54 UTC (rev 67055)
@@ -0,0 +1,358 @@
+% Author                         : C. Pierquet
+% licence                        : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{SympyCalc}[2023/05/05 v0.1.0 Sympy commands with TeX printing]
+% 0.1		Version initiale
+
+%------Packages utiles
+\RequirePackage{xstring}
+
+%------Scripts python
+\begin{python}
+from sympy import *
+init_printing()
+x, y, z, t = symbols('x y z t')
+
+def latex_fr(expr) :
+	return latex(expr,imaginary_unit='ri',ln_notation=True,decimal_separator='comma').replace("e^","\\text{e}^")
+
+def latex_frit(expr) :
+	return latex(expr,ln_notation=True,decimal_separator='comma')
+
+def latex_fr_simpl(expr) :
+	return latex(simplify(expr),imaginary_unit='ri',ln_notation=True,decimal_separator='comma').replace("e^","\\text{e}^")
+
+def latex_frit_simpl(expr) :
+	return latex(simplify(expr),ln_notation=True,decimal_separator='comma')
+
+def latex_fr_resol(expr,var) :
+	if '=' in expr :
+		expr = expr.replace('=','-(') + ')'
+	res = solve(expr,var)
+	res = [simplify(element) for element in res if 'I' not in str(element)]
+	res = latex(res,imaginary_unit='ri',ln_notation=True,decimal_separator='comma')
+	res = res.replace("e^","\\text{e}^")
+	res = res.replace("\\ ","")
+	res = res.replace("[","\\{")
+	res = res.replace("]","\\}")
+	return res
+
+def latex_frit_resol(expr,var) :
+	if '=' in expr :
+		expr = expr.replace('=','-+(') + ')'
+	res = solve(expr,var)
+	res = [simplify(element) for element in res if 'I' not in str(element)]
+	res = latex(res,ln_notation=True,decimal_separator='comma')
+	res = res.replace("e^","\\text{e}^")
+	res = res.replace("\\ ","")
+	res = res.replace("[","\\{")
+	res = res.replace("]","\\}")
+	return res
+
+def latex_fr_resolC(expr,var) :
+	if '=' in expr :
+		expr = expr.replace('=','-(') + ')'
+	res = solve(expr,var)
+	res = [simplify(element) for element in res]
+	res = latex(res,imaginary_unit='ri',ln_notation=True,decimal_separator='comma')
+	res = res.replace("e^","\\text{e}^")
+	res = res.replace("\\ ","")
+	res = res.replace("[","\\{")
+	res = res.replace("]","\\}")
+	return res
+
+def latex_frit_resolC(expr,var) :
+	if '=' in expr :
+		expr = expr.replace('=','-+(') + ')'
+	res = solve(expr,var)
+	res = [simplify(element) for element in res]
+	res = latex(res,ln_notation=True,decimal_separator='comma')
+	res = res.replace("e^","\\text{e}^")
+	res = res.replace("\\ ","")
+	res = res.replace("[","\\{")
+	res = res.replace("]","\\}")
+	return res
+
+def patch_oo(res) :
+	if res == '\\infty' :
+		return '+\\infty'
+	else :
+		return res
+
+def forme_expo(z) :
+	return abs(z)*exp(I*arg(z))
+
+\end{python}
+
+%------Commandes de base
+\NewDocumentCommand\sympycalc{ s D<>{Simplif} m }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_frit_simpl(\argtmp)}%
+				}%
+				{%
+					\py{latex_frit(\argtmp)}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_fr_simpl(\argtmp)}%
+				}%
+				{%
+					\py{latex_fr(\argtmp)}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympycalc{ s D<>{Simplif} m }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympycalc*<#2>{#3}}%
+		{\displaystyle\sympycalc<#2>{#3}}%
+}
+
+%------Développer
+\NewDocumentCommand\sympydev{ s D<>{Simplif} m O{x} }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_frit_simpl(expand(\argtmp,#4))}%
+				}%
+				{%
+					\py{latex_frit(expand(\argtmp,#4))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_fr_simpl(expand(\argtmp,#4))}%
+				}%
+				{%
+					\py{latex_fr(expand(\argtmp,#4))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympydev{ s D<>{Simplif} m O{x} }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympydev*<#2>{#3}[#4]}%
+		{\displaystyle\sympydev<#2>{#3}[#4]}%
+}
+
+%------Factoriser
+\NewDocumentCommand\sympyfact{ s D<>{Simplif} m }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_frit_simpl(factor(\argtmp))}%
+				}%
+				{%
+					\py{latex_frit(factor(\argtmp))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_fr_simpl(factor(\argtmp))}%
+				}%
+				{%
+					\py{latex_fr(factor(\argtmp))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympyfact{ s D<>{Simplif} m }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyfact*<#2>{#3}}%
+		{\displaystyle\sympyfact<#2>{#3}}%
+}
+
+%------Dériver
+\NewDocumentCommand\sympyderiv{ s D<>{Simplif} m O{x} }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_frit_simpl(diff(\argtmp,#4))}%
+				}%
+				{%
+					\py{latex_frit(diff(\argtmp,#4))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_fr_simpl(diff(\argtmp,#4))}%
+				}%
+				{%
+					\py{latex_fr(diff(\argtmp,#4))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympyderiv{ s D<>{Simplif} m O{x} }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyderiv*<#2>{#3}[#4]}%
+		{\displaystyle\sympyderiv<#2>{#3}[#4]}%
+}
+
+%------Primitiver
+\NewDocumentCommand\sympyprim{ s D<>{Simplif} m O{x} }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_frit_simpl(integrate(\argtmp,#4))}%
+				}%
+				{%
+					\py{latex_frit(integrate(\argtmp,#4))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_fr_simpl(integrate(\argtmp,#4))}%
+				}%
+				{%
+					\py{latex_fr(integrate(\argtmp,#4))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympyprim{ s D<>{Simplif} m O{x} }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyprim*<#2>{#3}[#4]}%
+		{\displaystyle\sympyprim<#2>{#3}[#4]}%
+}
+
+%------Intégrer
+\NewDocumentCommand\sympyintegr{ s D<>{Simplif} m O{x} m m }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{patch_oo(latex_frit_simpl(integrate(\argtmp,(#4,#5,#6))))}%
+				}%
+				{%
+					\py{patch_oo(latex_frit(integrate(\argtmp,(#4,#5,#6))))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{patch_oo(latex_fr_simpl(integrate(\argtmp,(#4,#5,#6))))}%
+				}%
+				{%
+					\py{patch_oo(latex_fr(integrate(\argtmp,(#4,#5,#6))))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympyintegr{ s D<>{Simplif} m O{x} m m }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyintegr*<#2>{#3}[#4]{#5}{#6}}%
+		{\displaystyle\sympyintegr<#2>{#3}[#4]{#5}{#6}}%
+}
+
+%------Limite
+\NewDocumentCommand\sympylim{ s D<>{Simplif} m O{x} m O{} }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\def\poslim{}
+	\IfStrEq{#6}{g}%
+		{\def\poslim{'-'}}{}
+	\IfStrEq{#6}{d}%
+		{\def\poslim{'+'}}{}
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{patch_oo(latex_frit_simpl(limit(\argtmp,#4,#5,\poslim)))}%
+				}%
+				{%
+					\py{patch_oo(latex_frit(limit(\argtmp,#4,#5,\poslim)))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{patch_oo(latex_fr_simpl(limit(\argtmp,#4,#5,\poslim)))}%
+				}%
+				{%
+					\py{patch_oo(latex_fr(limit(\argtmp,#4,#5,\poslim)))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympylim{ s D<>{Simplif} m O{x} m O{} }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympylim*<#2>{#3}[#4]{#5}[#6]}%
+		{\displaystyle\sympylim<#2>{#3}[#4]{#5}[#6]}%
+}
+
+%------FormeExpo
+\NewDocumentCommand\sympyfexpo{ s D<>{NoSimplif} m }{%
+	%\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_frit_simpl(forme_expo(#3))}%
+				}%
+				{%
+					\py{latex_frit(forme_expo(#3))}%
+				}%
+		}%
+		{%
+			\IfStrEq{#2}{Simplif}%
+				{%
+					\py{latex_fr_simpl(forme_expo(#3))}%
+				}%
+				{%
+					\py{latex_fr(forme_expo(#3))}%
+				}%
+		}%
+}
+\NewDocumentCommand\dsympyfexpo{ s D<>{NoSimplif} m }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyfexpo*<#2>{#3}}%
+		{\displaystyle\sympyfexpo<#2>{#3}}%
+}
+
+%------Solutions (R ou C)
+\NewDocumentCommand\sympyresol{ s D<>{Simplif} m O{x} }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\py{latex_frit_resol('\argtmp',#4)}%
+		}%
+		{%
+			\py{latex_fr_resol('\argtmp',#4)}%
+		}%
+}
+\NewDocumentCommand\dsympyresol{ s D<>{Simplif} m O{x} }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyresol*<#2>{#3}[#4]}%
+		{\displaystyle\sympyresol<#2>{#3}[#4]}%
+}
+
+\NewDocumentCommand\sympyresolC{ s D<>{Simplif} m O{x} }{%
+	\StrSubstitute{#3}{/}{*S.One/}[\argtmp]%
+	\IfBooleanTF{#1}%*=frit, no*=fr
+		{%
+			\py{latex_frit_resolC('\argtmp',#4)}%
+		}%
+		{%
+			\py{latex_fr_resolC('\argtmp',#4)}%
+		}%
+}
+\NewDocumentCommand\dsympyresolC{ s D<>{Simplif} m O{x} }{%
+	\IfBooleanTF{#1}%
+		{\displaystyle\sympyresolC*<#2>{#3}[#4]}%
+		{\displaystyle\sympyresolC<#2>{#3}[#4]}%
+}
+
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/lualatex/sympycalc/SympyCalc.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2023-05-08 20:12:06 UTC (rev 67054)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2023-05-08 20:13:54 UTC (rev 67055)
@@ -778,7 +778,8 @@
     superiors supertabular suppose susy svg svg-inkscape svgcolor
     svn svn-multi svn-prov svninfo svrsymbols
     swebib swfigure swimgraf swrule swungdash syllogism
-    symbats3 symbol sympytexpackage syntax synproof syntaxdi syntrace synttree
+    symbats3 symbol sympycalc sympytexpackage
+    syntax synproof syntaxdi syntrace synttree
     systeme
   t-angles t2
     tabbing tabfigures table-fct tableaux tablefootnote tableof

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2023-05-08 20:12:06 UTC (rev 67054)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2023-05-08 20:13:54 UTC (rev 67055)
@@ -1797,6 +1797,7 @@
  'splitindex'		=> '&POST_do_man',
  'startex'		=> '&POST_otherformat', 
  'stex',		=> '&POSTstex',
+ 'sympycalc'		=> '&POST_onelevel',
  'tangramtikz'		=> '&POST_onelevel',
  'tap'			=> '&POSTtap',
  'tds'			=> '&POST_rmsymlink', # no README.html

Modified: trunk/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc	2023-05-08 20:12:06 UTC (rev 67054)
+++ trunk/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc	2023-05-08 20:13:54 UTC (rev 67055)
@@ -97,6 +97,7 @@
 depend spacekern
 depend spelling
 depend stricttex
+depend sympycalc
 depend texfindpkg
 depend truthtable
 depend tsvtemplate

Added: trunk/Master/tlpkg/tlpsrc/sympycalc.tlpsrc
===================================================================


More information about the tex-live-commits mailing list.