我想使用 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}
我只是关注了你图片中的一些关键元素,其他的可以添加。信息是 Ti钾Z 已经内置了各种转换功能,因此无需重新发明轮子。