使用 pythontex 进行计算

使用 pythontex 进行计算

我想使用 pythontex 进行一些重复计算。


编辑

如果有人能向我展示如何检索使用 python 计算的变量,而不是使用我下面发布的第一个代码来解决问题(这有点复杂,但有一个简单的方法可以用 tikz 来实现...感谢 Marmot)。可能是一个简单的例子,比如计算线段中间的坐标。

\begin{pycode}
def Middle(XA,YA,XB,YB):
    XK=(XA+XB)/2
    YK=(YA+YB)/2
\end{pycode}

我想知道如何单独检索 XK 和 YK。


第一篇帖子:

我有这部分代码(整个代码如下,带有一个图来说明输出):

\pgfmathsetmacro{\XofA}{\XA*\OI+\YA*\OJ*cos(\angle)}
\pgfmathsetmacro{\YofA}{\YA*\OJ*sin(\angle)}
\pgfmathsetmacro{\XofAprojOI}{\XA*\OI}
\pgfmathsetmacro{\YofAprojOI}{0}
\pgfmathsetmacro{\XofAprojOJ}{\YA*\OJ*cos(\angle)}
\pgfmathsetmacro{\YofAprojOJ}{\YA*\OJ*sin(\angle)}

使用 XA 和 YA,我想要检索 XofA、YofA、XofAprojOI、YofAprojOI、XofAprojOJ 和 YofAprojOJ,但使用另一点,比如说 B,我想要检索 XofB、YofB、XofBprojOI、YofBprojOI、XofBprojOJ 和 YofBprojOJ。

为了避免重复此代码(对于我必须定义的所有点),我希望有一个 pythontex 函数来返回所有这些变量。类似于(我尝试过的所有方法都失败了,所以我只能给出我想要的东西的想法):

\begin{pycode}
def coordTransformations(XA,YA):
    XofA=XA*OI+YA*OJ*cos(angle)
    YofA=YA*OJ*sin(angle)
    etc.
\end{pycode}

并在我的乳胶代码中使用结果。

整个代码如下:

\documentclass[10pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{pythontex}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{scopes}
\usetikzlibrary{arrows.meta}

\begin{document}


\def\angle{75}
\def\OI{1.2}
\def\OJ{0.7}
\def\Xmin{-1}
\def\Xmax{6}
\def\Ymin{-1}
\def\Ymax{8}
\def\XA{2}
\def\YA{3}
\def\XB{4}
\def\YB{7}
\def\XH{\XB}
\def\YH{\YA}
\begin{tikzpicture}[x=1.0cm,y=1.0cm,scale=1,every node/.style={scale=1}]    
    \pgfmathsetmacro{\XofA}{\XA*\OI+\YA*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofA}{\YA*\OJ*sin(\angle)}
    \pgfmathsetmacro{\XofAprojOI}{\XA*\OI}
    \pgfmathsetmacro{\YofAprojOI}{0}
    \pgfmathsetmacro{\XofAprojOJ}{\YA*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofAprojOJ}{\YA*\OJ*sin(\angle)}

    \pgfmathsetmacro{\XofB}{\XB*\OI+\YB*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofB}{\YB*\OJ*sin(\angle)}
    \pgfmathsetmacro{\XofBprojOI}{\XB*\OI}
    \pgfmathsetmacro{\YofBprojOI}{0}
    \pgfmathsetmacro{\XofBprojOJ}{\YB*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofBprojOJ}{\YB*\OJ*sin(\angle)}

    \pgfmathsetmacro{\XK}{0.5*(\XA+\XB)}
    \pgfmathsetmacro{\YK}{0.5*(\YA+\YB)}

    \pgfmathsetmacro{\XofH}{\XH*\OI+\YH*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofH}{\YH*\OJ*sin(\angle)}
    \pgfmathsetmacro{\XofHprojOI}{\XH*\OI}
    \pgfmathsetmacro{\YofHprojOI}{0}
    \pgfmathsetmacro{\XofHprojOJ}{\YH*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofHprojOJ}{\YH*\OJ*sin(\angle)}

    \pgfmathsetmacro{\XofK}{\XK*\OI+\YK*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofK}{\YK*\OJ*sin(\angle)}
    \pgfmathsetmacro{\XofKprojOI}{\XK*\OI}
    \pgfmathsetmacro{\YofKprojOI}{0}
    \pgfmathsetmacro{\XofKprojOJ}{\YK*\OJ*cos(\angle)}
    \pgfmathsetmacro{\YofKprojOJ}{\YK*\OJ*sin(\angle)}


    \coordinate (A) at (\XofA,\YofA);
    \coordinate (B) at (\XofB,\YofB);
    \coordinate (K) at (\XofK,\YofK);
    \coordinate (H) at (\XofH,\YofH);


    % grille :
    % ~~~~~~~~
    \foreach \n in {\Ymin,...,\Ymax}
        \draw  [color=black!20,shift={(\angle:{\n*\OJ})}] (0:\Xmin*\OI) -- (0:{\Xmax*\OI}); % parallèles (Ox)
    \foreach \n in {\Xmin,...,\Xmax}
        \draw  [color=black!20,shift={(0:{\n*\OI})}] ({\angle}:\Ymin*\OJ) -- (\angle:{\Ymax*\OJ}); % parallèles (Oy)    

    % axes :
    % ~~~~~~
    \pgfmathsetmacro{\Xmaxminus}{\Xmax-1}
    \pgfmathsetmacro{\Ymaxminus}{\Ymax-1}

        %   axe (Ox) :
        %   ~~~~~~~~~~
    \draw [arrows={-Stealth[inset=2pt, angle=30:7pt]}] (0:\Xmin*\OI) -- (0:\Xmax*\OI) node [shift={(0:2ex)}] {$x$}; % axe (Ox)
    \foreach \n in {\Xmin,...,\Xmaxminus}%
        \draw [xshift=\n*\OI cm](\angle:3pt) -- ({180+\angle}:3pt);

        %   axe (Oy) :
        %   ~~~~~~~~~~
    \begin{scope}[rotate=\angle]
        \draw [arrows={-Stealth[inset=2pt, angle=30:7pt]}] (0:\Ymin*\OJ) -- (0:\Ymax*\OJ) node [shift={(\angle:2ex)}] {$y$}; % axe (Oy)
        \foreach \n in {\Ymin,...,\Ymaxminus}%
            \draw [xshift=\n*\OJ cm]({180-\angle}:3pt) -- (-\angle:3pt);
    \end{scope}

    % points du repère :
    % ~~~~~~~~~~~~~~~~~~
    \draw ({180+\angle/2}:2ex) node [font=\small,fill=white,inner sep=0ex] {$O$};

    \begin{scope}[shift={(0:\OI)}]
        \draw (\angle:-2ex) node [font=\small,fill=white,inner sep=0ex] {$I$};
    \end{scope}

    \begin{scope}[shift={(\angle:\OJ)}]
        \draw (0:-2ex) node [font=\small,fill=white,inner sep=0ex] {$J$};
    \end{scope}

    % points dans le plan :
    % ~~~~~~~~~~~~~~~~~~~~~

    \draw [densely dashed,draw=] (\XofAprojOJ,\YofAprojOJ) node [font=\small,fill=white,inner sep=0ex,shift={(180:2ex)}] {$\YA$} %
        -- (A) node [fill, circle, inner sep=1.5pt] {} node [fill=white, inner sep =0.5pt,shift={({\angle/2}:-2ex)}] {$A$}%
        -- (\XofAprojOI,\YofAprojOI) node [font=\small,fill=white,inner sep=0ex,shift={(\angle:-2ex)}] {$\XA$};

    \draw [densely dashed,draw=] (\XofBprojOJ,\YofBprojOJ) node [font=\small,fill=white,inner sep=0ex,shift={(180:2ex)}] {$\YB$} %
        -- (B) node [fill, circle, inner sep=1.5pt] {} node [fill=white, inner sep =0.5pt,shift={({\angle/2}:2ex)}] {$B$}%
        -- (\XofBprojOI,\YofBprojOI) node [font=\small,fill=white,inner sep=0ex,shift={(\angle:-2ex)}] {$\XB$};

    \draw [densely dashed,draw=] (\XofKprojOJ,\YofKprojOJ) node [font=\small,fill=white,inner sep=0ex,shift={(180:2ex)}] {$\pgfmathprintnumber{\YK}$} %
        -- (K) node [fill, circle, inner sep=1.5pt] {} node [fill=white, inner sep =0.5pt,shift={({\angle/2+90}:2ex)}] {$K$}%
        -- (\XofKprojOI,\YofKprojOI) node [font=\small,fill=white,inner sep=0ex,shift={(\angle:-2ex)}] {$\pgfmathprintnumber{\XK}$};

    \draw [fill=orange!30,opacity=0.3] (A) -- (B) %
        -- (H) node [fill=black,opacity=1, circle, inner sep=1.5pt] {} node [right=5pt,opacity=1,text=black,inner sep=1pt,fill=white] {$H$} %
        -- cycle;
\end{tikzpicture}

\end{document}

图片是:

在此处输入图片描述

谢谢。

答案1

计算并打印(从您的示例中)XK 和 YK 的值很简单。将这两个值作为列表的成员返回

\documentclass{article}
\usepackage{pythontex}
\usepackage{tikz}
\begin{document}
    \begin{pycode}
def Middle(XA,YA,XB,YB):
    XK=(XA+XB)/2
    YK=(YA+YB)/2
    return([XK,YK])
    \end{pycode}
\pyc{XK,YK=Middle(0,0,12,10)}
\py{XK}

\py{YK}

\py{XK+YK}
\end{document}

如果要在 Tikz draw 语句中使用XK和的值YK,则需要使用\pys{....}inline 命令来生成整个文本行(s表示替换字符串操作)。这非常简单,因为返回一个字符串,但允许您使用包装器内的信封\pys替换 python 生成的值。!{....}\pys{...}

尝试在语句前插入以下代码\end{document}

\pys{XK + YK looks like !{XK}+!{YK}}

\pys{The value of YK is !{YK}}

\begin{tikzpicture}
\pys{\draw(!{XK},!{YK}) circle(1em);}
\draw(0,0)rectangle(12,10);
\end{tikzpicture}

答案2

这不是对你问题的回答(作为一只土拨鼠,我非常害怕蛇;-) 而是告诉你,你不需要 python 来实现这一点。

\documentclass[10pt,a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{scopes}
\usetikzlibrary{arrows.meta}

\begin{document}

\begin{tikzpicture}[xscale=1.2,yscale=0.7]
\pgftransformxslant{.15}
    \draw[help lines] (-1,-1) grid (6,8);
    \draw[thick,-latex] (0,0) -- (6,0) node[right] {$x$};
    \draw[thick,-latex] (0,0) -- (0,8) node[above] {$y$};
    \coordinate (O) at (0,0); 
    \coordinate (A) at (2,3); 
    \coordinate (B) at (4,7);
    \coordinate (H) at (4,3);
    \coordinate (K) at (3,5);
    \node[draw,fill, circle, inner sep=1.5pt,label=below:$A$] at (A) {};
    \node[draw,fill, circle, inner sep=1.5pt,label=right:$B$] at (B) {};
    \node[draw,fill, circle, inner sep=1.5pt,label=below:$H$] at (H) {};
    \node[draw,fill, circle, inner sep=1.5pt,label=left:$K$] at (K) {};
    \filldraw[-,fill=orange!30,opacity=0.3] (A) -- (H) -- (B) -- (K) -- (A);
    \foreach \coor in {A,B,K}
    {\draw[densely dashed] (O |- \coor) -- (\coor) -- (O -| \coor);}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我只是关注了你图片中的一些关键元素,其他的可以添加。信息是 TiZ 已经内置了各种转换功能,因此无需重新发明轮子。

相关内容