使用TikZ在LaTeX中绘制多边形

有时,在纸上绘制三维多面体非常有用。TikZ是一个在科学文档中绘制的非常通用的工具,而Sage可以轻松地处理三维多面体。最终,Sagetex让Sage、TikZ和LaTeX之间的一切都能很好地协同工作。从Sage 6.3版开始,有一个用于(投影)多面体的功能来输出多面体的TikZ图片。从SageMath 9.8版开始,tikz输出可以是 TikzPicture 来自SAGE模块的对象 sage.misc.latex_standalone 。这篇简短的教程展示了它是如何工作的。

指令

要使用TikZ和Sage在LaTeX中放置3D多面体的图像,只需按照说明操作:

  • 安装 SageTex (可选,但建议!)

  • \usepackage{tikz} 在你文章的序言中

  • 打开Sage并通过以下命令将目录更改为您的文章的目录 cd /path/to/article

  • 将您的多面体(例如称为P)输入到Sage

  • 使用命令可视化多面体P P.show(aspect_ratio=1)

  • 这将在您的默认浏览器中打开一个交互视图,您可以在其中旋转多边形。

  • 找到所需的视角后,单击右下角的信息图标并选择 Get Viewpoint 。这将复制‘’形式的字符串 [x,y,z] ,角度‘到您的本地剪贴板。

  • 回到Sage并输入 Img = P.tikz([x,y,z],angle,output_type='LatexExpr') 。您可以将字符串粘贴到此处以省去一些打字。

  • Img 现在包含类型为的Sage对象 LatexExpr 包含您的多面体的原始TikZ图片。

或者,您也可以通过执行以下操作将tikz图像保存到文件

Img = P.tikz([x,y,z], angle, output_type='TikzPicture')
Img.tex('Img_poly.tex')
Img.tex('Img_poly.tex', content_only=True)
Img.pdf('Img_poly.pdf')

然后,在PWD(SAGE的当前工作目录,也就是您的文章中的一个)中,您将有两个名为 Img_poly.texImg_poly.pdf 包含多面体的tikz图片 P

定制化

可以使用命令中的以下选项来自定义多面体 P.tikz()

  • scale :正数表示缩放多面体,

  • edge_color :字符串(默认: blue!95!black )表示Tikz识别的颜色,

  • facet_color :字符串(默认: blue!95!black )表示Tikz识别的颜色,

  • vertex_color :字符串(默认: green )表示Tikz识别的颜色,

  • opacity :实数(默认: 0.8 )在0和1之间给出前面的不透明度,

  • axis :布尔型(默认: False )是否在原点绘制轴。

  • output_type :字符串(默认: None ) None'LatexExpr''TikzPicture' 、输出的类型。从SageMath 9.8开始,值 None 不推荐使用,因为默认值很快就会从 'LatexExpr''TikzPicture'

实例

让我们假设你想画下面的极对偶(不错!)由以下顶点列表提供的多边形:

[[1,0,1],[1,0,0],[1,1,0],[0,0,-1],[0,1,0],[-1,0,0],[0,1,1],[0,0,1],[0,-1,0]]

在Sage中,您可以键入:

P = Polyhedron(vertices=[[1,0,1],[1,0,0],[1,1,0],[0,0,-1],[0,1,0],[-1,0,0],[0,1,1],[0,0,1],[0,-1,0]]).polar()

然后,您可以通过输入以下命令来可视化多面体 P.show(aspect_ratio=1)

找到合适的角度后,请按照上述步骤获取这些值 [674,108,-731] 例如,角度=112。

Img = P.tikz([674,108,-731], 112, output_type='TikzPicture')

注: output_type='TikzPicture' 是必需的,因为SagMath 9.8要避免出现弃用警告消息,因为默认输出类型很快就会从 LatexExpr (Python字符串)转换为 TikzPicture 对象(允许更多用途,如能够直接在Jupyter笔记本中查看)。

或者,您可能希望使用以下命令进行自定义

Img = P.tikz([674,108,-731],112,scale=2, edge_color='orange',facet_color='red',vertex_color='blue',opacity=0.4, output_type='TikzPicture')

此外,您可能想要直接在tikz图片内部更深入地编辑多面体的样式。例如,tikz图片中的第6-9行如下所示:

back/.style={loosely dotted, thin},
edge/.style={color=orange, thick},
facet/.style={fill=red,fill opacity=0.400000},
vertex/.style={inner sep=1pt,circle,draw=blue!25!black,fill=blue!75!black,thick,anchor=base}]

也可以将其替换为以下4行(添加 \usetikzlibrary{shapes} 在序言中)

back/.style={loosely dashed,line width=2pt},
edge/.style={color=yellow, line width=2pt},
facet/.style={fill=cyan,fill opacity=0.400000},
vertex/.style={inner sep=4pt,star,star points=7,draw=blue!75!white,fill=blue!85!white,thick,anchor=base}]

最后,你可能想通过添加标签、顶点、边、面等元素来调整你的图片。

使用SageTex实现自动化

为此,您需要将

\usepackage{sagetex}

在你文章的序言中

使用Sagetex有不同的方法,您可以创建自己的方法。以下是一些可能性。

  1. 你可以直接在文章中输入一位传奇人物:

\sagestr{(polytopes.permutahedron(4)).tikz([4,5,6],45,scale=0.75, facet_color='red',vertex_color='yellow',opacity=0.3, output_type='LatexExpr')}
  1. 您可以创建以下TeX命令

\newcommand{\polytopeimg}[4]{\sagestr{(#1).tikz(#2,#3,#4,output_type='LatexExpr')}}
\newcommand{\polytopeimgopt}[9]{\sagestr{(#1).tikz(#2,#3,#4,#5,#6,#7,#8,#9,output_type='LatexExpr')}}

在你的序言中使用它们,并在你的文章中使用Sage沉默:

\begin{sagesilent}
Polytope = polytopes.great_rhombicuboctahedron()
\end{sagesilent}
\polytopeimg{Polytope}{[276,-607,-746]}{102}{1}
\polytopeimgopt{Polytope}{view=[-907,379,183]}{angle=129}{scale=2}{edge_color='red'}{facet_color='yellow'}{vertex_color='blue'}{opacity=0.6}{axis=False}

然后,运行pdflatex,在文件上执行Sage article_name.sagetex.sage 然后再运行一次pdflatex。

有关SageTeX的更多信息,请参阅教程http://doc.sagemath.org/html/en/tutorial/sagetex.html.