[xlop] Affichage sous forme fractionnaire (\opdiv)

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Laurentfz
Utilisateur débutant
Utilisateur débutant
Messages : 8
Inscription : vendredi 22 mai 2020, 20:30
Statut actuel : Enseignant

[xlop] Affichage sous forme fractionnaire (\opdiv)

Message par Laurentfz »

Bonjour,

En utilisant \opdiv[period,style=text]{150}{7} j'obtiens $150 \div 7 = 21,428571 \ldots$ avec un trait sur la période.
Je souhaiterais avoir l'écriture sous forme de fraction plutôt que $150 \div 7$.

Quelqu'un aurait-il une idée ?
Vous avez deviné que je ne suis pas un expert...
Merci d'avance.
Dernière modification par MB le mardi 10 novembre 2020, 10:10, modifié 1 fois.
Raison : Création d'un nouveau sujet.
MB
Administrateur
Administrateur
Messages : 7264
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par MB »

Bonjour, je ne suis pas certain que ce soit totalement évident.

Le code suivant permet d'effectuer la division sans rien imprimer, mais en stockant le quotient dans une variable q, puis à imprimer cette variable, précédée de l'écriture fractionnaire. Par contre, la période n'est plus soulignée.

Code : Tout sélectionner

\documentclass{article}
\usepackage{xlop}
\begin{document}

\[ \opdiv*[period]{150}{7}{q}{r}\frac{150}{7}=\opprint{q} \]

\end{document}
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 830
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par un bon petit »

La macro \op@divarg étant très monolithique (JC, si tu me lis, il faudrait peut-être penser à la scinder en sous-macros plus élémentaires), la redéfinir pour qu'elle admette un nouveau booléen \ifdivfrac conduit à un code long. Ce booléen sera false par défaut (comportement avec \div) alors que s'il est spécifié à true, la division s'affichera sous forme d'une fraction.

Du fait de la longueur de la macro \op@divarg, le code est long, mais très peu de modifications sont faites.

Code : Tout sélectionner

\documentclass{article}
\usepackage{xlop}
\newif\ifdivfrac
\divfracfalse
\makeatletter
\def\op@divarg[#1]#2#3{%
	\begingroup
		\opset{#1}%
		\op@split{#2}{a}%
		\op@split{#3}{b}%
		% add 20/11/2006
		% thanks to Christophe Poulain
		\op@cmp{b}{zero}%
		\ifopeq
			\op@error{divisor must be nonzero}%
							 {You have to learn some math}%
		\fi
		% end add
		\ifop@error
			\op@errorwrite
		\else
			\ifx\op@style\op@string@display
				\op@unzero{a}%
				\op@unzero{b}%
				\ifx\op@shiftdecimalsep\op@string@none
					\xdef\OP@a@i{\OP@a@w}%
					\xdef\OP@a@d{0}%
					\xdef\OP@b@i{\OP@b@w}%
					\xdef\OP@b@d{0}%
				\else\ifx\op@shiftdecimalsep\op@string@divisor
					\xdef\OP@a@i{\OP@a@w}%
					\xdef\OP@a@d{0}%
					\xdef\OP@b@i{\OP@b@w}%
					\xdef\OP@b@d{0}%
					\op@unzero{a}%
					\op@unzero{b}%
				\else
					\edef\op@shift{\op@max{\OP@a@d}{\OP@b@d}}%
					\op@mulpowerten{a}{\op@shift}%
					\op@mulpowerten{b}{\op@shift}%
				\fi\fi
			\fi
			\ifop@period
				\op@div{1}{a}{b}{q}{r}%
			\else
				\op@div{0}{a}{b}{q}{r}%
			\fi
			\ifx\op@style\op@string@display
				\op@split{#2}{a}%
				\op@split{#3}{b}%
				\op@copy{q}{qq}%
				\op@unzero{a}%
				\op@unzero{b}%
				\ifx\op@shiftdecimalsep\op@string@none
					\def\op@shift{0}%
					\op@count@v=\OP@a@d
					\advance\op@count@v by-\OP@b@d\relax
					\ifnum\op@count@v>0
						\op@divpowerten{qq}{\the\op@count@v}%
					\else
						\op@count@v=-\op@count@v
						\op@mulpowerten{qq}{\the\op@count@v}%
					\fi
				\else\ifx\op@shiftdecimalsep\op@string@divisor
					\edef\op@shift{\OP@a@d}%
					\op@count@v=\OP@a@d
					\advance\op@count@v by-\OP@b@d\relax
					\ifnum\op@count@v>0
						\op@divpowerten{qq}{\the\op@count@v}%
					\else
						\op@count@v=-\op@count@v
						\op@mulpowerten{qq}{\the\op@count@v}%
					\fi
					\edef\op@shift{\OP@b@d}%
					\op@split{#2}{a}%
					\ifx\op@strikedecimalsepsymbol\empty
						\op@unzero{a}%
					\else
						\op@count@z=\OP@a@w
					\fi
					\op@mulpowerten{a}{\OP@b@d}%
					\ifx\op@strikedecimalsepsymbol\empty\else
						\advance\op@count@z by-\OP@a@d
						\op@format{\the\op@count@z}{\OP@a@d}{a}%
					\fi
					\xdef\OP@b@i{\OP@b@w}%
					\xdef\OP@b@d{0}%
					\ifx\op@strikedecimalsepsymbol\empty
						\op@unzero{b}%
					\fi
				\else
					\edef\op@shift{\op@max{\OP@a@d}{\OP@b@d}}%
					\ifx\op@strikedecimalsepsymbol\empty
						\op@unzero{a}%
						\op@unzero{b}%
					\else
						\op@count@z=\OP@a@w
						\op@count@i=\OP@b@w
					\fi
					\op@mulpowerten{a}{\op@shift}%
					\op@mulpowerten{b}{\op@shift}%
					\ifx\op@strikedecimalsepsymbol\empty\else
						\advance\op@count@z by-\OP@a@d
						\op@format{\the\op@count@z}{\OP@a@d}{a}%
						\advance\op@count@i by-\OP@b@d
						\op@format{\the\op@count@i}{\OP@b@d}{b}%
					\fi
				\fi\fi
				\ifx\op@country\op@string@french
					\op@divdisplayone
				\else \ifx\op@country\op@string@american
					\op@divdisplayone
				\else \ifx\op@country\op@string@russian
					\op@divdisplayone
				\else
					\op@error{Country \op@country\space isn't recognize}
									 {For now, only `french', `american' and
										 `russian' are valid}%
				\fi\fi\fi
			\else
				\ifnum\OP@a@s=\OP@b@s\else
					\xdef\OP@q@s{1}%
				\fi
				\mathsurround=\z@\relax
				\ifop@deletezero
					\op@unzero{a}%
					\op@unzero{b}%
					\op@unzero{q}%
				\fi
				\op@unsplit{a}{@a}%
				\op@unsplit{b}{@b}%
				\op@unsplit{q}{@q}%
				\ifdivfrac
					$\displaystyle\frac\Op@@a\Op@@b$%
				\else
					\ifnum\OP@a@s=1\relax
						\ifx\op@parenthesisnegative\op@string@all
							$(\Op@@a)$%
						\else
							$\Op@@a$%
						\fi
					\else
						$\Op@@a$%
					\fi
					$\>$\nobreak\op@divsymbol$\>$\penalty\binoppenalty
					\ifnum\OP@b@s=1\relax
						\ifx\op@parenthesisnegative\op@string@all
							$(\Op@@b)$%
						\else \ifx\op@parenthesisnegative\op@string@last
							$(\Op@@b)$%
						\else
							$\Op@@b$%
						\fi\fi
					\else
						$\Op@@b$%
					\fi
				\fi
				\op@cmp{zero}{r}%
				\ifopeq
					$\;$\nobreak\op@equalsymbol$\;$\penalty\relpenalty
					\setbox0=\hbox{\Op@@q}%
				\else
					\ifop@period
						$\;$\nobreak\op@equalsymbol$\;$\penalty\relpenalty
						\setbox0=\hbox{%
							\Op@@q
							\setbox1=\hbox{0}%
							\begingroup
								\opcolumnwidth=\wd1
								\ophline(-\op@lengthperiod,\op@vruleperiod){\op@lengthperiod}%
							\endgroup
							\op@afterperiodsymbol
						}%
					\else
						$\;$\nobreak\op@approxsymbol$\;$\penalty\relpenalty
						\setbox0=\hbox{\Op@@q}%
					\fi
				\fi
				\ifnum\OP@q@s=1\relax
					\ifx\op@parenthesisnegative\op@string@all
						$(\box0)$%
					\else
						$\box0$%
					\fi
				\else
					$\box0$%
				\fi
			\fi
		\fi
	\endgroup
}
\makeatother
\begin{document}
\opdiv[period,style=text]{150}{7}% comportement par défaut

\divfractrue% afficher les divisions sou forme de fractions
\opdiv[period,style=text]{150}{7}
\end{document}
Screenshot_20201110_204917.png
PS : vu la capture d'écran, il doit y avoir des espaces parasites quelque part dans le code de xlop, mais j'ai la flemme de chercher où.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB
Administrateur
Administrateur
Messages : 7264
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par MB »

un bon petit a écrit : mardi 10 novembre 2020, 20:52 La macro \op@divarg étant très monolithique (JC, si tu me lis, il faudrait peut-être penser à la scinder en sous-macros plus élémentaires), la redéfinir pour qu'elle admette un nouveau booléen \ifdivfrac conduit à un code long.
C'est également ce que j'ai constaté en regardant le code.
Du coup j'ai abandonné la tentative d'adaptation. Merci d'avoir eu le courage de t'y attaquer. :thumbup:
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 830
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par un bon petit »

MB a écrit : mardi 10 novembre 2020, 21:05 Du coup j'ai abandonné la tentative d'adaptation. Merci d'avoir eu le courage de t'y attaquer. :thumbup:
Petit courage : 4 lignes à ajouter, j'ai survécu.
MB
Administrateur
Administrateur
Messages : 7264
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par MB »

C'est vrai, mais dommage d'avoir à recopier toute la fonction pour ces quelques modifications.
Et je ne pense pas que Jean-Côme Charpentier passe souvent par ici ... Il avait un compte à une époque, mais je crois qu'il était inactif depuis un bon moment et qu'il a été supprimé lors du délestage.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Laurentfz
Utilisateur débutant
Utilisateur débutant
Messages : 8
Inscription : vendredi 22 mai 2020, 20:30
Statut actuel : Enseignant

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par Laurentfz »

C'est exactement ce que je cherchais. Impressionné !
Effectivement c'est un peu long...
Merci à tous.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1920
Inscription : samedi 29 décembre 2007, 00:58

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par projetmbc »

MB a écrit : mercredi 11 novembre 2020, 00:04 ... Et je ne pense pas que Jean-Côme Charpentier passe souvent par ici ...
Il suffit de le contacter par pigeon voyageur ou par mail. :D
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 830
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par un bon petit »

projetmbc a écrit : mercredi 11 novembre 2020, 16:56 Il suffit de le contacter par pigeon voyageur ou par mail. :D
C'est fait, je lui ai envoyé un email ce matin. Il uploade une version sans espaces parasites sous peu. Pour de nouvelles fonctionnalités, il va falloir attendre encore un peu...
MB
Administrateur
Administrateur
Messages : 7264
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Re: [xlop] Affichage sous forme fractionnaire (\opdiv)

Message par MB »

A propos des espaces parasites, je n'avais rien vu de spécial sur ta capture d'écran. Tout me semblait convenable ...
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.