Schriftliche Division anpassen

Formelsatz für Mathematik, Naturwissenschaften und Technik


ThoRie
Forum-Century
Forum-Century
Beiträge: 159
Registriert: Fr 12. Mai 2017, 11:57

Schriftliche Division anpassen

Beitrag von ThoRie »

Hallo.

Auf der Suche, wie ich in Latex eine schriftliche Division durchführen kann, bin ich im Internet auf folgende Lösung gestoßen:
\documentclass[12pt,a4paper,ngerman]{article}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{xlop}
\usepackage{tikz}

\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay] \node[inner xsep=0pt,outer sep=0pt,anchor=base,yshift=0.5ex] (#1) {};}

\makeatletter
\def\op@divdisplayone{%
  \begingroup
    \op@count@z=\z@\relax
    \op@count@i=\OP@a@w
    \loop
    \ifnum\@nameuse{OP@a@\the\op@count@i}=0
      \advance\op@count@i by-1
      \advance\op@count@z by1
    \repeat
    \op@count@i=\op@firstlength
    \advance\op@count@i by\op@count@z
    \xdef\op@firstlength{\the\op@count@i}%
    \setbox2=\vbox{%
      \op@count@i=\op@firstlength
      \advance\op@count@i by1
      \hbox{%
        \ifx\op@displayintermediary\op@string@none\else
% add 0.25
          \ifx\op@displayintermediary\op@string@None\else
% end add 0.25
            \kern\opcolumnwidth
            \advance\op@count@i by1
% add 0.25
          \fi
% end add 0.25
        \fi
        \ifop@dividendbridge
          \vrule width0pt depth0pt height\oplineheight
          \opvline(0,1){0.4}%
          \ophline(0,1){\op@firstlength}%
          \opvline(\op@firstlength,1){0.4}%
        \fi
        \op@display{operandstyle.1}{a}\tikzmark{a}%
        \ifnum\op@shift=0\relax\else
          \op@count@v=\op@shift
          \advance\op@count@v by\OP@a@d
          \oplput(-\the\op@count@v,0){\op@strikedecimalsepsymbol}%
        \fi
      }%
      \op@count@z=\OP@q@w
      \op@count@ii=1\relax
      \ifx\op@displayintermediary\op@string@none
        \advance\op@count@i by-1\relax
% add 0.25
      \else\ifx\op@displayintermediary\op@string@None
        \advance\op@count@i by-1\relax
% end add 0.25
      \else
        \op@count@iv=\@nameuse{OP@q@\the\op@count@z}\relax
        \op@count@iii=\op@count@i
        \advance\op@count@iii by-\@nameuse{OP@T\the\op@count@iv @w}%
        \hbox{%
          \ifx\op@voperator\op@string@center
            \oplput(0,0.5){\op@subsymbol}%
          \else\ifx\op@voperator\op@string@top
            \oplput(0,1){\op@subsymbol}%
          \else
            \oplput(0,0){\op@subsymbol}%
          \fi\fi
          \ophline(1,-0.25){\op@firstlength}%
          \advance\op@count@ii by1
          \kern\op@count@iii\opcolumnwidth
          \op@display{intermediarystyle.1}%
                     {T\the\op@count@iv}%
        }%
% modif 0.25
      \fi\fi
% end modif 0.25
      {\global\setbox4=\hbox{}\setbox4=\box4}%
      \loop
        \advance\op@count@z by-1
        \advance\op@count@i by1\relax
      \ifnum\op@count@z>0\relax
        \op@count@iv=\@nameuse{OP@q@\the\op@count@z}\relax
        \ifnum\op@count@iv=0
          \ifx\op@displayintermediary\op@string@all
            \op@count@v=\op@count@i
            \advance\op@count@v by-\@nameuse{OP@R\the\op@count@ii @w}%
            \hbox{%
              \kern\op@count@v\opcolumnwidth
              \op@display{remainderstyle.\the\op@count@ii}%
                         {R\the\op@count@ii}%
            }%
            \op@count@iii=\op@count@i
            \advance\op@count@iii by-\@nameuse{OP@T\the\op@count@iv @w}%
            \hbox{%
              \kern\op@count@v\opcolumnwidth
              \ifx\op@voperator\op@string@center
                \oplput(-1,0.5){\op@subsymbol}%
              \else\ifx\op@voperator\op@string@top
                \oplput(-1,1){\op@subsymbol}%
              \else
                \oplput(-1,0){\op@subsymbol}%
              \fi\fi
              \ophline(0,-0.25){\@nameuse{OP@R\the\op@count@ii @w}}%
              \kern-\op@count@v\opcolumnwidth
              \kern\op@count@iii\opcolumnwidth
              \op@display{intermediarystyle.\the\op@count@ii}%
                         {T\the\op@count@iv}%
            }%
          \else
            \ifnum\@nameuse{OP@R\the\op@count@ii @w}=2
              \ifnum\@nameuse{OP@R\the\op@count@ii @2}=0
                \op@makebox{1}{0}{remainderstyle.\the\op@count@ii.1}{zero}%
                \setbox4=\hbox to\opcolumnwidth{\hss\box0\hss}%
              \fi
            \fi
          \fi
          \advance\op@count@ii by1\relax
        \else
          \op@count@v=\op@count@i
          \advance\op@count@v by-\@nameuse{OP@R\the\op@count@ii @w}%
          \ifvoid4\relax\else
            \advance\op@count@v by-1
          \fi
          \hbox{%
            \kern\op@count@v\opcolumnwidth\copy4
            \op@display{remainderstyle.\the\op@count@ii}%
                       {R\the\op@count@ii}%
          }%
          \advance\op@count@ii by1\relax
          \ifx\op@displayintermediary\op@string@none
% add 0.25
          \else\ifx\op@displayintermediary\op@string@None
% end add 0.25
          \else
            \op@count@iii=\op@count@i
            \advance\op@count@iii by-\@nameuse{OP@T\the\op@count@iv @w}%
            \hbox{%
              \kern\op@count@v\opcolumnwidth
              \ifx\op@voperator\op@string@center
                \oplput(-1,0.5){\op@subsymbol}%
              \else\ifx\op@voperator\op@string@top
                \oplput(-1,1){\op@subsymbol}%
              \else
                \oplput(-1,0){\op@subsymbol}%
              \fi\fi
              \advance\op@count@ii by-1
              \ifvoid4\relax
                \ophline(0,-0.25){\@nameuse{OP@R\the\op@count@ii @w}}%
              \else
                \ophline(0,-0.25){\@nameuse{OP@T\the\op@count@iv @w}}%
                \ophline(\@nameuse{OP@T\the\op@count@iv @w},-0.25){1}%
                {\setbox4=\box4}%
              \fi
              \advance\op@count@ii by1
              \kern-\op@count@v\opcolumnwidth
              \kern\op@count@iii\opcolumnwidth
              \op@display{intermediarystyle.\the\op@count@ii}%
                         {T\the\op@count@iv}%
            }%
% modif 0.25
          \fi\fi
% end modif 0.25
        \fi
      \repeat
      \advance\op@count@i by-1
      \op@count@iii=\op@count@i
      \advance\op@count@iii by-\@nameuse{OP@R\the\op@count@ii @w}%
      \hbox{%
        \kern\op@count@iii\opcolumnwidth
        \op@display{remainderstyle.\the\op@count@ii}%
                   {R\the\op@count@ii}%
      }%
    }%
    \setbox3=\vbox{%
      \op@count@v=\op@max{\OP@qq@w}{\OP@b@w}
      \hbox{%\ophline(-0.5,-0.25){\the\op@count@v.5}%
            :\op@display{operandstyle.2}{b}=\op@display{resultstyle}{qq} %%This seems to be the divisor
        \ifnum\op@shift=0\relax\else
          \op@count@v=\op@shift
          \advance\op@count@v by\OP@b@d
          \oplput(-\the\op@count@v,0){\op@strikedecimalsepsymbol}%
        \fi}
      %\hbox{\op@display{resultstyle}{qq}} %%This seems to be the result
    }%
    \dimen0=\ht2
    \ifdim\dimen0>\ht3
      \ht3=\ht2
    \else
      \ht2=\ht3
    \fi
    \ifx\op@voperation\op@string@top
      \dimen0=\ht2
      \advance\dimen0 by-0.5\oplineheight
      \ht2=0.75\oplineheight
      \ht3=0.75\oplineheight
      \dp2=\dimen0
      \dp2=\dimen0
    \fi
    \setbox1=\hbox{%
      \box2
%      \kern0.5\opcolumnwidth
%      \kern-0.5\op@hrulewidth
%      \ifx\voperation\op@string@top
%        \vrule width\op@hrulewidth
%      \else
%        \vrule width\op@hrulewidth
%      \fi
%      \kern0.5\opcolumnwidth
%      \kern-0.5\op@hrulewidth
      \begin{tikzpicture}[remember picture,overlay]
         \node[anchor=west,inner xsep=0pt] at (a) {\box3};
      \end{tikzpicture}
    }%
    \ifx\op@voperation\op@string@center
      \setbox1=\hbox{$\vcenter{\box1}$}%
    \fi
    \leavevmode\box1
  \endgroup
}
\makeatother
\begin{document}

\opdiv[period=true,voperation=top,displayintermediary=all,decimalsepsymbol={,},shiftdecimalsep=none,maxdivstep=30]{123456}{13}



\end{document}
Allerdings gibt es jetzt zwei Dinge, die ich anpassen möchte:

1. Die Division soll nur so weit betrieben werden, dass das ganzzahlige Ergebnis und der damit Verbundene Rest angezeigt werden.

2. Die Minuszeichen sollen bitte auf Höhe der Zahlen sein und nicht so komisch dazwischen.

Leider sehe ich bei der Dokumentation des betreffenden Paketes nicht durch :/

Vielleicht hat ja jemand Ahnung davon und weiß, wie ich das anpassen kann.

Fynnwind
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Di 5. Nov 2019, 17:34

Beitrag von Fynnwind »

Mit dem angegebenem Code kann ich leider wenig anfangen, aber wenn es sich mit der schriftlichen Division um eine Polynomdivision handelt, dann sollte folgendes Funktionieren:

[\usepackage{polynom}]

[\polyset{style=C, div=:,vars=x}
\polylongdiv{"Zähler"}{"Nenner"}]

Das führt die Polynomdivision von selbst aus und stellt sie dar, wie man sie in der Schule lernt.
Liebe Grüße,
Till

ThoRie
Forum-Century
Forum-Century
Beiträge: 159
Registriert: Fr 12. Mai 2017, 11:57

Beitrag von ThoRie »

Das Polynompaket ist mir durchaus bekannt und ich nutze es auch sehr häufig.

Das, um das es hier aber geht, ist eine schriftliche Division, also das, was man schon in der Grundschule lernt. Dafür habe ich aber eben den Code mit reingepackt, damit man sieht, was im Kern dabei heraus kommen soll.

Eigentlich hatte ich das vorher auch über overleaf geprüft, sodass das Beispiel auch eigentlich lauffähig sein sollte.

Antworten