Thứ Tư, 19 tháng 2, 2014

Sử dụng tablor - bài 1

Khi các bạn đã cài TeXLive bản full thì chương trình tablortableauvariation.mp cũng đã cài đặt hoàn chỉnh. Để sử dụng được tablor các bạn còn phải cài xcas lên máy. Trong Ubuntu Linux việc này dễ dàng và không cần cấu hình gì thêm. Trong MS Winodws xem hướng dẫn ở cuối bài.

Để bảng biến thiên giống như chúng ta thường dùng, các bạn thực thi như sau:

1. Tạo một thư mục ví dụ tablor để ở bất cứ đâu. Soạn file TeX trong thư nục này.
2. Copy vào thư mục tablor nói trên hai file sau đây:

tableauVariation.mp
 % This software is copyright (c) 2005 by Frédéric Mazoit  
 %  
 % This program is free software; you can redistribute it and/or modify  
 % it under the terms of the GNU General Public License as published by  
 % the Free Software Foundation; either version 2 of the License, or  
 % any later version.  
 %  
 % This program is distributed in the hope that it will be useful,  
 % but WITHOUT ANY WARRANTY; without even the implied warranty of  
 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
 % GNU General Public License for more details.  
 deltaX=10pt;  
 deltaY=5pt;  
 deltaYvariations=20pt;  
 deltaXsignes=30pt;  
 Variables_=0;  
 Signes_=1;  
 Variations_=2;  
 Plus_=0;  
 Moins_=1;  
 Fleche_=2;  
 Valeur_=3;  
 ValeurBarree_=4;  
 Vide_=5;  
 Barre_=6;  
 NonDefBarre_=7;  
 NonDefRegion_=8;  
 VidePos_=9;  
 Trait_=10;  
 def mkLabel(expr x)=  
  if picture x: x  
  else: x infont defaultfont scaled defaultscale fi  
 enddef;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 def exists(expr i,j)=  
  known typeEl.[i][j]c  
 enddef;  
 def getH(expr x)= if known x: ypart(ulcorner x-llcorner x) else: 0 fi enddef;  
 def getL(expr x)= if known x: xpart(urcorner x-ulcorner x) else: 0 fi enddef;  
 vardef getHcase(expr i,j)=  
  max(  
   max(  
    deltaY,  
    if known el.[i][j]l: getH(el.[i][j]l) else: 0 fi),  
   max(  
    if known el.[i][j]c: getH(el.[i][j]c) else: 0 fi,  
    if known el.[i][j]r: getH(el.[i][j]r) else: 0 fi)  
   )  
 enddef;  
 vardef getMcase(expr i,j)=  
  save type;  
  if exists(i,j):  
   type:=typeEl.[i][j]c;  
   if (type=Plus_) or (type=Moins_) or (type=Fleche_) or (type=NonDefRegion_):  
    .5deltaXsignes+.5deltaX  
   elseif (type=NonDefBarre_): 2pt+.5deltaX  
   elseif (type=Barre_) or (type=Vide_): 0  
   else: .5deltaX+if known el.[i][j]c:.5getL(el.[i][j]c) else: 0 fi  
   fi  
  else: 0 fi  
 enddef;  
 vardef getGcase(expr i,j)=  
  getMcase(i,j)+ if known el.[i][j]l:getL(el.[i][j]l) else: 0 fi  
 enddef;  
 vardef getDcase(expr i,j)=  
  getMcase(i,j)+ if known el.[i][j]r:getL(el.[i][j]r) else: 0 fi  
 enddef;  
 vardef getGcol(expr col)=  
  save res,i;  
  res=0;  
  for i=1 upto nbLgn: res:=max(res,getGcase(i,col)); endfor;  
  res  
 enddef;  
 vardef getDcol(expr col)=  
  save res,i;  
  res=0;  
  for i=1 upto nbLgn: res:=max(res,getDcase(i,col)); endfor;  
  res  
 enddef;  
 vardef getHelsLgn(expr line)=  
  save res, j;  
  res:=11pt;  
  for j=0 upto nbCol: res:=max(res,getHcase(line,j)); endfor;  
  res  
 enddef;  
 vardef getHLgn(expr line)=  
  if typeLgn[line]=Variations_:  
   max(getHelsLgn(line)+deltaYvariations,40pt)+deltaY  
  else:  
   getHelsLgn(line)+deltaY  
  fi  
 enddef;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 def valSmp_(expr s,type,b)=  
  vd:=0;  
  col:=col+1;  
  if col>nbCol: nbCol:=col; fi;  
  typeEl.[nbLgn][col]c=type;  
  pos.[nbLgn][col]c=b;  
  el.[nbLgn][col]c=mkLabel(s);  
 enddef;  
 def sgnSmp_(expr s)=  
  vd:=0;  
  col:=col+1;  
  if col>nbCol: nbCol:=col; fi;  
  typeEl.[nbLgn][col]c=s;  
 enddef;  
 def chkCol(expr a)=  
  if (col mod 2)=a:  
   if ndf=1: sgn_(NonDefRegion_,1);  
   elseif (typeLgn[nbLgn]=Variations_) and (vd=0): fleche;  
   else: sgnSmp_(Vide_);  
   fi  
  fi  
 enddef;  
 def valeur_(expr s,type,b)=  
  chkCol(0);  
  valSmp_(s,type,b);  
 enddef;  
 def sgn_(expr s,a)=  
  chkCol(a);  
  sgnSmp_(s);  
 enddef;  
 def flecheBrisee(expr b)=  
  sgn_(Trait_,1);  
  vd:=0;  
  col:=col+1;  
  if col>nbCol: nbCol:=col; fi;  
  typeEl.[nbLgn][col]c=VidePos_;  
  pos.[nbLgn][col]c=b;  
 enddef;  
 def vide=vd:=1;sgn_(Vide_,0);enddef;  
 def val(expr s)=valeur_(s,Valeur_,.5); enddef;  
 def valBarre(expr s)=valeur_(s,ValeurBarree_,.5); enddef;  
 def valPos(expr s,b)=valeur_(s,Valeur_,b); enddef;  
 def valPosBarre(expr s,b)=valeur_(s,ValeurBarree_,b); enddef;  
 def barre=sgn_(Barre_,0); enddef;  
 def nonDefBarre=sgn_(NonDefBarre_,0); enddef;  
 def debutNonDef=ndf:=1;barre;enddef;  
 def finNonDef=barre;ndf:=0; enddef;  
 def bord=sgn_(Barre_,1); enddef;  
 def plus=sgn_(Plus_,1); enddef;  
 def moins=sgn_(Moins_,1); enddef;  
 def fleche=sgn_(Fleche_,1); enddef;  
 def limGauche(expr s,b)=  
  chkCol(0);  
  pos.[nbLgn][col+1]l=b;  
  el.[nbLgn][col+1]l=mkLabel(s);  
 enddef;  
 def limDroite(expr s,b)=  
  pos.[nbLgn][col]r=b;  
  el.[nbLgn][col]r=mkLabel(s);  
 enddef;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 def newLgn_(expr x,type)=  
  nbLgn:=nbLgn+1;  
  col:=0;  
  typeLgn[nbLgn]=type;  
  sgnSmp_(Vide_);  
  val(x);  
  bord;  
 enddef;  
 def newLigneVariables(expr x)=newLgn_(x,Variables_); enddef;  
 def newLigneSignes(expr x)=newLgn_(x,Signes_); enddef;  
 def newLigneVariations(expr x)=newLgn_(x,Variations_); enddef;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 def calculPos=  
  xCol[1]:=0;  
  for i=1 upto nbCol:  
   x[i]:=xCol[i]+getGcol(i);  
   xCol[i+1]:=x[i]+getDcol(i);  
  endfor  
  yLgn[1]:=0;   
  for i=1 upto nbLgn:  
   y[i]:=yLgn[i]-.5getHLgn(i);  
   yLgn[i+1]:=y[i]-0.5*getHLgn(i);  
  endfor;  
 enddef;  
 vardef calcP(expr i,j)=  
  if exists(i,j):  
   if (typeEl.[i][j]c=Valeur_) or (typeEl.[i][j]c=VidePos_):  
    (x[j],y[i]+(pos.[i][j]c-.5)*(getHLgn(i)-getHelsLgn(i)))  
   else: (x[j],y[i]) fi  
  else: (x[j],y[i]) fi  
 enddef;  
 vardef calcPl(expr i,j)=  
  (x[j]-2pt-.5(getL(el.[i][j]c)+getL(el.[i][j]l)),y[i]+(pos.[i][j]l-.5)*(getHLgn(i)-getHelsLgn(i)))  
 enddef;  
 vardef calcPr(expr i,j)=  
  (x[j]+2pt+.5(getL(el.[i][j]c)+getL(el.[i][j]r)),y[i]+(pos.[i][j]r-.5)*(getHLgn(i)-getHelsLgn(i)))  
 enddef;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 vardef drawFleche(expr i,j,k)=  
  save aa,bb;  
  aa=j-1;  
  bb=j+1;  
  forever:  
   exitif typeEl.[i][aa]c<>Vide_;  
   aa:=aa-1;  
  endfor  
  forever:  
   exitif typeEl.[i][bb]c<>Vide_;  
   bb:=bb+1;  
  endfor  
  if k=Fleche_: drawarrow else: draw fi(  
   if known el.[i][aa]r: calcPr(i,aa) else: calcP(i,aa) fi--  
   if known el.[i][bb]l: calcPl(i,bb) else: calcP(i,bb) fi)  
  if known el.[i][aa]r: cutbefore(bbox(thelabel(el.[i][aa]r,calcPr(i,aa)))) fi  
  if known el.[i][aa]c: cutbefore(bbox(thelabel(el.[i][aa]c,calcP(i,aa)))) fi  
  if known el.[i][bb]l: cutafter(bbox(thelabel(el.[i][bb]l,calcPl(i,bb)))) fi  
  if known el.[i][bb]c: cutafter(bbox(thelabel(el.[i][bb]c,calcP(i,bb)))) fi;  
 enddef;  
 vardef rempli(expr xa,xb,ya,yb)=  
  save i;  
  for i=1 step 5pt until xb-xa+ya-yb-1:  
   draw (xa,ya-i)--(xa+i,ya) cutbefore ((xa,yb)--(xb,yb)) cutafter ((xb,ya)--(xb,yb));  
  endfor  
 enddef;  
 def afficheSigne(expr s,i,j)=  
  label(s,.5[calcP(i,j-1),calcP(i,j+1)]);  
 enddef;  
 def afficheTableau=  
  calculPos;  
  for i=1 upto nbLgn:    
   for j=1 upto nbCol:   
    if exists(i,j):  
      t:=typeEl.[i][j]c;  
      if t=Plus_:  
       afficheSigne(btex $+$ etex,i,j);  
      elseif t=Moins_:  
       afficheSigne(btex $-$ etex,i,j);  
      elseif t=Fleche_:  
       drawFleche(i,j,Fleche_);  
      elseif t=Trait_:  
       drawFleche(i,j,Trait_);  
      elseif t=NonDefRegion_:  
       rempli(x[j-1],x[j+1],yLgn[i],yLgn[i+1]);  
      elseif t=Barre_:  
       draw (x[j],yLgn[i])--(x[j],yLgn[i+1]);  
      elseif t=ValeurBarree_:  
       label(el.[i][j]c,calcP(i,j));  
       draw (x[j],yLgn[i])--(x[j],yLgn[i+1]) dashed evenly;  
      elseif t=NonDefBarre_:  
       draw (x[j]-1pt,yLgn[i])--(x[j]-1pt,yLgn[i+1]);  
       draw (x[j]+1pt,yLgn[i])--(x[j]+1pt,yLgn[i+1]);  
      elseif t=Valeur_:  
       label(el.[i][j]c,calcP(i,j));  
      fi  
      if known el.[i][j]l: label(el.[i][j]l,calcPl(i,j)); fi;  
      if known el.[i][j]r: label(el.[i][j]r,calcPr(i,j)); fi;  
    fi  
   endfor  
  endfor  
  for i=2 upto nbLgn:  
   draw (xCol[1],yLgn[i])--(xCol[nbCol+1],yLgn[i]);  
  endfor;  
 % Bang bien thien cua VN khong co khung nen bo 4 dong sau day:  
 % draw(xCol[1],yLgn[1])--(xCol[nbCol+1],yLgn[1]);   
 % draw(xCol[1],yLgn[nbLgn+1])--(xCol[nbCol+1],yLgn[nbLgn+1]);  
 % draw(xCol[1],yLgn[1])--(xCol[1],yLgn[nbLgn+1]);  
  % draw(xCol[nbCol+1],yLgn[1])--(xCol[nbCol+1],yLgn[nbLgn+1]);    
 enddef;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 def beginTableau(expr c) =  
  begingroup  
  charcode:=c;  
  clearxy; clearit; clearpen;  
  pickup defaultpen;  
  drawoptions();  
  initTableau;  
 enddef;  
 def initTableau=  
  picture el.[][]l;  
  picture el.[][]c;  
  picture el.[][]r;  
  numeric typeLgn[];  
  numeric col;  
  numeric nbLgn;  
  numeric nbCol;  
  numeric pos.[][]l;  
  numeric pos.[][]c;  
  numeric pos.[][]r;  
  numeric typeEl.[][]c;  
  numeric yLgn[];  
  numeric xCol[];  
  ndf:=0;  
  vd:=0;  
  col=0;  
  nbLgn=0;  
  nbCol=0;  
 enddef;  
 def endTableau=  
  afficheTableau;  
  shipit;  
  endgroup  
 enddef;  
tablor.cfg

 \NeedsTeXFormat{LaTeX2e}[1995/12/01]  
 \ProvidesPackage{tablor}[09/05/2010 v4.07 la machine a creer des tableaux de signes et variations]  
 % \copyleft Connan le Barbare (aka Guillaume Connan) \copyright  
 % This work may be distributed and/or mofified under the conditions  
 % or the LaTeX Project Public Licence, either v1.3 or (at your option)  
 % any later version. The latest version is in  
 %  http://www.latex-project.org/lppl/  
 % This work consists of the files tablor.sty, tablor-xetex.sty, tablor.cfg, tablor.tex,  
 % tablor.pdf and tablor.html  
 %% Cree 16 environnements :  
 %% tableau de signes de 2 facteurs affines  
 % \begin{TSa}  
 % TSa(-2,3,-1,5,\tv);  
 % \end{TSa}  
 % %%%%%% Pour des tableaux de plus de 2 facteurs  
 %  
 % \begin{TS}  
 % TS("P",[-2*x+3,x^2-1,x^2+1,x-1,x^2-2],[a,b],n,\tv);  
 % \end{TS}  
 %  
 % pour les tableaux de signes avec quotient  
 %\begin{TSq}  
 %TSq("Q",[-2*x+3,-4*x+5],[x^2-16,x-2],[a,b],n,\tv)  
 %%\end{TSq}  
 % un tableau de variation :  
 %  
 % pour les tableaux de signes à une seule ligne  
 % \begin{TSc}  
 % TSc((x+10)/((x-5)*(x-2)),[-10,5],[2,5],n,0)  
 % \end{TSc}  
 %  
 %  
 % \begin{TV}  
 % TV([0,+infinity],[0],"h","x",ln(x)-(ln(x))^2,1,n,\tv)  
 % \end{TV}  
 %  
 % tableau de variation avec liste de valeurs  
 % \begin{TVS}  
 % TVS([1,2,3,4],[-1,-infinity,+infinity,2,9],[2],"f","x",\tv)  
 % \end{TVS}  
 %  
 %  
 % tableau de variation avec zones interdites  
 %  
 % \begin{TVZ}  
 %  TVZ([-infinity,+infinity],[],[[-1,1]],"f","x",sqrt(x^2-1),1,n,\tv)  
 % \end{TVZ}  
 %  
 %  
 % tableau avec valeurs intermediares  
 %\begin{TVI}  
 %TVI([-1,+infinity],[-1],"f","x",x2/sqrt(x+1)-1,1,2,n,\tv)  
 %\end{TVI}  
 %%%  
 % tableau avec valeurs intermediares et racines exactes  
 %\begin{TVIex}  
 %TVIex([-1,+infinity],[-1],"f","x",x2/sqrt(x+1)-1,1,2,n,\tv)  
 %\end{TVIex}  
 %%%  
 %  
 %  
 % tableau de variations avec f' sans zero formel  
 %\begin{TVapp}  
 % TVapp([0,+infinity],[0],"g","x",ln(x)-x*exp(2-x),1,\tv)  
 % \end{TVapp}  
 %  
 %  
 % tableau de variations avec f' sans zero formel  
 %\begin{TVIapp}  
 % TVIapp([0,+infinity],[0],"g","x",ln(x)-x*exp(2-x),1,0,\tv)  
 % \end{TVIapp}  
 %  
 %  
 %%%  
 % et leurs pendants etoiles qui permettent l'affichage intermediaire du   
 % fichier metapost pour le modifier  
 %  
 %  
 % Courbes parametrees  
 % \begin{TVP}  
 % TVP([-infinity,+infinity],[[-1,2],[-1]],["x","y"],"t",[t^2/((t+1)*(t-2)),t^2*(t+2)/(t+1)],1,n,\tv)  
 % \end{TVP}  
 %  
 %  
 % \begin{TVP}  
 % TVP([0,pi/2],[[],[]],["x","y"],"t",[2*cos(t),sin(2*t)],1,t,\tv)  
 % \end{TVP}  
 % %  
 % Fonctions prolongeables par continuité  
 % TVP([intervalles d'étude],[valeurs prolongeables],[valeurs interdites pour f'],"g","t",e^(-1/x^2),1,n,\tv);   
 % \begin{TVPC}  
 % TVPC([-infinity,+infinity],[0],[0],"g","t",e^(-1/x^2),1,n,\tv);   
 % \end{TVPC}  
 %% extensions requises  
 %% Il faudra rajouter dans le preambule \usepackage{graphicx} si vous   
 %% ne l'avez pas de base   
 \RequirePackage{filecontents}  
 \RequirePackage{ifthen}  
 \RequirePackage{fancyvrb}  
 \RequirePackage{ifpdf}  
 \fvset{gobble=0}  
 % option xcas present   
 \newboolean{xcas}\setboolean{xcas}{false}  
 \DeclareOption{xcas}{\setboolean{xcas}{true}}  
 %% Initialisation du choix d'OS  
 \newboolean{windows}\setboolean{windows}{false}  
 \DeclareOption{windows}{\setboolean{windows}{true}}  
 \ProcessOptions\relax  
 %% on configure tablor dans un fichier exterieur pour la plateforme  
 %% et l'editeur  
 \IfFileExists{tablor.cfg}{\input{tablor.cfg}}%\typeout{pas de fichier tablor.cfg}}  
 %% Definit des commandes disque selon l'OS utilise  
 \ifthenelse{\boolean{windows}}%  
   {\newcommand{\rem}{DEL } \newcommand{\cat}{TYPE }  
    \newcommand{\cp}{COPY } \newcommand{\echod}{ECHO }  
      \newcommand{\echof}{ }}%  
   {\newcommand{\rem}{rm }\newcommand{\cat}{cat }  
    \newcommand{\cp}{cp } \newcommand{\echod}{echo "}  
     \newcommand{\echof}{"}}  
 %% pour ceux compilant via pdflatex  
 \ifpdf  
 \DeclareGraphicsRule{*}{mps}{*}{}  
 \fi  
 %% pour nettoyer les fichiers auxiliaires  
 \AtEndDocument{\immediate\write18{\rem *.user XCas* Xcas* *.mpx}  
              }  
 %% Pour clore les fichiers metapost   
  \begin{VerbatimOut}{queue.mp}  
  end  
  \end{VerbatimOut}  
 %% Nettoie les fichiers log dont le nom depend du choix de l'utilisateur  
 %% Par defaut, c'est le nom du fichier tex courant (\jobname)  
 %% Clôt le fichier metapost contenant le recapitulatif de tous les tableaux  
 \newcommand{\nettoyer}[1][\jobname]%  
 {\immediate\write18{\rem #1.Tab.log queue.mp enteteMP.cfg session.tex config.cxx}  
 }  
 %% Donne comme prefixe aux tableaux le prefixe courant  
 %% Peut-être modifie par \initablor  
 \newcommand{\nomtravail}{\jobname}  
 %% initialise les compteurs  
 \newcounter{TVn}  
 \newcommand{\tv}{\theTVn}  
 \newcounter{TVnbis}  
 \newcommand{\tvbis}{\theTVnbis}  
 %% permet de donner un prefixe aux tableaux produits (\jobname par defaut)  
 %% effectue quelques verifications :  
 \newcommand{\initablor}[1][\jobname]{%  
 \renewcommand{\nomtravail}{#1}%   Arret du nom des tableaux  
 \setcounter{TVn}{0}%   Initialisation du compteur de tableaux.  
 \ifthenelse{\boolean{xcas}}%  Avec l'option XCas  
 {\IfFileExists{\nomtravail_Tab.mp}%   Si Tableaux.mp est present...  
     {\immediate\write18{\rem \nomtravail_Tab.mp}}% le detruire  
     {}%    
  \immediate\write18{\cp enteteMP.cfg \nomtravail_Tab.mp}% Reconstituer l'entête de Tableaux.mp  
 }   
 {\IfFileExists{\nomtravail_Tab.mp}%   Sans l'option XCas, si  
                 %   Tableaux.mp existe  
 {\immediate\write18{mpost -interaction=batchmode \nomtravail_Tab}}% l'executer pour reconstituer les figures  
 {\PackageWarning{tablor}{Pas de source metapost pour creer les tableaux.}}% sinon message d'erreur  
                 % (mais pas d'arret car les tableaux  
                 % peuvent être presents )  
 }}%  
 %% commande pour lancer giac selon l'OS  
 \makeatletter  
 \newcommand{\executGiacmp}[1]{%  
 \ifthenelse{\boolean{windows}}%  
 {\immediate\write18{giac #1 }}%  
 {\immediate\write18{giac <#1 }}}  
 \makeatother  
 %%%  
 %  
 %%% LES SCRIPTS GIAC/XCAS  
 %  
 %%%  
 %%  
 %% Code giac/Xcas pour les Tableaux de Variations  
 %%  
 \begin{VerbatimOut}{XcasTV.cxx}  
 TV(L,F,nom,nomv,f,ftt,trigo,nmr):={  
 nl:=size(L);  
 f:=unapply(f,x);  
 fp:=function_diff(f);  
 Z:=concat(L,F);  
 S:=[];  
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(fp(x))),x);  
 ns:=size(SS);  
 for(k:=0;k<ns;k++){  
 m:=0;  
 while(evalf(simplify(subst(SS[k],n_1=m)))<=evalf(L[nl-1])){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[k],n_1=m))>=L[0]){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(factor(simplify(fp(x))),x);  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire  
                qq:=member(simplify(S[j]),Z)==0;  
                kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){if(qq==1){Z:=append(Z,simplify(S[j]))}};  
              fpour  
  fsi;  
 Z:=sort(Z);  
 nz:=size(Z);  
  tantque evalf(Z[0])==evalf(Z[1]) faire Z:=Z[1..nz-1];nz:=size(Z);  
    ftantque;  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
                kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){Z:=append(Z,simplify(S[j]))};  
              fpour  
  fsi;  
 Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;   
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
    if(Z[0]==-infinity){if(sign(evalf(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1.0){"plus;"}else{"moins;"}}else{if(member(Z[0],F)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(evalf(sign(fp(Z[0]+10^(-5))))==1.0){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(evalf(sign(fp((Z[0]+10^(-5)))))==1.0){"plus;"}else{"moins;"} }}  
 if(nz>2){ for(r:=1; r<=nz-2;r++){   ksp:=evalf(fp(Z[r]+0.1))>0;             
                         lsp:=lsp+if(member(Z[r],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                         if(ksp==1){"plus;"}else{"moins;"}  
                          }; }  
 lsf:=if(member(Z[nz-1],F)==0){""}else{"nonDefBarre;  
 "}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
    li:=lvic+nom+"}$ etex);"+  
       if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1"}else{"0"}+  
              ");";  
            if(nz>2){ for(r:=1; r<=nz-2;r++){ krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
                          krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
                          lp:=lp+if(member(Z[r],F)){  
                   "limGauche(btex  
                   $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],-1)))}+"$  
                   etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[r])))+"$  
                       etex,"+if(sign(evalf(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);  
 "}}}  
                           }; }  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:=if(ftt==2){if(nz>2){"  
 beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{ if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }}  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%%%  
 %  
 %  
 % TVPC : pour les fonctions prolongeables par continuité.  
 %%  
 %%  
 \begin{VerbatimOut}{XcasTVPC.cxx}  
 TVPC(L,F,FP,nom,nomv,f,ftt,trigo,nmr):={  
 nl:=size(L);  
 f:=unapply(f,x);  
 fp:=function_diff(f);  
 Z:=concat(L,F);  
 Z:=concat(Z,FP);  
 S:=[];  
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(fp(x))),x);  
 ns:=size(SS);  
 for(k:=0;k<ns;k++){  
 m:=0;  
 while(evalf(simplify(subst(SS[k],n_1=m)))<=evalf(L[nl-1])){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[k],n_1=m))>=L[0]){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(factor(simplify(fp(x))),x);  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire  
                qq:=member(simplify(S[j]),Z)==0;  
                kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){if(qq==1){Z:=append(Z,simplify(S[j]))}};  
              fpour  
  fsi;  
 Z:=sort(Z);  
 nz:=size(Z);  
  tantque evalf(Z[0])==evalf(Z[1]) faire Z:=Z[1..nz-1];nz:=size(Z);  
    ftantque;  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
                kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){Z:=append(Z,simplify(S[j]))};  
              fpour  
  fsi;  
 Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;   
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
    if(Z[0]==-infinity){if(sign(evalf(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1.0){"plus;"}else{"moins;"}}else{if(member(Z[0],FP)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(evalf(sign(fp(Z[0]+10^(-5))))==1.0){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(evalf(sign(fp((Z[0]+10^(-5)))))==1.0){"plus;"}else{"moins;"} }}  
 if(nz>2){ for(r:=1; r<=nz-2;r++){   ksp:=evalf(fp(Z[r]+0.1))>0;             
                         lsp:=lsp+if(member(Z[r],FP)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                         if(ksp==1){"plus;"}else{"moins;"}  
                          }; }  
 lsf:=if(member(Z[nz-1],FP)==0){""}else{"nonDefBarre;  
 "}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
    li:=lvic+nom+"}$ etex);"+  
       if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1"}else{"0"}+  
              ");";  
            if(nz>2){ for(r:=1; r<=nz-2;r++){ krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
                          krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
                          lp:=lp+if(member(Z[r],F)){   
                   "valPos(btex  
                   $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],-1)))}+"$  
                   etex,"+if(krm==1){"1);"}else{"0);"} }  
                      else{"valPos(btex     $"+latex(simplify(f(Z[r])))+"$  
                       etex,"+if(sign(evalf(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);  
 "}}}  
                           }; }  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);"}else{"0);"}};    
 MetaLfc:=if(ftt==2){if(nz>2){"  
 beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{ if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }}  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%  
 %%  
 %% TV avec une zone interdite : on rajoute comme argument la liste des intervalles interdits  
 %% par exemple, pour sqrt(x^2-1) : TVZ([-infinity,100],[],[[-1,1]],"f","x",sqrt(x^2-1),1,1)  
 %%  
 \begin{VerbatimOut}{XcasTVZ.cxx}  
 TVZ(L,F,FF,nom,nomv,f,ftt,trigo,nmr):={  
 nl:=size(L);  
 nf:=size(FF);  
  Ff:=NULL;IMIN:=NULL;IMAX:=NULL;  
 for(k:=0;k<nf;k++){  
 if(FF[k][0]>L[0]){Imin[k]:=FF[k][0];LL:=L}else{Imin[k]:=L[0];LL:=[L[1]]};  
 if(FF[k][1]<L[1]){Imax[k]:=FF[k][1];LL:=L}else{Imax[k]:=L[1];LL:=[L[0]]};  
  Ff:=Ff,[Imin[k],Imax[k]];  
  IMIN:=IMIN,Imin[k];  
  IMAX:=IMAX,Imax[k];  
  }  
  FF:=[Ff];  
  IMIN:=[IMIN];  
  IMAX:=[IMAX];  
  f:=unapply(f,x);  
 fp:=function_diff(f);  
 Z:=concat(LL,F);  
 for(k:=0;k<nf;k++){  
 Z:=concat(Z,FF[k]);  
 }  
 S:=[];  
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(fp(x))),x);  
 ns:=size(SS);  
 for(k:=0;k<ns;k++){  
 m:=0;  
 while(evalf(simplify(subst(SS[k],n_1=m)))<=evalf(L[nl-1])){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[k],n_1=m))>=L[0]){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(factor(simplify(fp(x))),x);  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
              for(k:=0;k<nf;k++){   
               kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
                kK:=(evalf(S[j])<evalf(Imin[k])) or (evalf(S[j])>evalf(Imax[k]));  
                Kk:=(kk) and kK;  
              if(Kk==1){Z:=append(Z,simplify(S[j]))};  
              }  
             fpour  
  fsi;  
 Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 for(j:=0;j<nf;j++){  
  for(k:=1;k<nz;k++){  
   if ((Z[k]>Imin[j])and(Z[k]<Imax[j])){Z:=augment(Z[0..k-1],Z[k+1..nz-1]);nz:=nz-1;  
   }  
  }  
 }  
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;   
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
 if(member(Z[0],IMIN)!=0){if((member(Z[0],F)==0) and (fp(Z[0])!=undef)){"debutNonDef;"}else{"debutNonDefStrict;"}}else{if(Z[0]==-infinity){if(sign(evalf(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1.0){"plus;"}else{"moins;"}}else{if(member(Z[0],F)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(evalf(sign(fp(Z[0]+10^(-5))))==1.0){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(evalf(sign(fp((Z[0]+10^(-5)))))==1.0){"plus;"}else{"moins;"} }}}  
 // modif 3 avril 2010  
 if(nz>2){ for(r:=1; r<=nz-2;r++){   
        lsp:=lsp+  
        if(member(Z[r],IMIN)!=0){  
         if((member(Z[r],F)==0) and (fp(Z[r])!=undef)){"debutNonDef;"}  
         else{"debutNonDefStrict;"}}  
        else{if(member(Z[r],IMAX)!=0){if((member(Z[r],F)==0) and (fp(Z[r])!=undef)){"finNonDef;"}  
                         else{"finNonDefStrict;"}+  
                         if(evalf(fp(Z[r]+0.01))>0){"plus;"}  
                         else{"moins;"}}  
           else{if(member(Z[r],F)==0){"valBarre(btex 0 etex);"}  
              else{"nonDefBarre;"}+  
              if(evalf(fp(Z[r]+0.01))>0){"plus;"}  
              else{"moins;"}  
                          }}  
               }};   
 // fin modif  
 lsf:=if(member(Z[nz-1],IMAX)!=0){if((member(Z[nz-1],F)==0) and (fp(Z[nz-1])!=undef)){"finNonDef;"}else{"finNonDefStrict;"}}else{if(member(Z[nz-1],F)==0){""}else{"nonDefBarre;  
 "}}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
    li:=lvic +nom+"}$ etex);"+  
       if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1"}else{"0"}+  
              ");";  
 if(nz>2){   
   for(r:=1; r<=nz-2;r++){   
    krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
    krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
    lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
    lp:=lp+if(member(Z[r],IMIN)!=0){"limGauche(btex $"+if(lmrm==1){  
        "-\\infty"}else{  
         latex(simplify(limit(f(x),x=Z[r],-1)))}  
      +"$ etex,"+if(krm==1){  
        "1);"}else{"0);"}   
      +if(member(Z[r],F)==0){"debutNonDef;"}else{"debutNonDefStrict;"}  
     }//fsi Zr=Imin  
    else{  
     if (member(Z[r],IMAX)!=0){if(member(Z[r],F)==0){"finNonDef;"}else{"finNonDefStrict;"}+"limDroite(btex $"+if(lmrp==1){  
        "-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}  
      +"$ etex,"+if(krp==1){  
        "1);"}else{"0);"}       
     }else{  
      if(member(Z[r],F)){  
      "limGauche(btex $"+if(lmrm==1){  
        "-\\infty"}else{  
         latex(simplify(limit(f(x),x=Z[r],-1)))}  
      +"$ etex,"+if(krm==1){  
        "1);"}else{"0);"}  
      +"nonDefBarre;limDroite(btex $"+if(lmrp==1){  
        "-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}  
      +"$ etex,"+if(krp==1){  
        "1);"}else{"0);"}  
      }//fsi (member Zr F)  
      else{"valPos(btex$"+latex(simplify(f(Z[r])))+"$etex,"+  
        if(sign(evalf(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){  
         "0.5);"}else{  
           if(krp==1){  
             "1);"}else{"0);"}//felse(krp)  
           }//felse(valpos)  
         }//felse(member Zr F)  
         } //felse(Zr=Imax)  
        }//felse(Zr=Imin)  
       };//ffor   
      }//fsi nz  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:=if(ftt==2){if(nz>2){"  
 beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{ if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }}  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }  
 :;  
 \end{VerbatimOut}  
 %%  
 %%  
 %% Quand les solutions formelles de f'(x)=0 ne sont pas calculables  
 %%  
 \begin{VerbatimOut}{XcasTVapp.cxx}  
 TVapp(L,F,nom,nomv,f,ftt,nmr):={  
 local nl,fp,z0,z,nz,S,k,j,m,kk,kok,Z,l0,lp,lf,lsp,k0,kz,lsi,r,ksp,lsf,lm0,li,krm,krp,lmrm,lmrp,lnz;  
 nl:=size(L);  
 f:=unapply(f,x);  
 fp:=function_diff(f);  
 z0:=concat(L,F);z:=sort(z0);  
 nz:=size(z);  
 S:=NULL;  
 if(L==[-infinity,+infinity]){j:=[seq(-50+2*k,k=0..50)]minus F;  
  for k in j do for(m:=-5;m<=5;m++){S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for}  
 else{if(L[0]==-infinity){j:=[seq(2*k,k=-25..0.5*floor(L[1]))] minus F;  
  for k in j do for(m:=-5;m<=5;m++){ S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for}  
 else{if(L[1]==+infinity){  
 j:=[seq(2*k,k=floor(0.5*L[0])..0.5*50)] minus F;  
  for k in j do for(m:=-5;m<=5;m++){ S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for  
 }  
 else{ j:=[seq(2*k,k=0.5*floor(z[0])..0.5*floor(z[nz-1]))] minus F;  
  for k in j do for(m:=-5;m<=5;m++){S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for }  
  }};  
 si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
                kk:=(re(S[j])==S[j]);kok:=(evalf(S[j])>=L[0]) and (evalf(S[j])<=L[1]);  
              if(kk==1){if(kok==1){z:=append(z,simplify(S[j]))}};  
              fpour;  
 fsi;  
 S:=NULL;  
 S:=S,z[0];  
 for(j:=1;j<size(z);j++){  
  if(z[j]!=undef and (abs(z[j])>1e-15 or z[j]==0)){  
   S:=S,z[j]};  
 }  
 z:=[S];  
 Z:=sort(z);  
 nz:=size(Z);  
 S:=NULL;  
 S:=S,Z[0];  
 for(j:=1;j<nz;j++){  
  if(Z[j]!=S[size(S)-1]){  
   S:=S,Z[j]};  
 }  
 Z:=[S];   
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;   
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
    if(Z[0]==-infinity){if(sign(evalf(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1.0){"plus;"}else{"moins;"}}else{if(member(Z[0],F)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(evalf(sign(fp(Z[0]+10^(-5))))==1.0){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(evalf(sign(fp((Z[0]+10^(-5)))))==1.0){"plus;"}else{"moins;"} }}  
 if(nz>2){ for(r:=1; r<=nz-2;r++){   ksp:=evalf(fp(Z[r]+0.01))>0;             
                         lsp:=lsp+if(member(Z[r],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                         if(ksp==1){"plus;"}else{"moins;"}  
                          }; }  
 lsf:=if(member(Z[nz-1],F)==0){""}else{"nonDefBarre;  
 "}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
    li:=lvic+nom+"}$ etex);"+  
       if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1"}else{"0"}+  
              ");";  
            if(nz>2){ for(r:=1; r<=nz-2;r++){ krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
                          krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
                          lp:=lp+if(member(Z[r],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[r])))+"$  
                       etex,"+if(sign(evalf(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);  
 "}}}  
                           }; }  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:=if(ftt==2){if(nz>2){"  
 beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{ if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }}  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%  
 %% Code giac/Xcas pour les Tableaux de Variations avec   
 %% Valeurs intermediaires  
 %%  
 \begin{VerbatimOut}{XcasTVI.cxx}  
 TVI(L,F,nom,nomv,f,ftt,ao,trigo,nmr):={  
 nl:=size(L);  
 f:=unapply(f,x);  
 fp:=function_diff(f);  
 Z:=concat(L,F);  
 S:=[];  
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(fp(x))),x);  
 ns:=size(SS);  
 for(k:=0;k<ns;k++){  
 m:=0;  
 while(evalf(simplify(subst(SS[k],n_1=m)))<=evalf(L[nl-1])){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[k],n_1=m))>=L[0]){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(factor(simplify(fp(x))),x);  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
               kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){Z:=append(Z,simplify(S[j]))};  
              fpour  
  fsi;  
 Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 LI:=limit(f(x),x,Z[0],1);  
 LF:=limit(f(x),x,Z[nz-1],-1);  
 LP:=NULL;  
 PB:=1;  
 if(nz>2){                            for(r:=1;  
  r<=nz-2;r++){LP:=LP,if(member(Z[r],F)){limit(f(x),x,Z[r],-1),limit(f(x),x,Z[r],1)}else{f(Z[r])};  
 if(member(Z[r],F)){PB:=PB,0,1}else{PB:=PB,1};  
 }  
 };  
 if(nz>2){ LL:=[LI,LP,LF]; PB:=[PB,1]}else{LL:=[LI,LF];PB:=[1,1]};  
 NL:=size(LL);  
 A:=NULL;aa:=1;  
 kk:=0;  
 if(NL==nz){for(k:=0;k<nz-1;k++){TestS:=(evalf(sign(LL[k]-ao))==evalf(sign(LL[k+1]-ao))) or (evalf(sign(LL[k]-ao))==0.0)or (evalf(sign(LL[k+1]-ao))==0.0);  
 if(TestS==0){A:=A,aa;l0:=l0+"val(btex $"+latex(Z[k])+"$ etex);"+"val(btex $\\alpha_"+aa+"$ etex);";aa:=aa+1;}else{l0:=l0+"val(btex $"+latex(Z[k])+"$ etex);"}}  
 l0:=l0+"val(btex $"+latex(Z[nz-1])+"$ etex);"};  
 //chgmt NL->nz  
 if(NL>nz){for(k:=0;k<NL-1;k++){TestS:=(evalf(sign(LL[k]-ao))==evalf(sign(LL[k+1]-ao))) or (evalf(sign(LL[k]-ao))==0.0)or (evalf(sign(LL[k+1]-ao))==0.0);  
 if(PB[k]==1){if(TestS==0){  
   A:=A,aa;l0:=l0+"val(btex $"+latex(Z[kk])+"$ etex);"+"val(btex $\\alpha_"+aa+"$ etex);";aa:=aa+1;kk:=kk+1}  
 else{l0:=l0+"val(btex $"+latex(Z[kk])+"$ etex);";kk:=kk+1}};  
 }  
  l0:=l0+"val(btex $"+latex(Z[nz-1])+"$ etex);"  
  };  
 TestS:=(evalf(sign(LL[0]-ao))==evalf(sign(LL[1]-ao))) or (evalf(sign(LL[0]-ao))==0.0) or (evalf(sign(LL[1]-ao))==0.0);  
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
    if(Z[0]==-infinity){if(evalf(sign(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1.0){"plus;"}else{"moins;"}}else{if(member(Z[0],F)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(evalf(sign(fp((Z[0]+10^(-3)))))==1.0){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(evalf(sign(fp(10^(-3)+Z[0])))==1.0){"plus;"}else{"moins;"} }}+if(TestS==0){"valBarre(btex$  
                             $ etex);"+   
 if(evalf(sign(fp(10^(-3)+ifte(Z[0]==-infinity,ifte(Z[1]==+infinity,ifte(member(0,F)==0,0,0.01),ifte(member(Z[1]-1,F)==0,Z[1]-1,Z[1]-1.1)),Z[0]))))==1.0){"plus;"}else{"moins;"}}else{" "};   
 if(nz>2){rr:=1; if(nz==NL){for(r:=1; r<=NL-2;r++){ TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          ksp:=evalf(fp(Z[r]+0.01))>0;   
                          TestL:=(abs(LL[r])==abs(LL[r+1]));  
                  lsp:=lsp+if(member(Z[r],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(ksp==1){"plus;"}else{"moins;"}+if(TestS==0){"valBarre(btex $ $ etex);"}else{" "}+if(TestS==0){if(ksp==1){"plus;"}else{"moins;"}}else{" "};  
                      }}   
 else{for(r:=1; r<=NL-2;r++){kspp:=evalf(fp(Z[rr]+0.01))>0;TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);  
            if(PB[r]==1){if(TestS==0){lsp:=lsp+if(member(Z[rr],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(kspp==1){"plus;"}else{"moins;"}+"valBarre(btex $ $ etex);"+if(kspp==1){"plus;"}else{"moins;"};rr:=rr+1;}  
                   else{lsp:=lsp+if(member(Z[rr],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(kspp==1){"plus;"}else{"moins;"};rr:=rr+1;}      
 }}}};   
  lsf:=if(member(Z[nz-1],F)==0){" "}else{"nonDefBarre;"}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
 TestS:=(evalf(sign(LL[0]-ao))==evalf(sign(LL[1]-ao))) or (evalf(sign(LL[0]-ao))==0.0) or (evalf(sign(LL[1]-ao))==0.0);  
    li:=lvic+nom+"}$ etex);  
 "+ if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1);"}else{"0);"}+if(TestS==0){"valPos(btex $ "+ao+" $ etex,0.5);"}else{" "};   
            if(nz>2){if(nz==NL){for(r:=1; r<=nz-2;r++){TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
                          krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
                          lp:=lp+if(member(Z[r],F)) {  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[r])))+"$  
                       etex,"+if(evalf(sign(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);"}}}+if(TestS==0){"valPos(btex  
                       $ "+ao+" $ etex,0.5);"  
                               }else{" "};   
 };//for          
 }else{rr:=1;for(r:=1; r<=NL-2;r++){TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          krm:=evalf(limit(f(x),x=Z[rr-1],1))< evalf(limit(f(x),x=Z[rr],-1));  
                          krp:=evalf(limit(f(x),x=Z[rr],1))> evalf(limit(f(x),x=Z[rr+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[rr],-1)==-infinity;lmrp:=limit(f(x),x=Z[rr],1)==-infinity; TestL:=(abs(LL[r])==abs(LL[r+1]));  
 if(PB[r]==1){if(TestS==0){lp:=lp+if(member(Z[rr],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[rr])))+"$  
                       etex,"+if(evalf(sign(fp(Z[rr]-0.01)))==sign(fp(Z[rr]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);"}}}+"valPos(btex  
                       $ "+ao+" $ etex,0.5);  
                                  ";rr:=rr+1;  
 }// testS==0  
 else{lp:=lp+if(member(Z[rr],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[rr])))+"$  
                       etex,"+if(evalf(sign(fp(Z[rr]-0.01)))==sign(fp(Z[rr]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);  
                               "}}};rr:=rr+1;  
 }//else testS==0  
 }//PB[r]==1  
 }//for nz<NL  
 }// else nz<NL  
 //if nz=NL  
 };//if nz>2  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:= if(ftt==2){if(nz>2){"beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{  
 if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }};  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%  
 %  
 %  
 %  
 % Pour avoir les racines sous forme exacte.... quand c'est possible !  
 %  
 %  
 %  
 %%%%%%%%%  
 \begin{VerbatimOut}{XcasTVIex.cxx}  
 TVIex(L,F,nom,nomv,f,ftt,ao,trigo,nmr):={  
 nl:=size(L);  
 f:=unapply(f,x);  
 fp:=function_diff(f);  
 Z:=concat(L,F);  
 S:=[];  
 Sex:=NULL;  
 Zex:=solve(f(x)=ao);  
 Zex:=sort(Zex);  
 for(j:=0;j<size(Zex);j++){  
 if((evalf(Zex[j])>=evalf(L[0])) and (evalf(Zex[j])<=evalf(L[nl-1]))){Sex:=Sex,Zex[j]};  
 };  
 Sex:=[Sex];  
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(fp(x))),x);  
 ns:=size(SS);  
 for(k:=0;k<ns;k++){  
 m:=0;  
 while(evalf(simplify(subst(SS[k],n_1=m)))<=evalf(L[nl-1])){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[k],n_1=m))>=L[0]){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(factor(simplify(fp(x))),x);  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
               kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){Z:=append(Z,simplify(S[j]))};  
              fpour  
  fsi;  
  Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 LI:=limit(f(x),x,Z[0],1);  
 LF:=limit(f(x),x,Z[nz-1],-1);  
 LP:=NULL;  
 PB:=1;  
 if(nz>2){                            for(r:=1;  
  r<=nz-2;r++){LP:=LP,if(member(Z[r],F)){limit(f(x),x,Z[r],-1),limit(f(x),x,Z[r],1)}else{f(Z[r])};  
 if(member(Z[r],F)){PB:=PB,0,1}else{PB:=PB,1};  
 }  
 };  
 if(nz>2){ LL:=[LI,LP,LF]; PB:=[PB,1]}else{LL:=[LI,LF];PB:=[1,1]};  
 NL:=size(LL);  
 A:=NULL;aa:=0;  
 kk:=0;  
 if(NL==nz){for(k:=0;k<nz-1;k++){TestS:=(evalf(sign(LL[k]-ao))==evalf(sign(LL[k+1]-ao))) or (evalf(sign(LL[k]-ao))==0.0)or (evalf(sign(LL[k+1]-ao))==0.0);  
 if(TestS==0){A:=A,aa;l0:=l0+"val(btex $"+latex(Z[k])+"$ etex);"+"val(btex $"+latex(simplify(Sex[aa]))+"$ etex);";aa:=aa+1;}else{l0:=l0+"val(btex $"+latex(Z[k])+"$ etex);"}}  
 l0:=l0+"val(btex $"+latex(Z[nz-1])+"$ etex);"};  
 //chgmt NL->nz  
 if(NL>nz){for(k:=0;k<NL-1;k++){TestS:=(evalf(sign(LL[k]-ao))==evalf(sign(LL[k+1]-ao))) or (evalf(sign(LL[k]-ao))==0.0)or (evalf(sign(LL[k+1]-ao))==0.0);  
 if(PB[k]==1){if(TestS==0){  
   A:=A,aa;l0:=l0+"val(btex $"+latex(Z[kk])+"$ etex);"+"val(btex $"+latex(simplify(Sex[aa]))+"$ etex);";aa:=aa+1;kk:=kk+1}  
 else{l0:=l0+"val(btex $"+latex(Z[kk])+"$ etex);";kk:=kk+1}};  
 }  
  l0:=l0+"val(btex $"+latex(Z[nz-1])+"$ etex);"  
  };  
 TestS:=(evalf(sign(LL[0]-ao))==evalf(sign(LL[1]-ao))) or (evalf(sign(LL[0]-ao))==0.0) or (evalf(sign(LL[1]-ao))==0.0);  
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
    if(Z[0]==-infinity){if(evalf(sign(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1){"plus;"}else{"moins;"}}else{if(member(Z[0],F)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(sign(fp((Z[0]+10^(-3))))==1){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(sign(fp(10^(-3)+Z[0]))==1){"plus;"}else{"moins;"} }}+if(TestS==0){"valBarre(btex$  
                             $ etex);"+  
 if(evalf(sign(fp(10^(-3)+ifte(Z[0]==-infinity,ifte(Z[1]==+infinity,ifte(member(0,F)==0,0,0.01),ifte(member(Z[1]-1,F)==0,Z[1]-1,Z[1]-1.1)),Z[0]))))==1.0){"plus;"}else{"moins;"}}else{" "};   
 if(nz>2){rr:=1; if(nz==NL){for(r:=1; r<=NL-2;r++){ TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          ksp:=evalf(fp(Z[r]+0.01))>0;   
                          TestL:=(abs(LL[r])==abs(LL[r+1]));  
                  lsp:=lsp+if(member(Z[r],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(ksp==1){"plus;"}else{"moins;"}+if(TestS==0){"valBarre(btex $ $ etex);"}else{" "}+if(TestS==0){if(ksp==1){"plus;"}else{"moins;"}}else{" "};  
                      }}   
 else{for(r:=1; r<=NL-2;r++){kspp:=evalf(fp(Z[rr]+0.01))>0;TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);  
            if(PB[r]==1){if(TestS==0){lsp:=lsp+if(member(Z[rr],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(kspp==1){"plus;"}else{"moins;"}+"valBarre(btex $ $ etex);"+if(kspp==1){"plus;"}else{"moins;"};rr:=rr+1;}  
                   else{lsp:=lsp+if(member(Z[rr],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(kspp==1){"plus;"}else{"moins;"};rr:=rr+1;}      
 }}}};   
  lsf:=if(member(Z[nz-1],F)==0){" "}else{"nonDefBarre;"}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
 TestS:=(evalf(sign(LL[0]-ao))==evalf(sign(LL[1]-ao))) or (evalf(sign(LL[0]-ao))==0.0) or (evalf(sign(LL[1]-ao))==0.0);  
    li:=lvic+nom+"}$ etex);  
 "+ if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1);"}else{"0);"}+if(TestS==0){"valPos(btex $ "+ao+" $ etex,0.5);"}else{" "};   
            if(nz>2){if(nz==NL){for(r:=1; r<=nz-2;r++){TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
                          krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
                          lp:=lp+if(member(Z[r],F)) {  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[r])))+"$  
                       etex,"+if(evalf(sign(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);"}}}+if(TestS==0){"valPos(btex  
                       $ "+ao+" $ etex,0.5);"  
                               }else{" "};   
 };//for          
 }else{rr:=1;for(r:=1; r<=NL-2;r++){TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          krm:=evalf(limit(f(x),x=Z[rr-1],1))< evalf(limit(f(x),x=Z[rr],-1));  
                          krp:=evalf(limit(f(x),x=Z[rr],1))> evalf(limit(f(x),x=Z[rr+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[rr],-1)==-infinity;lmrp:=limit(f(x),x=Z[rr],1)==-infinity; TestL:=(abs(LL[r])==abs(LL[r+1]));  
 if(PB[r]==1){if(TestS==0){lp:=lp+if(member(Z[rr],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[rr])))+"$  
                       etex,"+if(evalf(sign(fp(Z[rr]-0.01)))==sign(fp(Z[rr]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);"}}}+"valPos(btex  
                       $ "+ao+" $ etex,0.5);  
                                  ";rr:=rr+1;  
 }// testS==0  
 else{lp:=lp+if(member(Z[rr],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[rr])))+"$  
                       etex,"+if(evalf(sign(fp(Z[rr]-0.01)))==sign(fp(Z[rr]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);  
                               "}}};rr:=rr+1;  
 }//else testS==0  
 }//PB[r]==1  
 }//for nz<NL  
 }// else nz<NL  
 //if nz=NL  
 };//if nz>2  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:= if(ftt==2){if(nz>2){"beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{  
 if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }};  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%  
 %%  
 %% Quand les solutions de f'(x)=0 ne sont pas formellement calculables  
 %%  
 \begin{VerbatimOut}{XcasTVIapp.cxx}  
 TVIapp(L,F,nom,nomv,f,ftt,ao,nmr):={  
 nl:=size(L);  
 f:=unapply(f,x);  
 fp:=function_diff(f);  
 z0:=concat(L,F);z:=sort(z0);  
 nz:=size(z);  
 S:=op(fsolve(fp(x),x));  
 if(L==[-infinity,+infinity]){j:=[seq(-50+2*k,k=0..50)]minus F;  
  for k in j do for(m:=-5;m<=5;m++){S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for}  
 else{if(L[0]==-infinity){j:=[seq(2*k,k=-25..0.5*floor(L[1]))] minus F;  
  for k in j do for(m:=-5;m<=5;m++){ S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for}  
 else{if(L[1]==+infinity){  
 j:=[seq(2*k,k=floor(0.5*L[0])..0.5*50)] minus F;  
  for k in j do for(m:=-5;m<=5;m++){ S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for  
 }  
 else{ j:=[seq(2*k,k=0.5*floor(z[0])..0.5*floor(z[nz-1]))] minus F;  
  for k in j do for(m:=-5;m<=5;m++){S:=S,resoudre_numerique(fp(y),y,k+m*0.1,k+(m+1)*0.1,bisection_solver)};end_for }  
  }};  
 si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
                kk:=(re(S[j])==S[j]);kok:=(evalf(S[j])>=L[0]) and (evalf(S[j])<=L[1]);  
              if(kk==1){if(kok==1){z:=append(z,simplify(S[j]))}};  
              fpour;  
 fsi;  
 S:=NULL;  
 S:=S,z[0];  
 for(j:=1;j<size(z);j++){  
  if(z[j]!=undef and (abs(z[j])>1e-15 or z[j]==0)){  
   S:=S,z[j]};  
 }  
 z:=[S];  
 Z:=sort(z);  
 nz:=size(Z);  
 S:=NULL;  
 S:=S,Z[0];  
 for(j:=1;j<nz;j++){  
  if(Z[j]!=S[size(S)-1]){  
   S:=S,Z[j]};  
 }  
 Z:=[S];   
 nz:=size(Z);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";lsp:=" ";  
 LI:=limit(f(x),x,Z[0],1);  
 LF:=limit(f(x),x,Z[nz-1],-1);  
 LP:=NULL;  
 PB:=1;  
 if(nz>2){                            for(r:=1;  
  r<=nz-2;r++){LP:=LP,if(member(Z[r],F)){limit(f(x),x,Z[r],-1),limit(f(x),x,Z[r],1)}else{f(Z[r])};  
 if(member(Z[r],F)){PB:=PB,0,1}else{PB:=PB,1};  
 }  
 };  
 if(nz>2){ LL:=[LI,LP,LF]; PB:=[PB,1]}else{LL:=[LI,LF];PB:=[1,1]};  
 NL:=size(LL);  
 A:=NULL;aa:=1;  
 kk:=0;  
 if(NL==nz){for(k:=0;k<nz-1;k++){TestS:=(evalf(sign(LL[k]-ao))==evalf(sign(LL[k+1]-ao))) or (evalf(sign(LL[k]-ao))==0.0)or (evalf(sign(LL[k+1]-ao))==0.0);  
 if(TestS==0){A:=A,aa;l0:=l0+"val(btex $"+latex(Z[k])+"$ etex);"+"val(btex $\\alpha_"+aa+"$ etex);";aa:=aa+1;}else{l0:=l0+"val(btex $"+latex(Z[k])+"$ etex);"}}  
 l0:=l0+"val(btex $"+latex(Z[nz-1])+"$ etex);"};  
 //chgmt NL->nz  
 if(NL>nz){for(k:=0;k<NL-1;k++){TestS:=(evalf(sign(LL[k]-ao))==evalf(sign(LL[k+1]-ao))) or (evalf(sign(LL[k]-ao))==0.0)or (evalf(sign(LL[k+1]-ao))==0.0);  
 if(PB[k]==1){if(TestS==0){  
   A:=A,aa;l0:=l0+"val(btex $"+latex(Z[kk])+"$ etex);"+"val(btex $\\alpha_"+aa+"$ etex);";aa:=aa+1;kk:=kk+1}  
 else{l0:=l0+"val(btex $"+latex(Z[kk])+"$ etex);";kk:=kk+1}};  
 }  
  l0:=l0+"val(btex $"+latex(Z[nz-1])+"$ etex);"  
  };  
 TestS:=(evalf(sign(LL[0]-ao))==evalf(sign(LL[1]-ao))) or (evalf(sign(LL[0]-ao))==0.0) or (evalf(sign(LL[1]-ao))==0.0);  
     k0:= evalf(limit(f(x),x=Z[0],1))> evalf(limit(f(x),x=Z[1],-1));  
     kz:=evalf(limit(f(x),x=Z[nz-1],-1))> evalf(limit(f(x),x=Z[nz-2],1));  
 lsi:=lsic+nom+"'("+nomv+")}$ etex);"+  
    if(Z[0]==-infinity){if(evalf(sign(fp(if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1){"plus;"}else{"moins;"}}else{if(member(Z[0],F)==0){  
                           if(fp(Z[0])==0){"valBarre(btex 0 etex);"}else{" "}+  
                           if(sign(fp((Z[0]+10^(-3))))==1){"plus;"}else{"moins;"}}else{"nonDefBarre;"+  
                              if(sign(fp(10^(-3)+Z[0]))==1){"plus;"}else{"moins;"} }}+if(TestS==0){"valBarre(btex$  
                             $ etex);"+  
 if(evalf(sign(fp(10^(-3)+ifte(Z[0]==-infinity,ifte(Z[1]==+infinity,ifte(member(0,F)==0,0,0.01),ifte(member(Z[1]-1,F)==0,Z[1]-1,Z[1]-1.1)),Z[0]))))==1.0){"plus;"}else{"moins;"}}else{" "};   
 if(nz>2){rr:=1; if(nz==NL){for(r:=1; r<=NL-2;r++){ TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          ksp:=evalf(fp(Z[r]+0.01))>0;   
                          TestL:=(abs(LL[r])==abs(LL[r+1]));  
                  lsp:=lsp+if(member(Z[r],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(ksp==1){"plus;"}else{"moins;"}+if(TestS==0){"valBarre(btex $ $ etex);"}else{" "}+if(TestS==0){if(ksp==1){"plus;"}else{"moins;"}}else{" "};  
                      }}   
 else{for(r:=1; r<=NL-2;r++){kspp:=evalf(fp(Z[rr]+0.01))>0;TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);  
            if(PB[r]==1){if(TestS==0){lsp:=lsp+if(member(Z[rr],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(kspp==1){"plus;"}else{"moins;"}+"valBarre(btex $ $ etex);"+if(kspp==1){"plus;"}else{"moins;"};rr:=rr+1;}  
                   else{lsp:=lsp+if(member(Z[rr],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}+  
                  if(kspp==1){"plus;"}else{"moins;"};rr:=rr+1;}      
 }}}};   
  lsf:=if(member(Z[nz-1],F)==0){" "}else{"nonDefBarre;"}  
 lm0:=limit(f(x),x=Z[0],1)==-infinity;  
 TestS:=(evalf(sign(LL[0]-ao))==evalf(sign(LL[1]-ao))) or (evalf(sign(LL[0]-ao))==0.0) or (evalf(sign(LL[1]-ao))==0.0);  
    li:=lvic+nom+"}$ etex);  
 "+ if(member(Z[0],F)==0){"valPos(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[0],1)))}+"$ etex,"}+                  
       if(k0==1){"1);"}else{"0);"}+if(TestS==0){"valPos(btex $ "+ao+" $ etex,0.5);"}else{" "};   
            if(nz>2){if(nz==NL){for(r:=1; r<=nz-2;r++){TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          krm:=evalf(limit(f(x),x=Z[r-1],1))< evalf(limit(f(x),x=Z[r],-1));  
                          krp:=evalf(limit(f(x),x=Z[r],1))> evalf(limit(f(x),x=Z[r+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[r],-1)==-infinity;lmrp:=limit(f(x),x=Z[r],1)==-infinity;  
                          lp:=lp+if(member(Z[r],F)) {  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[r],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[r])))+"$  
                       etex,"+if(evalf(sign(fp(Z[r]-0.01)))==sign(fp(Z[r]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);"}}}+if(TestS==0){"valPos(btex  
                       $ "+ao+" $ etex,0.5);"  
                               }else{" "};   
 };//for          
 }else{rr:=1;for(r:=1; r<=NL-2;r++){TestS:=(evalf(sign(LL[r]-ao))==evalf(sign(LL[r+1]-ao))) or (evalf(sign(LL[r]-ao))==0.0)or (evalf(sign(LL[r+1]-ao))==0.0);   
                          krm:=evalf(limit(f(x),x=Z[rr-1],1))< evalf(limit(f(x),x=Z[rr],-1));  
                          krp:=evalf(limit(f(x),x=Z[rr],1))> evalf(limit(f(x),x=Z[rr+1],-1)) ;   
              lmrm:=limit(f(x),x=Z[rr],-1)==-infinity;lmrp:=limit(f(x),x=Z[rr],1)==-infinity; TestL:=(abs(LL[r])==abs(LL[r+1]));  
 if(PB[r]==1){if(TestS==0){lp:=lp+if(member(Z[rr],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[rr])))+"$  
                       etex,"+if(evalf(sign(fp(Z[rr]-0.01)))==sign(fp(Z[rr]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);"}}}+"valPos(btex  
                       $ "+ao+" $ etex,0.5);  
                                  ";rr:=rr+1;  
 }// testS==0  
 else{lp:=lp+if(member(Z[rr],F)){  
                   "limGauche(btex $"+if(lmrm==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],-1)))}+"$ etex,"+if(krm==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[rr],1)))}+"$ etex,"+if(krp==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f(Z[rr])))+"$  
                       etex,"+if(evalf(sign(fp(Z[rr]-0.01)))==sign(fp(Z[rr]+0.01))){"0.5);"}else{if(krp==1){"1);"}else{"0);  
                               "}}};rr:=rr+1;  
 }//else testS==0  
 }//PB[r]==1  
 }//for nz<NL  
 }// else nz<NL  
 //if nz=NL  
 };//if nz>2  
 lnz:=limit(f(x),x=Z[nz-1],-1)==-infinity;  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+  
       if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz==1){"-\\infty"}else{latex(simplify(limit(f(x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:= if(ftt==2){if(nz>2){"beginTableau("+nmr+")"+  
     l0+lsi+lsp+lsf+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+"  
 endTableau;  
 ";  
 }  
 }else{  
 if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsp+lsf+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi+lsf+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 }};  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%  
 %% Code giac/Xcas pour les Tableaux de variations de courbes parametrees  
 %%  
 \begin{VerbatimOut}{XcasTVP.cxx}  
 TVP(L,F,nom,nomv,ff,ftt,trigo,nmr):={  
 nl:=size(L);  
 fp:=[];  
 S:=[];  
 f:=[unapply(ff[0],t),unapply(ff[1],t)];  
 fp:=[function_diff(f[0]),function_diff(f[1])];  
 Z:=[];  
 LLL:=[];  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 for(d:=0;d<=1;d++){  
 LLL:=concat(L,F[d]);  
 Z:=LLL union Z;  
 SS:=solve(factor(simplify(fp[d](t))),t);  
 ns:=size(SS);  
 for(k:=0;k<ns;k++){  
 if(trigo==t){  
 m:=0;  
 while(evalf(simplify(subst(SS[k],n_1=m)))<=evalf(L[nl-1])){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[k],n_1=m))>=L[0]){  
 S:=concat(S,simplify(subst(SS[k],n_1=m)));m:=m-1;  
 }  
 }else{  
 S:=concat(S,SS);  
 }  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire  
                qq:=member(simplify(S[j]),Z)==0;  
                kk:=(evalf(S[j])>=evalf(L[0])) and (evalf(S[j])<=evalf(L[nl-1]));  
              if(kk==1){if(qq==1){Z:=append(Z,simplify(S[j]))}};  
              fpour  
  fsi;  
 Z:=sort(Z);  
 nz:=size(Z);  
  tantque evalf(Z[0])==evalf(Z[1]) faire Z:=Z[1..nz-1];nz:=size(Z);  
    ftantque;  
 nz:=size(Z);  
 u:=1;  
  tantque (u<nz-2) and (nz>2) faire  
    tantque evalf(Z[u])==evalf(Z[u+1]) faire  
      Z:=augment(Z[0..u-1],Z[u+1..nz-1]);nz:=size(Z);  
    ftantque;  
  u:=u+1;  
  ftantque;  
  };  
 Z:=sort(Z);  
 nz:=size(Z);  
  l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:="",""; lf:="","";lsp:="","";  
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;  
  lsi:="","";  
 FFF:=[[],[]];  
 for(d:=0;d<=1;d++){  
 FFF[d]:=concat(F[d],[-infinity,+infinity]);  
     k0:= evalf(limit(f[d](x),x=Z[0],1))> evalf(limit(f[d](x),x=Z[1],-1));  
     kz:=evalf(limit(f[d](x),x=Z[nz-1],-1))> evalf(limit(f[d](x),x=Z[nz-2],1));  
 //}  
 //$  
  lsi[d]:=lsic+nom[d]+"'("+nomv+")}$ etex);"+if(member(Z[0],FFF[d])==0){"valBarre(btex $"+latex(simplify(fp[d](Z[0])))+"$ etex);"}else{if(Z[0]==-infinity){" "}else{"nonDefBarre;  
 "}}+  
    if(Z[0]==-infinity){if(sign(evalf(fp[d](if(Z[1]==+infinity){0}else{Z[1]-10^(-5)})))==1){"plus;"}else{"moins;"}}else{if(member(Z[0],F[d])==0){  
                           if(sign(fp[d](Z[0]+10^(-5)))==1){"plus;"}else{"moins;"}}else{  
                              if(sign(fp[d]((Z[0]+10^(-5))))==1){"plus;"}else{"moins;"} }}  
 if(nz>2){ for(r:=1; r<=nz-2;r++){   ksp:=evalf(fp[d](Z[r]+0.01))>0;  
                         lsp[d]:=lsp[d]+if(member(Z[r],F[d])==0){"valBarre(btex $"+latex(simplify(fp[d](Z[r])))+"$ etex);"}else{"nonDefBarre;"}+  
                         if(ksp==1){"plus;"}else{"moins;"}  
                          }; }  
 lsf[d]:=if(member(Z[nz-1],FFF[d])==0){"valBarre(btex $"+latex(simplify(fp[d](Z[nz-1])))+"$ etex);"}else{if(Z[nz-1]==+infinity){" "}else{"nonDefBarre;"}}  
  }  
  lm0:=1,2; li:=1,2; krm:=1,2; krp:=1,2; lmrm:=1,2; lmrp:=1,2; lp:="",""; lnz:=1,2; lf:=1,2; Kz:=1,2;K0:=1,2;  
 for(d:=0;d<=1;d++){  
   K0[d]:= evalf(limit(f[d](x),x=Z[0],1))> evalf(limit(f[d](x),x=Z[1],-1));  
  Kz[d]:=evalf(limit(f[d](x),x,Z[nz-1],-1))> evalf(limit(f[d](x),x,Z[nz-2],1));  
 //{  
 //$  
 lm0[d]:=limit(f[d](x),x,Z[0],1)==-infinity;  
    li[d]:=lvic+nom[d]+"}$ etex);"+  
       if(member(Z[0],F[d])==0){"valPos(btex $"+if(lm0[d]==1){"-\\infty"}else{latex(simplify(limit(f[d](x),x,Z[0],1)))}+"$ etex,"}  
        else{"nonDefBarre;limDroite(btex $"+if(lm0[d]==1){"-\\infty"}else{latex(simplify(limit(f[d](x),x,Z[0],1)))}+"$ etex,"}+  
       if(K0[d]==1){"1"}else{"0"}+  
              ");";  
            if(nz>2){ for(r:=1; r<=nz-2;r++){ krm[d]:=evalf(limit(f[d](x),x=Z[r-1],1))< evalf(limit(f[d](x),x=Z[r],-1));  
                          krp[d]:=evalf(limit(f[d](x),x=Z[r],1))> evalf(limit(f[d](x),x,Z[r+1],-1)) ;  
              lmrm[d]:=limit(f[d](x),x,Z[r],-1)==-infinity;lmrp[d]:=limit(f[d](x),x,Z[r],1)==-infinity;  
                          lp[d]:=lp[d]+if(member(Z[r],F[d])){  
                   "limGauche(btex  
                   $"+if(lmrm[d]==1){"-\\infty"}else{latex(simplify(limit(f[d](x),x,Z[r],-1)))}+"$  
                   etex,"+if(krm[d]==1){"1);"}else{"0);"}+"nonDefBarre;limDroite(btex $"+if(lmrp[d]==1){"-\\infty"}else{latex(simplify(limit(f[d](x),x,Z[r],1)))}+"$ etex,"+if(krp[d]==1){"1);"}else{"0);"}}  
                      else{"valPos(btex     $"+latex(simplify(f[d](Z[r])))+"$  
                       etex,"+if(sign(evalf(fp[d](Z[r]-0.001)))==sign(evalf((fp[d](Z[r]+0.001))) )){"0.5);"}else{if(krp[d]==1){"1);"}else{"0);  
 "}}}  
                           }; }  
 lnz[d]:=limit(f[d](x),x=Z[nz-1],-1)==-infinity;  
 lf[d]:=if(member(Z[nz-1],F[d])==0){"valPos(btex $"+  
       if(lnz[d]==1){"-\\infty"}else{latex(simplify(limit(f[d](x),x=Z[nz-1],-1)))}+"$ etex,"+  
        if(Kz[d]==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+  
      if(lnz[d]==1){"-\\infty"}else{latex(simplify(limit(f[d](x),x=Z[nz-1],-1)))}+"$ etex,"+   
       if(Kz[d]==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 }  
 MetaLfc:=if(ftt==2){if(nz>2){"  
 beginTableau("+nmr+")"+  
     l0+lsi[0]+lsp[0]+lsf[0]+lsi[1]+lsp[1]+lsf[1]+"  
 endTableau;  
 ";}else{  
 "beginTableau("+nmr+")"+  
     l0+  
 lsi[0]+lsf[0]+lsi[1]+lsf[1]+"  
 endTableau;  
 ";  
 }  
 }else{ if(ftt==0){if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li[0]+  
 lp[0]+  
 lf[0]+  
 li[1]+  
 lp[1]+  
 lf[1]  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li[0]+  
 lf[0]+  
 li[1]+  
 lf[1]  
 +"  
 endTableau;  
 ";}}else{  
 if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 lsi[0]+lsp[0]+lsf[0]+  
 li[0]+  
 lp[0]+  
 lf[0]+  
 lsi[1]+lsp[1]+lsf[1]+  
 li[1]+  
 lp[1]+  
 lf[1]  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 lsi[0]+lsf[0]+  
 li[0]+  
 lf[0]+  
 lsi[1]+lsf[1]+  
 li[1]+  
 lf[1]  
 +"  
 endTableau;  
 ";}  
 }  
 }  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
 }:;  
 \end{VerbatimOut}  
 %%  
 %% Code giac/Xcas pour les Tableaux de signes de produits  
 %%  
 \begin{VerbatimOut}{XcasTabSignL.cxx}  
 TS(nomf,L,D,trigo,nmr):={  
 L:=apply(f->unapply(f,x),L)  
 n:=size(L);  
 Z:=NULL;  
 nl:=size(L);  
 S:=[];  
 mini:=D[0]; maxi:=D[1];  
 pour k de 0 jusque n-1 faire   
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(L[k](x))),x);  
 ns:=size(SS);  
 for(j:=0;j<ns;j++){  
 m:=0;  
 while(evalf(simplify(subst(SS[j],n_1=m)))<=evalf(maxi)){  
 S:=concat(S,simplify(subst(SS[j],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[j],n_1=m))>=evalf(mini)){  
 S:=concat(S,simplify(subst(SS[j],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(L[k](x),x);  
 }  
  si size(S)>0 alors pour j de 0 jusque size(S)-1 faire   
              if(S[j]>mini and S[j]<maxi){Z:=Z,simplify(S[j]);}  
            fpour;  
  fsi;  
 fpour;  
 Z:=sort(Z);  
 nz:=size(Z);  
  Z:=sort([op(set[(Z)])]);  
 nz:=size(Z);  
 if(nz==0){li:="";l0:="val(btex $"+latex(D[0])+"$ etex);val(btex $"+latex(D[1])+"$ etex);";  
      for(p:=0;p<=n-1;p++){li:=li+lsic+latex(L[p](x))+"}$ etex);"+  
 if(mini!=-infinity and L[p](mini)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+   
 if(L[p]((mini+maxi)*0.5>0)){"plus;"}else{"moins;"}+if(maxi!=+infinity and L[p](maxi)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}  
 }  
       lf:=if(product(L[s]((mini+maxi)*.5),s,0,n-1)>0){"plus;"}else{"moins;"};  
 MetaLfc:="  beginTableau("+nmr+")  
 newLigneVariables(btex $ {x}$ etex);  
   "+l0+li+ lsic+nomf+"(x)}$ etex);"+  
         if(mini!=-infinity and product(L[s](mini),s,0,n-1)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+ lf+  
                 if(maxi!=+infinity and product(L[s](maxi),s,0,n-1)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+"  
 endTableau;  
 "  
 ;  
 }else{  
 l0:="val(btex $"+latex(D[0])+"$ etex);";li:=" ";lr:=" ";   
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;   
 l0:=l0+"val(btex $"+latex(D[1])+"$ etex);";  
 for(p:=0;p<=n-1;p++){lp:="";                     
    li:=li+lsic+latex(L[p](x))+"}$ etex);"+  
       if(mini!=-infinity and L[p](mini)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+   
       if(L[p](Z[0]-0.01)>0){"plus;"}else{"moins;"};  
               for(r:=0; r<=nz-2;r++){   
                lp:=lp+if(simplify(L[p](Z[r]))==0){"  
                 valBarre(btex 0 etex);"}else{"barre;  
                "}+   
                if(L[p]((Z[r]+Z[r+1])*.5)>0){"plus;"}else{"moins;"}};  
         li:=li+lp+ if(simplify(L[p](Z[nz-1]))==0){"valBarre(btex 0 etex);"}else{"barre;"}+   
              if(L[p](Z[nz-1]+1.0)>0){"plus;"}else{"moins;  
   "}+if(maxi!=+infinity and L[p](maxi)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}  
   };   
 pour t de 0 jusque nz-2 faire   
               lr:=lr+if(product(L[s]((Z[t]+Z[t+1])*.5),s,0,n-1)>0){"plus;"}else{"moins;"}+"valBarre(btex 0 etex);"            
              fpour  
 MetaLfc:=" beginTableau("+nmr+")  
 newLigneVariables(btex $ {x}$ etex);  
   "+l0+  
            li  
            + lsic+nomf+"(x)}$ etex);"+  
         if(mini!=-infinity and product(L[s](mini),s,0,n-1)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+   
              if(product(L[s](Z[0]-0.01),s,0,n-1)>0){"plus;"}else{"moins;"}+"valBarre(btex 0 etex);"+  
              lr+  
              if(product(L[s](Z[nz-1]+0.01),s,0,n-1)>0){"plus;"}else{"moins;"}+  
                 if(maxi!=+infinity and product(L[s](maxi),s,0,n-1)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+"  
 endTableau;  
  ";  
 }  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%  
 %% Code giac/Xcas pour les Tableaux de signes de quotients  
 %%  
 \begin{VerbatimOut}{XcasTabSignQ.cxx}  
 TSq(nomf,L,Fo,D,trigo,nmr):={  
 L:=apply(f->unapply(f,x),L);  
 Fo:=apply(f->unapply(f,x),Fo);  
 L:=concat(L,Fo);  
 n:=size(L);  
 Z:=NULL;  
 m:=size(Fo);  
 F:=NULL;FF:=NULL;  
 mini:=D[0]; maxi:=D[1];  
 S:=[];  
 SF:=[];  
 pour k de 0 jusque n-1 faire   
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(L[k](x))),x);  
 ns:=size(SS);  
 for(j:=0;j<ns;j++){  
 mm:=0;  
 while(evalf(simplify(subst(SS[j],n_1=mm)))<=evalf(maxi)){  
 S:=concat(S,simplify(subst(SS[j],n_1=mm)));mm:=mm+1;  
 };mm:=-1;  
 while(evalf(subst(SS[j],n_1=mm))>=evalf(mini)){  
 S:=concat(S,simplify(subst(SS[j],n_1=mm)));mm:=mm-1;  
 }  
 }  
 }else{  
 S:=concat(S,solve(L[k](x),x));  
 }  
  si size(S)>0 alors  pour j de 0 jusque size(S)-1 faire   
              if(S[j]>mini and S[j]<maxi){Z:=Z,simplify(S[j]);}  
            fpour;  
  fsi;  
 fpour;  
 pour k de 0 jusque m-1 faire   
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SSF:=solve(factor(simplify(Fo[k](x))),x);  
 nsf:=size(SSF);  
 for(j:=0;j<nsf;j++){  
 mm:=0;  
 while(evalf(simplify(subst(SSF[j],n_1=mm)))<=evalf(maxi)){  
 SF:=concat(SF,simplify(subst(SSF[j],n_1=mm)));mm:=mm+1;  
 };mm:=-1;  
 while(evalf(subst(SSF[j],n_1=mm))>=evalf(mini)){  
 SF:=concat(SF,simplify(subst(SSF[j],n_1=mm)));mm:=mm-1;  
 }  
 }  
 }else{  
 SF:=concat(SF,solve(Fo[k](x),x));  
 }  
  si size(SF)>0 alors pour j de 0 jusque size(SF)-1 faire   
              FF:=FF,simplify(SF[j]);  
              if(SF[j]>mini and SF[j]<maxi){F:=F,simplify(SF[j]);}  
            fpour;  
  fsi;  
 fpour;  
 Z:=[Z,F];  
 Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 if(nz==0){li:="";l0:="val(btex $"+latex(D[0])+"$ etex);val(btex $"+latex(D[1])+"$ etex);";  
      for(p:=0;p<=n-1;p++){li:=li+lsic+latex(L[p](x))+"}$ etex);"+  
 if(mini!=-infinity and L[p](mini)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}+   
 if(L[p]((mini+maxi)*0.5>0)){"plus;"}else{"moins;"}+if(maxi!=+infinity and L[p](maxi)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}  
 }  
       lf:=if(product(L[s]((mini+maxi)*.5),s,0,n-1)>0){"plus;"}else{"moins;"};  
 MetaLfc:="   
 beginTableau("+nmr+")  
 newLigneVariables(btex $ {x}$ etex);  
   "+l0+li+  
   lsic+nomf+"(x)}$ etex);"+  
        if(member(mini,FF)==0){if((mini!=-infinity) and (product(L[s](mini),s,0,n-1)==0)){" valBarre(btex 0 etex);"}else{" "}}else{"nonDefBarre;"}+ lf+  
        if(member(maxi,FF)==0){if((maxi!=+infinity) and (product(L[s](maxi),s,0,n-1)==0)){" valBarre(btex 0 etex);"}else{" "}}else{"nonDefBarre;"}+"  
 endTableau;  
 "  
 ;  
 }else{  
 l0:="val(btex $"+latex(D[0])+"$ etex);";li:=" ";lr:=" ";   
 pour m de 0 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";fpour;   
 l0:=l0+"val(btex $"+latex(D[1])+"$ etex);";  
 for(p:=0;p<=n-1;p++){lp:="";                     
    li:=li+lsic+latex(L[p](x))+"}$ etex);"+  
       if(mini!=-infinity and L[p](mini)==0){" valBarre(btex 0 etex);"}else{" "}+   
       if(L[p](Z[0]-0.01)>0){"plus;"}else{"moins;"};  
    for(r:=0; r<=nz-2;r++){lp:=lp+if(simplify(L[p](Z[r]))==0){" valBarre(btex 0 etex);"}else{"barre;"}+   
                if(L[p]((Z[r]+Z[r+1])*.5)>0){"plus;"}else{"moins;"}};  
         li:=li+lp+ if(simplify(L[p](Z[nz-1]))==0){"valBarre(btex 0 etex);"}else{"barre;"}+   
              if(L[p](Z[nz-1]+1.0)>0){"plus;"}else{"moins;  
   "}+if(maxi!=+infinity and L[p](maxi)==0){"valBarre(btex 0 etex);"}else{" "}  
   };   
 pour t de 0 jusque nz-2 faire   
               lr:=lr+if(product(L[s]((Z[t]+Z[t+1])*.5),s,0,n-1)>0){"plus;"}else{"moins;"}+  
                    if(member(Z[t+1],FF)==0){"valBarre(btex 0 etex);"}else{ "nonDefBarre;"}            
              fpour  
 MetaLfc:="  
 beginTableau("+nmr+")  
 newLigneVariables(btex $ {x}$ etex);  
   "+l0+  
            li  
            +  
   lsic+nomf+"(x)}$ etex);"+  
         if(member(mini,FF)==0){if((mini!=-infinity) and (product(L[s](mini),s,0,n-1)==0)){" valBarre(btex 0 etex);"}else{" "}}else{"nonDefBarre;"}+   
              if(product(L[s](Z[0]-0.01),s,0,n-1)>0){"plus;"}else{"moins;"}+  
              if(member(Z[0],FF)==0){"valBarre(btex 0 etex);"}else{ "nonDefBarre;"}+  
              lr+  
              if(product(L[s](Z[nz-1]+0.01),s,0,n-1)>0){"plus;"}else{"moins;"}+  
              if(member(maxi,FF)==0){if((maxi!=+infinity) and (product(L[s](maxi),s,0,n-1)==0)){"valBarre(btex 0 etex);"}else{" "}}else{"nonDefBarre;"}+"  
 endTableau;  
 "  
 }  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %% Code giac/Xcas pour les Tableaux de signes du produit  
 %% de 2 facteurs affines  
 %%  
 \begin{VerbatimOut}{XcasTabSigna.cxx}  
 TSa(a,b,c,d,nmr):={  
 zA:=solve(a*x+b=0,x)[0];  
 zB:=solve(c*x+d=0,x)[0];  
 zmin:=min(zA,zB);  
 zmax:=max(zA,zB);  
  Meta:= "   
      beginTableau("+nmr+")  
   newLigneVariables(btex $ {x}$ etex);  
   val(btex $-\\infty$ etex);val(btex $"+latex(zmin)+"$ etex);  
 val(btex $"+latex(zmax)+"$etex);  
 val(btex $+\\infty$ etex);   
  "+lsic+if(a==1){"x+"}else{if(a==-1){"-x+"}else{a+"x+"}}+b+"}$ etex);"  
     +  if(a>0){"moins;"}else{"plus;"}+  
                  if(zmin==zA){"valBarre(btex 0 etex);"}else{"barre;"}+  
                  if(zmin==zA){si a>0 alors "plus;"; sinon "moins;";fsi}  
                        else{si a>0 alors "moins;"; sinon "plus;"; fsi}+  
                  if(zmin==zA){"barre;"}else{"valBarre(btex 0 etex);"}+  
                  if(a>0){"plus;"}else{"moins;"}  
    +lsic+if(c==1){"x+"}else{if(c==-1){"-x+"}else{c+"x+"}}+d+"}$ etex);"  
     +   if(c>0){"moins"}else{"plus"}+";"+  
                  if(zmin==zB){"valBarre(btex 0 etex);"}else{"barre;"}+  
                  if(zmin==zB){si c>0 alors "plus;"; sinon "moins;";fsi}  
                        else{si c>0 alors "moins;"; sinon "plus;"; fsi}+  
                  if(zmin==zB){"barre;"}else{"valBarre(btex 0 etex);"}+  
                  if(c>0){"plus;"}else{"moins;"}   
   +lsic+"{("+if(a==1){"x+"}else{if(a==-1){"-x+"}else{a+"x+"}}+b+")("+if(c==1){"x+"}else{if(c==-1){"-x+"}else{c+"x+"}}+d+")}}$ etex);"  
     +  si a*c>0 alors plus; sinon moins;fsi+";"+  
                  "valBarre(btex 0 etex);"+  
                  si a*c>0 alors moins; sinon plus;fsi+";"+  
                  "valBarre(btex 0 etex);"+  
                  si a*c>0 alors plus; sinon moins;fsi+";"+"  
 endTableau;  
 "  
 ;  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,Meta);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%$  
 %% Code giac/Xcas pour les Tableaux de Signes d'expression ne contenant   
 %% qu'un seul terme  
 \begin{VerbatimOut}{XcasTSc.cxx}  
 TSc(g,D,F,trigo,nmr):={  
 f:=unapply(g,x);  
 mini:=D[0]; maxi:=D[1];lm:=" ";  
 Z:=mini,maxi;  
 S:=[];  
 if(trigo==t){  
 all_trig_solutions:=1;  
 reset_solve_counter(-1,-1);  
 SS:=solve(factor(simplify(f(x))),x);  
 ns:=size(SS);  
 for(j:=0;j<ns;j++){  
 m:=0;  
 while(evalf(simplify(subst(SS[j],n_1=m)))<=evalf(maxi)){  
 S:=concat(S,simplify(subst(SS[j],n_1=m)));m:=m+1;  
 };m:=-1;  
 while(evalf(subst(SS[j],n_1=m))>=evalf(mini)){  
 S:=concat(S,simplify(subst(SS[j],n_1=m)));m:=m-1;  
 }  
 }  
 }else{  
 S:=solve(f(x),x);  
 }  
 if(size(S)==0 and size(F)==0){  
 l0:="val(btex $"+latex(D[0])+"$ etex);val(btex $"+latex(D[1])+"$ etex);";  
 li:=if(member(mini,F)!=0){"nonDefBarre;"}else{if(mini!=-infinity and f(mini)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}}+   
 if(mini!=-infinity or maxi!=+infinity){if(f((mini+maxi)*0.5>0)){"plus;"}else{"moins;"}}else{if(f(0.3145274774464545777744)>0){"plus;"}else{"moins;"}};  
 lf:=if(member(maxi,F)!=0){"nonDefBarre;"}else{if(maxi!=+infinity and f(maxi)==0){"  
                 valBarre(btex 0 etex);"}else{"  
                "}};  
 }else{  
 if(size(S!=0)){pour j de 0 jusque size(S)-1 faire   
               if(S[j]>mini and S[j]<maxi){Z:=Z,simplify(S[j])};  
            fpour}  
 Z:=concat([Z],F);  
  Z:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 l0:=" ";li:=" ";lr:=" ";   
 if(nz==2){l0:="val(btex $"+latex(D[0])+"$ etex);val(btex $"+latex(D[1])+"$ etex);";  
 li:=if(mini!=-infinity and f(mini)==0){"  
                 valBarre(btex 0 etex);"}else{if(member(mini,F)==0){"  
                "}else{"nonDefBarre;"}}+   
 if(f((mini+maxi)*0.5)>0){"plus;"}else{"moins;"};  
 lf:=if(maxi!=+infinity and f(maxi)==0){"  
                 valBarre(btex 0 etex);"}else{if(member(maxi,F)==0){"  
                "}else{"nonDefBarre;"}  
                };  
 }else{  
 l0:="val(btex $"+latex(Z[0])+"$ etex);";li:=" ";  
 pour m de 1 jusque nz-1 faire l0:=l0+"val(btex $"+latex(Z[m])+"$ etex);  
 ";  
 fpour;   
 li:= if(mini!=-infinity and f(mini)==0){"  
                 valBarre(btex 0 etex);"}else{if(member(mini,F)==0){"  
                "}else{"nonDefBarre;"}  
                }               
 lm:=if(nz>2){for(r:=0; r<nz-2;r++){lm:=lm+if(Z[r]==-infinity){  
 if(f((Z[r+1]-1))>0){"plus;"}else{"moins;"}  
 }else{if(f((Z[r]+Z[r+1])*.5)>0){"plus;"}else{"moins;"}}  
 +  
       if(member(Z[r+1],F)==0){"valBarre(btex 0 etex);"}else{"nonDefBarre;"}   
               }}else{" "};   
 lf:=if(f(Z[nz-2]+0.1)>0){"plus;"}else{"moins;"}+if(maxi!=+infinity and f(maxi)==0){"valBarre(btex 0 etex);"}else{if(member(maxi,F)==0){"  
                "}else{"nonDefBarre;"}  
                };  
 }  
 };   
 MetaLfc:="  
 beginTableau("+nmr+")  
 newLigneVariables(btex $\\displaystyle {x}$ etex);  
   "+l0+lsic+latex(f(x))+"}$ etex);"+  
            li+lm+lf  
            +"  
 endTableau;  
 "  
 ;  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
  }:;  
 \end{VerbatimOut}  
 %%$  
 %%%%  
 %%%  
 %%% Pour des tableaux de variations simples sans fonctions  
 %%%  
 %%%  
 \begin{VerbatimOut}{XcasTVS.cxx}  
 TVS(La,Lo,F,nomf,nomv,nmr):={  
 na:=size(La);  
 f:=F;  
 if(member(La[0],F)){f:=f[1..size(f)-1]};  
 if(member(La[na-1],F)){f:=f[0..size(f)-2]};  
 Z:=sort(concat(La,f));  
 Zo:=sort([op(set[op(Z)])]);  
 nz:=size(Z);  
 nzo:=size(Zo);  
 k0:= evalf(Lo[0])> evalf(Lo[1]);  
 kz:=evalf(Lo[nz-1])> evalf(Lo[nz-2]);  
 l0:=" newLigneVariables(btex $"+nomv+"$ etex);";lp:=" "; lf:=" ";  
  for(m:=0;m<=nzo-1;m++){l0:=l0+"val(btex $"+latex(Zo[m])+"$ etex);"}  
 li:=lvic+nomf+"}$ etex);"+  
   if(member(Z[0],F)==0){"valPos(btex $"+latex(Lo[0])+"$ etex,"}  
   else{"nonDefBarre;limDroite(btex $"+latex(Lo[0])+"$ etex,"}+                  
       if(k0==1){"1"}else{"0"}+  
              ");";  
   if(nz>2){ for(r:=1; r<=nz-2;r++){   
      krm:=evalf(Lo[r-1])< evalf(Lo[r]);  
      krp:=evalf(Lo[r])> evalf(Lo[r+1]) ;   
    lp:=lp+if(Z[r]==Z[r+1]){  
      "limGauche(btex$"+latex(Lo[r])+"$etex,"+  
        if(krm==1){"1);"}  
        else{"0);"}  
        }// fin if zr=zr+1  
        else{  
        if(Z[r]==Z[r-1]){  
      "nonDefBarre;limDroite(btex$"+latex(Lo[r])+"$etex,"+  
        if(krp==1){"1);"}  
        else{"0);"}  
        }//fin if zr=zr-1  
        else{  
        "valPos(btex $"+latex(Lo[r])+"$etex,"+  
        if(krp==1){"1);"}else{"0);"}  
 }//fin else zr=zr-1  
 }//fin else zr=zr+1  
 }//fin for   
 }//fin de if nz>2  
 lf:=if(member(Z[nz-1],F)==0){"valPos(btex $"+latex(Lo[nz-1])+"$ etex,"+  
        if(kz==1){"1);"}else{"0);"}}  
   else{"limGauche(btex $"+latex(Lo[nz-1])+"$ etex,"+   
        if(kz==1){"1);nonDefBarre;"}else{"0);nonDefBarre;"}};    
 MetaLfc:=  
  if(nz>2){"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lp+  
 lf  
 +"  
 endTableau;  
 ";}else{"beginTableau("+nmr+")"+  
     l0+  
 li+  
 lf  
 +"  
 endTableau;  
 ";}  
 //return(MetaLfc);  
 sortie:=fopen("XCasmpfc.mp");  
 fprint(sortie,Unquoted,MetaLfc);  
 fclose(sortie);  
 }:;  
 \end{VerbatimOut}  
 %%$  
 %%  
 %% traitement des fichiers produits par giac/xcas  
 %%  
 %%  
 % pour l'échelle des tableaux taper \ech{facteur de réduction}  
 \newcommand\echelle{1}  
 \newcommand\ech[1]{\renewcommand\echelle{#1}}  
 \newcommand\couleurtab{black}  
 \newcommand\coultab[1]{\renewcommand\couleurtab{#1}}  
 \newcommand{\dresse}[2]{%  
 \ifthenelse{\boolean{xcas}}{%    Avec l'option "XCas present"  
      \executGiacmp{XCas#2.giac}% reconstituer le tableau  
                   % exporter le source mp  
                   % puis lancer metapost pour creer  
                   % l'image du tableau  
      \immediate\write18{\cat XCasmpfc.mp >> \nomtravail_Tab.mp}  
      \immediate\write18{\cat enteteMP.cfg >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod def beginTableau(expr c) =\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod begingroup\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod charcode:=c;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod clearxy; clearit; clearpen;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod pickup defaultpen;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod drawoptions(withcolor(#1));\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod initTableau;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod enddef;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\cat XCasmpfc.mp >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\cat queue.mp >> \nomtravail_Tab#2.mp}  
      \immediate\write18{mpost  -jobname=\nomtravail_Tab \nomtravail_Tab#2.mp}  
      \immediate\write18{\rem \nomtravail_Tab#2.mp}   
       }%  
      {% sinon, si le tableau est absent, alerte.  
      \IfFileExists{\nomtravail_Tab.\theTVn}{}{%   
      \PackageError{tablor}{Tableau absent non  
      reconstituable.}{Pour compiler il faut, soit les fichiers de  
      tableaux, soit le fichier \nomtravail_Tab.mp, soit disposer de  
      XCas.}}}  
 \begin{center}  
  \includegraphics[scale=\echelle]{\nomtravail_Tab.\theTVn}  
 \end{center}  
 \stepcounter{TVn}  
 }  
 %%  
 %% traitement des fichiers produits par giac/xcas avec possibilite  
 %% de modifier le fichier metapost (environnement etoile))  
 %%  
 \newcommand{\dressetoile}[2]{%  
 \IfFileExists{\nomtravail_Tab.\theTVn}{% Test sur l'existence du tableau  
 % Si oui, inclusion du fichier source de sauvegarde mp dans Tableaux  
 \immediate\write18{\cat TSav-\theTVn.mp >> \nomtravail_Tab.mp}}  
 % Si non, lancement des operations de fabrication   
 {\executGiacmp{XCas#2.giac}%  
 \immediate\write18{\editeur XCasmpfc.mp }  
  % Modification avec l'editeur choisi  
 \immediate\write18{\cat XCasmpfc.mp >> \nomtravail_Tab.mp}   
 \immediate\write18{\cp XCasmpfc.mp TSav-\theTVn.mp}  % Sauvegarde du   
                  % source mp sur le disque pour une  
                  % inclusion ulterieure dans Tableaux.mp.   
 \immediate\write18{\cat enteteMP.cfg >> \nomtravail_Tab#2.mp}  
  \immediate\write18{\echod def beginTableau(expr c) =\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod begingroup\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod charcode:=c;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod clearxy; clearit; clearpen;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod pickup defaultpen;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod drawoptions(withcolor(#1));\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod initTableau;\echof >> \nomtravail_Tab#2.mp}  
      \immediate\write18{\echod enddef;\echof >> \nomtravail_Tab#2.mp}  
 \immediate\write18{\cat XCasmpfc.mp >> \nomtravail_Tab#2.mp}} % Inclusion du  
                            % source dans le  
                            % fichier  
                            % Tableaux   
 \immediate\write18{\cat queue.mp >> \nomtravail_Tab#2.mp}  
 \immediate\write18{mpost -jobname=\nomtravail_Tab \nomtravail_Tab#2.mp}% Reconstitution des tableaux  
                 % et creation du dernier. L'option  
                 % pallie l'absence de end en fin de  
                 % fichier   
 \immediate\write18{\rem \nomtravail_Tab#2.mp}   
 \begin{center}  
  \includegraphics[scale=\echelle]{\nomtravail_Tab.\theTVn}  
 \end{center}  
 \ech{1}  
 \setcounter{TVn}{\theTVnbis}  % Restauration du compteur TVn  
 }  
 %%  
 %%  
 %%%  
 %%%  
 %%% les "giac" qui permettent d'executer la commande rentree dans le fichier tex  
 %%% suivis des environnements qui permettront la saisie du code giac/xcas  
 %%% Les versions etoilees permettent de modifier le code metapost produit initialement  
 %%%  
 \begin{VerbatimOut}{XCasa.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTabSigna.cxx");  
 read("XCasa.user");  
 \end{VerbatimOut}  
 \newenvironment{TSa}  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasa.user}}  
 {\end{VerbatimOut}  
      \dresse{\couleurtab}{a}  
 }  
 \begin{VerbatimOut}{XCasQ.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTabSignQ.cxx");  
 read("XCasQ.user");  
 \end{VerbatimOut}  
 \newenvironment{TSq}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasQ.user}}  
 {\end{VerbatimOut}\dresse{\couleurtab}{Q}}  
 \newenvironment{TSq*}[1]%  
 {\setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasQ.user}}  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{Q}}  
 \begin{VerbatimOut}{XCasL.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTabSignL.cxx");  
 read("XCasL.user");  
 \end{VerbatimOut}  
 \newenvironment{TS}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasL.user}}  
 {\end{VerbatimOut}\dresse{\couleurtab}{L}}  
 \newenvironment{TS*}[1]  
 {\setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasL.user}}  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{L}}  
 \begin{VerbatimOut}{XCasTSc.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTSc.cxx");  
 read("XCasTSc.user");  
 \end{VerbatimOut}  
 \newenvironment{TSc*}[1]%  
 {\setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTSc.user}}  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TSc}}  
 \newenvironment{TSc}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTSc.user}}  
 {\end{VerbatimOut}\dresse{\couleurtab}{TSc}}  
 \begin{VerbatimOut}{XCasTV.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTV.cxx");  
 read("XCasTV.user");  
 \end{VerbatimOut}  
 \newenvironment{TV}{%   
 \VerbatimEnvironment  
 \begin{VerbatimOut}[commandchars=\\??]{XCasTV.user}}%  
 {\end{VerbatimOut}  
 \dresse{\couleurtab}{TV}}  
 \newenvironment{TV*}[1]{%  
 \setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTV.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TV}}  
 \begin{VerbatimOut}{XCasTVP.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVP.cxx");  
 read("XCasTVP.user");  
 \end{VerbatimOut}  
 \newenvironment{TVP}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVP.user}}%  
 {\end{VerbatimOut}  
 \dresse{\couleurtab}{TVP}}  
 \newenvironment{TVP*}[1]{%  
 \setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVP.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVP}}  
 \begin{VerbatimOut}{XCasTVZ.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVZ.cxx");  
 read("XCasTVZ.user");  
 \end{VerbatimOut}  
 \newenvironment{TVZ}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVZ.user}}%  
 {\end{VerbatimOut}  
 \dresse{\couleurtab}{TVZ}}  
 \newenvironment{TVZ*}[1]{%  
 \setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVZ.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVZ}}  
 \begin{VerbatimOut}{XCasTVapp.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVapp.cxx");  
 read("XCasTVapp.user");  
 \end{VerbatimOut}  
 \newenvironment{TVapp}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVapp.user}}%  
 {\end{VerbatimOut}  
 \dresse{\couleurtab}{TVapp}}  
 \newenvironment{TVapp*}[1]{%  
 \setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVapp.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVapp}}  
 \begin{VerbatimOut}{XCasTVI.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVI.cxx");  
 read("XCasTVI.user");  
 \end{VerbatimOut}  
 \newenvironment{TVI}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVI.user}}%  
 {\end{VerbatimOut}\dresse{\couleurtab}{TVI}}  
 \newenvironment{TVI*}[1]%  
 {\setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVI.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVI}}  
 \begin{VerbatimOut}{XCasTVIex.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVIex.cxx");  
 read("XCasTVIex.user");  
 \end{VerbatimOut}  
 \newenvironment{TVIex}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVIex.user}}%  
 {\end{VerbatimOut}\dresse{\couleurtab}{TVIex}}  
 \newenvironment{TVIex*}[1]%  
 {\setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVIex.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVIex}}  
 \begin{VerbatimOut}{XCasTVIapp.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVIapp.cxx");  
 read("XCasTVIapp.user");  
 \end{VerbatimOut}  
 \newenvironment{TVIapp}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVIapp.user}}%  
 {\end{VerbatimOut}\dresse{\couleurtab}{TVIapp}}  
 \newenvironment{TVIapp*}[1]%  
 {\setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVIapp.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVIapp}}  
 \begin{VerbatimOut}{XCasTVPC.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVPC.cxx");  
 read("XCasTVPC.user");  
 \end{VerbatimOut}  
 \newenvironment{TVPC}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVPC.user}}%  
 {\end{VerbatimOut}  
 \dresse{\couleurtab}{TVPC}}  
 \newenvironment{TVPC*}[1]{%  
 \setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVPC.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVPC}}  
 \begin{VerbatimOut}{XCasTVS.giac}  
 maple_mode(0);  
 approx_mode:=0;  
 read("config.cxx");  
 read("XcasTVS.cxx");  
 read("XCasTVS.user");  
 \end{VerbatimOut}  
 \newenvironment{TVS}%  
 {\VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVS.user}}%  
 {\end{VerbatimOut}  
 \dresse{\couleurtab}{TVS}}  
 \newenvironment{TVS*}[1]{%  
 \setcounter{TVnbis}{\theTVn}  
 \setcounter{TVn}{#1}  
 \VerbatimEnvironment\begin{VerbatimOut}[commandchars=\\??]{XCasTVS.user}}%  
 {\end{VerbatimOut}\dressetoile{\couleurtab}{TVS}}  
 %% pour nettoyer les fichiers auxiliaires  
 \AtEndDocument{\immediate\write18{\cat queue.mp >> \nomtravail_Tab.mp}  
              }  
 %%  
 %% Zi end -> enjoy :)  
3. Soạn một file TeX đặt tên là test.tex có nội dung, chẳng hạn như sau: 


1
2
3
4
5
6
7
8
9
10
11
12
\documentclass{article}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}
\usepackage[vietnam]{babel}
\usepackage[xcas]{tablor}
\begin{document}
\initablor
\begin{TV}
TV([-infinity,+infinity],[2],"g","x",(6x^2-2x+1)/(x-2),1,n,\tv)
\end{TV}
\nettoyer
\end{document}

4. Biên dịch file test.tex bằng pdflatex và view bằng acrobat reader.

Bảng biến thiên của hàm số: \(y=\dfrac{6x^2-2x+1}{x-2}\)

 

Tablor sử dụng Xcas làm tất cả mọi việc: lấy đạo hàm, tìm cực trị, tìm giá trị cực trị, tìm giới hạn và sử dung tableauVariation để lập bảng biến thiên .


Nếu máy tính của bạn sử dụng hệ điều hành Ubuntu Linux
thì các bạn chỉ cần cài giac_1.1.0-34_i386.deb từ dòng lệnh với lệnh:
sudo dpkg -i giac_1.1.0-34_i386.deb
sau khi cài đặt xong, Ubuntu Linux sẽ tự động cập nhật đường dẫn.
Nếu máy tính của bạn sử dụng Hệ điều hành MS Windows
các bạn cài giac từ file exe xcasinst.exe. Windows sẽ tự động cài giac vào C:\xcas. Các bạn phải cập nhật lại đường dẫn cho hệ thống như sau:
  1. Nhấp phải chuột vào My Computer, chọn Properties, Advanced Systems Settings, Environment Variables, trên dòng Path của User variables for user, các bạn chọn Edit, thêm dấu ; để ngăn cách biến cũ, sau đó thêm C:\xcas
  2. Chọn OK nhiều lần để ra ngoài, sau đó Reboot lại máy tính. Xcas sẽ được LaTeX nhận diện và sẽ tự động tiến hành tính toán.

Không có nhận xét nào:

Đăng nhận xét