很抱歉我的问题不够准确,但我找不到正确描述我的问题的方法。
我创建了一个新包,在“lua”部分,我使用了两个类,一个用于点,另一个用于线。两个表z
和L
与这些类相关联。第一个表中存储点,第二个表中存储线。例如对于点。这定义了词缀(复数)为的z.a = point: new (1,2)
点。在此处的表中,键为,值为。以同样的方式,如果和被定义,我可以用例如来定义一条线。这有点复杂,因为表存储在表中。a
1+2i
a
1+2i
a
b
L.a__b = line: new (z.a,z.b)
我可能错了,但我认为我的问题可以这样翻译:如果 x=a 和 y=b 那么我如何定义一个函数给我L.a__b = line: new (z.a,z.b)
,L.x__y
等等。什么都没有给。
您可以在此页面找到此包tkz-元素。您将在档案中找到 tkz-elements 的代码、一份自述文件、一份小文档和几个示例。所有这些仍处于实验阶段!
以下是更完整的代码:
\documentclass{article}
\usepackage{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
\parindent = 0pt
\begin{elements}
z.a = point: new (0, -1)
z.b = point: new (4, 2)
z.c = point: new (1, 2)
z.d = point: new (-1, 3)
L.a__b = line: new (z.a,z.b)
L.a__d = line: new (z.a,z.d)
L.d__b = line: new (z.d,z.b)
va = tostring(c__d)
for i in pairs(L) do
if i == va then
else
_, _,ft, sd = string.find( "c__d", "(.+)__(.+)" )
L["ft__sd"] = line: new (z.ft,z.sd) -- wrong !
-- L[ft"__"sd] = line: new (z.ft,z.sd)-- is fine D. Carlisle
break
end
end
-- z.i =intersection_ll (L.a__b,L.c__d)
-- the next code is here to show the different values
for i,k in pairs(L) do
tex.print(tostring(k)..";"..tostring(i))
for u,v in pairs(k)
do
tex.print(tostring(v))
end
tex.print('\\\\')
end
\end{elements}
\begin{tikzpicture}
\tkzGetNodes
\tkzDrawLines[add=1 and 1](a,b c,d)
\tkzDrawPoints(a,b,c,d,i)
\tkzLabelPoints(a,b,c,d,i)
\end{tikzpicture}
\end{document}
一些解释:定义了 4 个点,然后定义了 4 条线,但我注释了最后一条L.c__d
以显示我的问题。如果定义了两条线,代码允许获取它们的交点。我想找到一个测试来了解其中一条线是否未定义,并在这种情况下自动创建它。注释后,L.c__d = line: new (z.c,z.d)
此行不再定义。因此,我使用函数解析表示此行的表达式string.find
并获取指向ft
和的和。sd
c
d
问题:如何使用ft
和sd
获取L.c__d = line: new (z.c,z.d)
?
答案1
当你通过连接所需点的索引来索引线时
L[ft .. "__" .. sd] = line: new (z[ft],z[sd])
用二维数组(表格中的表格)来建模线条可能会更简单,因此
L.c__d = line: new (z.c,z.d)
L[ft .. "__" .. sd] = line: new (z[ft],z[sd])
你可以使用
L["c"]["d"] = line: new (z.c,z.d)
L[ft][sd] = line: new (z[ft],z[sd])