Sagittarius Rover
Sagittarius Rover
这家伙很懒,什么也没写!

注册于 4年前

回答
588
文章
0
关注者
22

原图又在骗

如果「D」点确实是截面圆与视界圆的切点的话,那么根本不可能看到如上角度的蓝色三角形:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=cuboid_sphere}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Origin, vecK = pt3d.M, pt3d.Origin, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {20,75} 
    }
   require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local sqrt = math.sqrt
    local h = 1.75
    local O1, P = M(0,0,-h), sM(0,0)
    local Out = {}
    g:DScircle({O1,vecK},{out=Out});
    local D, _ = table.unpack(Out)
    local A = ld.rotate3d(D, 90, {O1, vecK})
    local B = ld.rotate3d(A, 90, {O1, vecK})
    local C = ld.rotate3d(B, 90, {O1, vecK})
    local vecn = pt3d.prod(A-P,D-P)
    local O2 = ld.proj3d(Origin,{P,vecn})
    local h1,h2 = pt3d.abs(Origin-O1),pt3d.abs(Origin-O2)
    local r1,r2 = sqrt(3^2-h1^2),sqrt(3^2-h2^2)
    g:DScircle({Origin,vecK})
    local T = ld.facet2poly( ld.cvx_hull3d({A,B,C,D,P}) )
    g:Dcircle3d(O1,r1,vecK,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:Dcircle3d(O2,r2,vecn,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:DScircle({O1,vecK}); g:DScircle({O2,vecn})
    g:Dpoly(T,{color="violet!30!white",mode=ld.mFlatHidden,edgewidth=8,hiddenstyle="dashed"})
    g:Dspherical()
    g:Dpolyline3d({P,O1,A,Origin},"blue,dashed,semithick")
    g:Dballdots3d({Origin,O1,A,B,C,D,P},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="W"},
        "$O_1$",O1,{},
        "$P$",P,{pos="N"},
        "$A$",A,{pos="NE"},
        "$B$",B,{pos="W"},
        "$C$",C,{pos="S"},
        "$D$",D,{pos="E"},
        "$h$",O1/2,{pos="W"},
        "$R$",P/2,{pos="",node_options="text=blue"},
        "$R$",A/2,{},
        "$r$",(O1+A)/2,{pos="E"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

把底面微调成长方形,修改这里的旋转角度:

    local D, _ = table.unpack(Out)
    local A = ld.rotate3d(D, 75, {O1, vecK}) -- <- 75 degree?
    local B = ld.rotate3d(A, 115, {O1, vecK})
    local C = ld.rotate3d(B, 75, {O1, vecK})

完整代码如下:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=cuboid_sphere}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Origin, vecK = pt3d.M, pt3d.Origin, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {20,75} 
    }
   require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local sqrt = math.sqrt
    local h = 1.75
    local O1, P = M(0,0,-h), sM(0,0)
    local Out = {}
    g:DScircle({O1,vecK},{out=Out});
    local D, _ = table.unpack(Out)
    local A = ld.rotate3d(D, 75, {O1, vecK}) -- <- 75 degree?
    local B = ld.rotate3d(A, 115, {O1, vecK})
    local C = ld.rotate3d(B, 75, {O1, vecK})
    local vecn = pt3d.prod(A-P,D-P)
    local O2 = ld.proj3d(Origin,{P,vecn})
    local h1,h2 = pt3d.abs(Origin-O1),pt3d.abs(Origin-O2)
    local r1,r2 = sqrt(3^2-h1^2),sqrt(3^2-h2^2)
    g:DScircle({Origin,vecK})
    local T = ld.facet2poly( ld.cvx_hull3d({A,B,C,D,P}) )
    g:Dcircle3d(O1,r1,vecK,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:Dcircle3d(O2,r2,vecn,"draw=none,fill=blue!25, fill opacity=0.4") 
    g:DScircle({O1,vecK}); g:DScircle({O2,vecn})
    g:Dpoly(T,{color="violet!30!white",mode=ld.mFlatHidden,edgewidth=8,hiddenstyle="dashed"})
    g:Dspherical()
    g:Dpolyline3d({P,O1,A,Origin},"blue,dashed,semithick")
    g:Dballdots3d({Origin,O1,A,B,C,D,P},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="W"},
        "$O_1$",O1,{},
        "$P$",P,{pos="N"},
        "$A$",A,{pos="NE"},
        "$B$",B,{pos="W"},
        "$C$",C,{pos="S"},
        "$D$",D,{pos="E"},
        "$h$",O1/2,{pos="W",dist=0.1},
        "$R$",P/2,{pos="",dist=0,node_options="text=blue"},
        "$R$",A/2,{},
        "$r$",O1/3+2*A/3,{pos="S"}
    )
    g:Show()
\end{luadraw}
\end{document}

我们可以获得比较贴近原图的效果...

image.png

真的别用伪3D来骗了😡😡😡😡😡修改和分析成本很大,打咩!

Analysis

需要指出的是,原图的坐标也是糊弄的...

image.png

这里的四个点并不是真正的交点,原图就是在糊弄....!!!

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=cuboid_sphere}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,75}
    }
   require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local h = 1.25
    local O1, O2 = -h*vecK, h*vecK
    local Out1, Out2 = {}, {}
    g:DScircle({O1,vecK},{out=Out1});g:DScircle({O2,vecK},{out=Out2});
    local D,B = table.unpack(Out1);
    local B1,D1 = table.unpack(Out2)
    g:Dlabel3d(
        "$O$",Origin,{pos="SW"},
        "$A$",A,{pos=""},
        "$A_1$",A1,{},
        "$B$",B,{},
        "$B_1$",B1,{},
        "$C$",C,{},
        "$C_1$",C1,{},
        "$D$",D,{},
        "$D_1$",D1,{}
    )    
    g:Dspherical()
    local R = math.sqrt(3^2-h^2) 
    -- g:Dballdots3d({Origin,B,B1,D,D1,O1,O2},"red",0.75)
    -- g:Dballdots3d({M(0,-R,-h),M(0,R,-h),M(0,R,h),M(0,-R,h)},"blue",0.75)
    g:Dpolyline3d({B,D,D1,B1},true,"red")
    g:Dpolyline3d({M(0,-R,-h),M(0,R,-h),M(0,R,h),M(0,-R,h)},true,"blue")
    g:Show()
\end{luadraw}
\end{document}

image.png

image.png

蓝色点并非水平截面圆与视界圆的交点!!!

Code

下面的代码也只能糊弄了,否则无法取到和原图类似的显示效果...

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=cuboid_sphere}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Origin, vecK = pt3d.M, pt3d.Origin, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,75} -- should be fixed
    }
   require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local C,C1 = sM(40,120), sM(40,60)
    local O1,O2 = ld.proj3d(Origin,{C,vecK}),ld.proj3d(Origin,{C1,vecK})
    local h = pt3d.abs(O1-O2)/2
    local r = math.sqrt(3^2-h^2)
    local B,B1 = M(0,-r,-h),M(0,-r,h)
    local D1,D = M(0,r,h),M(0,r,-h)
    local A,A1 = ld.psym3d(C,O1),ld.psym3d(C1,O2)
    g:DScircle({Origin,vecK})
    local P = ld.facet2poly( ld.cvx_hull3d({A,B,C,D,A1,B1,C1,D1}) )
    g:Dcircle3d(O1,r,vecK,"draw=none,fill=blue!25, fill opacity=0.4") -- lower circle
    g:DScircle({C,vecK})
    g:Dpoly(P,{color="violet!30!white",mode=ld.mFlatHidden,edgewidth=8,hiddenstyle="dashed"})
    g:Dcircle3d(O2,r,vecK,"draw=none,fill=blue!25, fill opacity=0.4") -- upper circle
    g:DScircle({C1,vecK})
    g:Dspherical()
    g:Dpolyline3d({A1,Origin,D},"blue,dashed")
    g:Dballdots3d({Origin,A,A1,B,B1,C,C1,D,D1},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="W"},
        "$A$",A,{pos="NW"},
        "$A_1$",A1,{pos="N"},
        "$B$",B,{pos="W"},
        "$B_1$",B1,{},
        "$C$",C,{pos="S"},
        "$C_1$",C1,{pos="SE"},
        "$D$",D,{pos="E"},
        "$D_1$",D1,{},
        "$a$",(B+C)/2,{pos="S",node_options="text=red"},
        "$b$",(C+D)/2,{pos="N"},
        "$c$",(C+C1)/2,{pos="E"},
        "$R$",D/2,{pos="N"},
        "$R$",A1/3,{}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

中规中矩吧.....

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=insphere_cone}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Origin, vecK = pt3d.M,  pt3d.Origin, pt3d.vecK
    require 'luadraw_spherical'
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        windows = {-4,4,-4,4},
        viewdir = {0,80}, size={10,10}
    }
    local sM = ld.sM
    local A,B,P = sM(-30,140), sM(150,140), sM(0,0)
    local O1 = (A+B)/2
    ld.Hiddenlines = true; ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "",edgecolor = "black",edgewidth = 8 }
    -- g:DSpolyline({A,B},{style="dashed",width=8})
    -- g:DSpolyline({{O1,P},{Origin,A}},{color="red",style="dashed",width=8})
    local vecn = pt3d.prod(A,B)
    g:Dcone(O1,pt3d.abs(B-A)/2,P,{edgewidth=8, hiddenstyle="dashed", color="magenta", opacity=0.5})
    g:DScircle({Origin,vecn});g:DScircle({Origin,vecK},{width=8});
    g:Dspherical()
    g:Dcircle3d(Origin,3,vecn,"draw=none,fill=blue!25, fill opacity=0.4")
    g:Dpolyline3d({A,B},"dashed,thick")
    g:Dpolyline3d({{O1,P},{Origin,A}},"dashed,red,thick")
    g:Dballdots3d({Origin,O1,A,B,P},"red")
    g:Dlabel3d(
        "$O$",Origin,{pos="E"},
        "$O_1$",O1,{pos="SE"},
        "$B$",B,{},
        "$A$",A,{pos="SW"},
        "$r$",(O1+A)/2,{pos="N"},
        "$P$",P,{},
        "$R$",P/2,{pos="E",node_options="text=red"},
        "$R$",A/2,{pos="W"},
        "$h$",O1/2,{pos="E"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

这里又学会一些小技巧:

  • ld.poly2facet可以把「poly」转为「facets」
  • ld.facetedges可以把「facets」转为「edges」直接作为参数列表传入「绘制」函数
\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=spherical_cube}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local Z = cpx.Z
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {15,75}
    }
    local sqrt = math.sqrt
    require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "magenta!25",edgewidth=8, edgecolor="black" }
    local a = 3/sqrt(2)
    local S = M(-a,-a,-a)
    local O1, O2= a*vecK, -a*vecK
    local P = ld.poly2facet(ld.parallelep(S,2*a*vecI,2*a*vecJ,2*a*vecK))
    local edges = ld.facetedges(P)
    g:DScircle({Origin, vecK},{color="violet",width=8})
    g:DSpolyline(edges,{width=8})
    g:DScircle({a*vecK, vecK},{color="violet",width=8})
    g:DScircle({-a*vecK, vecK},{color="violet",width=8})
    g:Dspherical()
    g:Dcircle3d(O1,a,vecK,"draw=none, fill=magenta!75, fill opacity=0.4") -- not quite good
    g:Dcircle3d(O2,a,vecK,"draw=none, fill=magenta!75, fill opacity=0.4")
    
    local t1,t2,t3,t4  = M(0,-a,a), M(0,a,a), M(-a,0,a), M(a,0,a)
    local m1,m2,m3,m4  = M(a,a,0), M(a,-a,0), M(-a,a,0), M(-a,-a,0)
    local b1,b2,b3,b4  = M(0,-a,-a), M(0,a,-a), M(-a,0,-a), M(a,0,-a)
    for _, p in ipairs{t3,m3,b3,b4} do
        g:Dpolyline3d({Origin,p},"teal,thick,dashed")
    end
    g:Dpolyline3d({Origin,O1,t1},true,"red,thick,dashed")
    g:Dballdots3d({Origin,O1,t1,t2,t3,t4,m1,m2,m3,m4,b1,b2,b3,b4},"red")
    g:Dlabel3d(
        "$O$",Origin,{pos="NE"},
        "$C_1$",M(-a,a,a),{},
        "$H$",M(0,-a,a),{pos="NW"},
        "$A_1$",M(a,-a,a),{pos="W"},
        "$D$",M(-a,-a,-a),{},
        "$D_1$",M(-a,-a,a),{pos="N"},
        "$O_1$",O1,{},
        "$A$",M(a,-a,-a),{pos="SW"},
        "$B$",M(a,a,-a),{pos="E"},
        "$C$",M(-a,a,-a),{},
        "$B_1$",M(a,a,a),{},
        "$a$",M(a,0,-a),{pos="S"},
        "$R$",M(0,-a,a)/2,{node_options="text=red"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

又学到一个 ld.cvx_hull3d()...

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=spherical_circle}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,78}
    }
    require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local phi1, phi2 = 75, 45
    local A,B,C = sM(90,phi1), sM(-140,phi1),sM(-30,phi1)
    local A1,B1,C1 = sM(90,phi2), sM(-140,phi2),sM(-30,phi2)
    ---------
    -- https://github.com/pfradin/luadraw/discussions/341#discussioncomment-18530158
    local P = ld.facet2poly( ld.cvx_hull3d({A,B,C,A1,B1,C1}) )
    ---------
    local O1,O2 = ld.proj3d(Origin,{A,vecK}), ld.proj3d(Origin,{A1,vecK})
    local R1,R2 = pt3d.abs(A-O1), pt3d.abs(A1-O2)
    g:DScircle({Origin, vecK});g:DScircle({A, vecK})
    g:DScircle({A1, vecK})
    g:Dcircle3d(O1,R1,vecK,"draw=none, fill=cyan!30, fill opacity=0.4")
    g:Dpoly(P,{color="violet!30!white",mode=ld.mFlatHidden, edgewidth=8})
    g:Dcircle3d(O2,R2,vecK,"draw=none, fill=cyan!30, fill opacity=0.4")
    g:Dspherical()
    g:Dpolyline3d({A,Origin,A1},"dashed,red,thick")
    g:Dpolyline3d({{Origin,O2,A1},{O1,A}},"dashed,blue!75")
    g:Dballdots3d({Origin,O1,O2,A,A1},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="S"},
        "$O_1$",O1,{pos="W"},
        "$O_2$",O2,{},
        "$A$",A,{pos="E"},
        "$A_1$",A1,{},
        "$R$",A/2,{pos="S",node_options="text=red"},
        "$R$",2*A1/3,{pos="W"},
        "$h$",(O1+O2)/2,{pos="E",node_options="text=blue"},
        "$r_1$",(O1+A)/2,{pos=""},
        "$r_2$",0.2*A1+0.8*O2,{}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

学到一些新东西...

查看原图,这里定位的方式最佳的方式应该不是直接通过极坐标给定A,B,C,D四个点的坐标(实际上也很难确定),注意到其实这里的B,C,D应该是截面圆和视界圆的交点,所以我使用了out这个小特性:

   local A = sM(-140,120)
    local Out1, Out2 = {}, {}
    g:DScircle({A,vecK},{out=Out1});
    local B,C = table.unpack(ld.reverse(Out1))
    local M = (A+B)/2
    local vecN = pt3d.prod(B-A,vecK)
    g:DScircle({M,vecN},{out=Out2});
    local _,D = table.unpack(Out2)

以下是我的完整代码尝试:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=perpendicular_circle}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,70}
    }
    require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    g:DScircle({Origin, vecK})
    local A = sM(-140,120)
    local Out1, Out2 = {}, {}
    g:DScircle({A,vecK},{out=Out1});
    local B,C = table.unpack(ld.reverse(Out1))
    local M = (A+B)/2
    local vecN = pt3d.prod(B-A,vecK)
    g:DScircle({M,vecN},{out=Out2});
    local _,D = table.unpack(Out2)
    local O1,O2 = ld.proj3d(Origin,{M,vecK}),ld.proj3d(Origin,{M,vecN})
    local r1,r2 = pt3d.abs(C-O1), pt3d.abs(D-O2)
    g:Dcircle3d(O1,r1,vecK,"draw=none, fill=violet!50, fill opacity=0.4")
    g:Dcircle3d(O2,r2,vecN,"draw=none, fill=violet!50, fill opacity=0.4")
    g:Dspherical()
    g:Dpolyline3d({{A,B,C},{A,B,D},{C,D}},true,"dashed,red,thick")
    g:Dpolyline3d({{Origin,O1,M,O2},{A,Origin},{A,O1},{A,O2}},true,"dashed,blue!60,thick")
    g:Dballdots3d({Origin,O1,O2,A,B,C,D,M},"red")
    g:Dangle3d(Origin,O2,M,0.2,"thick");g:Dangle3d(Origin,O1,M,0.2,"thick");g:Dangle3d(O1,M,O2,0.2,"thick")
    g:Dlabel3d(
        "$O$",Origin,{pos="N"},
        "$O_2$",O2,{},
        "$D$",D,{},
        "$O_1$",O1,{pos="S"},
        "$M$",M,{pos="S"},
        "$A$",A,{pos="NE"},
        "$B$",B,{pos="SW"},
        "$C$",C,{pos="E"},
        "$\\ell$",M,{pos="W",node_options="text=red"},
        "$R$",A/2,{pos="",node_options="text=blue"},
        "$r_1$",(A+O1)/2,{},
        "$r_2$",(A+O2)/2,{}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

同样的,一些地方应该用g:DSpolyline而不是g:Dployline3d,但是不想改,我认为这是「教学性3D」,不用强制追求「真实3D」(哼)...

没有完全复刻,具体角度和位置,以及一些线条之间颜色遮挡的细节并未考虑得十分完备...有缘再讨论吧;-)

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=spherical_circle}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,77.5}
    }
    require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local A,B,M,N = sM(-10,120), sM(-115,120),sM(150,120), sM(0,0)
    g:DScircle({Origin, vecK})
    local vecN = pt3d.prod(A-N,B-N)
    local O1,O2 = ld.proj3d(Origin,{M,vecK}), ld.proj3d(Origin,{N,vecN})
    local r1,r2 = pt3d.abs(M-O1), pt3d.abs(N-O2)
    g:DScircle({M,vecK});g:DScircle({N,vecN})
    g:Dcircle3d(O1,r1,vecK,"draw=none, fill=violet!50, fill opacity=0.4")
    g:Dcircle3d(O2,r2,vecN,"draw=none, fill=violet!50, fill opacity=0.4")
    g:Dspherical()
    g:Dpolyline3d({{A,B,M},{A,B,N}},true,"dashed,blue!75,thick")
    local D = (A+B)/2
    g:Dpolyline3d({Origin,O1,D,O2},true,"dashed,red,thick")
    g:Dpolyline3d({B,Origin,D},"dashed,thick")
    g:Dballdots3d({Origin,O1,O2,A,B,M,N},"red",0.75)
    g:Dballdots3d({D},"blue",0.75)
    g:Dangle3d(Origin,O2,D,0.2,"thick");g:Dangle3d(Origin,O1,D,0.2,"thick");g:Darc3d(O1,D,O2,0.3,1,"red,very thick")
    g:Dlabel3d(
        "$O$",Origin,{pos="E"},
        "$O_1$",O1,{},
        "$M$",M,{pos="N"},
        "$N$",N,{},
        "$O_2$",O2,{pos="N"},
        "$A$",A,{pos="S"},
        "$D$",D,{},
        "$B$",B,{pos="W"},
        "$\\ell$",(B+D)/2,{pos="S",node_options="text=blue!75"},
        "$R$",0.8*B,{pos="N",node_options="text=red"},
        "$n$",0.2*D+0.8*O2,{pos="W"},
        "$m$",0.4*D+0.6*O1,{pos="S"},
        "$\\theta$",D,{pos="NE",dist=0.15}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=spherical_circle}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        -- adjust2d = true, 
        viewdir = {0,65}
    }
    require 'luadraw_spherical'
    local sM = ld.sM
    ld.Hiddenlines = true;ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{ color = "", edgewidth=8, edgecolor="black" }
    local A,B,C,D = sM(90,90), sM(140,90),sM(-40,90), sM(-120,50)
    g:DScircle({Origin, vecK})
    local vecn = pt3d.prod(B,D)
    g:Dcircle3d(Origin,3,vecn,"draw=none, fill=violet!30, fill opacity=0.4")
    g:DSgreatcircle({B,D},{width = 6})
    g:Dspherical()
    g:Dpolyline3d({{A,B,D,C,A},{A,D},{B,C}},"dashed,red,thick")
    g:Dpolyline3d({D,Origin,A},"dashed,blue!75,thick")
    g:Dballdots3d({Origin,A,B,C,D},"red",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="S"},
        "$C$",C,{pos="SW"},
        "$B$",B,{pos="NE"},
        "$D$",D,{pos="N"},
        "$A$",A,{pos="E"},
        "$r$",A/2,{pos="N",node_options="text=blue"},
        "$r$",D/2,{pos="S",dist=0.1},
        "$\\ell$",Origin,{pos="N",node_options="text=red"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

我前几天还画了最后一个「棱切球」,但是对效果不太满意,和开发者在这里讨论了一下...其实真实的3D和教学性用图需要的是不太一样的,这个包的作者更希望展示真实的3D情景...

BTW, 原题主在小红书发的帖子最好贴个原链接...我看原图样式可能是GGB转tikz的吧...

image.png

下面是我修改后的版本:

% https://github.com/pfradin/luadraw/discussions/335#discussioncomment-18452750
\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=tetrahedron}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local poly = require 'luadraw_polyhedrons'
    require 'luadraw_spherical'
    local g = ld.graph3d:new{ window = {-4,4,-4,4}, viewdir = {60,80}, size={12,12} }
    ld.Hiddenlines = true; ld.Hiddenlinestyle = "dashed"
    local P = poly.tetrahedron(Origin, 3*vecK)
    local D, B, C, A = table.unpack(P.vertices)
    local T1,T2,T3,T4 = (A+B)/2, (B+C)/2, (C+D)/2, (D+A)/2
    local T5,T6 = (B+D)/2, (A+C)/2
    local R = pt3d.abs(T1)
    local o1,r1,n1 = ld.incircle3d(A,B,C) -- incircle of triangle ABC
    local o2,r2,n2 = ld.circumcircle3d(T3,T4,T5) -- circumcircle of triangle T3T4T5

    g:Define_sphere({radius=R, color="magenta!25", edgestyle="noline", mode=ld.mBorder, hiddencolor="violet"})
    g:DScircle({Origin,vecK}, {color="violet", width=8})
    g:DSpolyline( ld.facetedges(P),{width=8} )
    g:DScircle({A,pt3d.prod(C-A,B-A)},{color="violet"})
    g:DScircle({T5,pt3d.prod(T3-T5,T4-T5)},{color="violet"})
    g:Dspherical()
    g:Dcircle3d(o1,r1,n1,"draw=none, fill=blue!30, fill opacity=0.4")
    g:Dcircle3d(o2,r2,n2,"draw=none, fill=blue!30, fill opacity=0.4")
    g:Dpolyline3d({{Origin,T3},{T2,T4}},"red,dashed,thick")
    g:Dpolyline3d({D,o1,A},"teal,dashed,semithick")
    g:Dballdots3d({Origin,o1,o2,A,B,C,D,T1,T2,T3,T4,T5,T6},"red",0.75)
    g:Dlabel3d(
        "$A$",A,{pos="W"},
        "$B$",B,{pos="S"},
        "$C$",C,{pos="E"},
        "$D$",D,{pos="N"}
    )
    g:Linecolor("black");-- g:Linestyle("dashed")
    g:Dangle3d(D,T4,T2,0.15,"thick"); g:Dangle3d(D,T3,Origin,0.15,"thick"); g:Dangle3d(T4,T2,B,0.15,"thick");
    g:Dlabel3d(
        "$O$",Origin,{pos="E"},
        "$O_1$",o1,{},
        "$O_2$",o2,{},
        "$a$",(A+B)/2,{pos="SW",node_options="text=red"},
        "$R$",(T2+T4)/2,{pos="W",dist=0.1}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

我建议你可以画到某个图的时候开新的问题(不需要额外悬赏),避免在一个帖子里存在大量不同版本的代码,一个帖子集中在一个图,逐个击破。

Comment

image.png

画图这种东西要就具体情况具体分析,根据图之间的关系来决定绘制顺序,没有一概而论的方法,这里的情况「1,2,4,5,6,8,9,13,14,15,16,17」看上去都是平凡的,留做习题完全没问题;-)

再画一个玩玩:

image.png

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=insphere}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M, Mc, Origin = pt3d.M, pt3d.Mc, pt3d.Origin
    local sqrt = math.sqrt
    require 'luadraw_spherical'
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        windows = {-4,4,-4,4},
        viewdir = {0,80}, size={10,10}
    }
    local R1, R2 = 2, 4
    local R = sqrt(R1*R2) -- 
    local O2, O1 = M(0,0,-R), M(0,0,R)
    local A, A1 = Mc(R2,-45*ld.deg,-R), Mc(R2,135*ld.deg,-R)
    local B, B1 = Mc(R1,-45*ld.deg,R), Mc(R1,135*ld.deg,R)
    local vecn = Mc(R,45*ld.deg,0)
    -- tangent point
    local X = (R1 * A + R2 * B) / (R1 + R2)
    local Y = (R1 * A1 + R2 * B1) / (R1 + R2)
    ld.Hiddenlines = true; ld.Hiddenlinestyle = "dashed"
    g:Define_sphere{
        radius = R,
        color = "magenta!25",
        edgecolor = "black",
        edgewidth = 6,
        edgestyle = "dashed",
        hiddencolor = "black",
        hiddenstyle = "dashed",
        mode = ld.mWireframe
    }
    g:DSpolyline({{A,A1},{B,B1},{A,B},{A1,B1}},{width=6})
    g:DSpolyline({{B,B1},{A1,B1}},{width=6,style="dashed"})
    g:DSpolyline({{O1,O2},{Origin,X},{Origin,Y}},{color="cyan",style="dashed",width=6})
    g:DScircle({Origin,vecn},{color="blue",width=6,style="dashed"})
    g:Dspherical()
    g:Dfrustum(O2, R2, R1, O1, {edgewidth=6, hiddenstyle="dashed"})
    ---
    g:Dcircle3d(Origin,R,vecn,"draw=none, fill=blue!30, fill opacity=0.4")
    ---
    g:Dballdots3d({Origin,O1,O2,A,B,A1,B1,X,Y},"red",0.75)
    g:Dangle3d(O1,O2,A,"semithick");g:Dangle3d(O2,O1,B,"semithick");g:Dangle3d(Origin,X,B,"semithick");
    g:Dlabel3d(
        "$O$",Origin,{pos="SE"},
        "$O_2$",O1,{pos="N"},
        "$B$",B,{},
        "$O_1$",O2,{pos="S"},
        "$A$",A,{},
        "$H$",X,{pos="W"},
        "$r_2$",(O1+B)/2,{pos="N",node_options="text=red"},
        "$r_2$",(X+B)/2,{pos="W"},
        "$r_1$",(X+A)/2,{},
        "$r_1$",(O2+A)/2,{pos="S"},
        "$R$",(O2+Origin)/2,{pos="W"}
    )
    g:Show()
\end{luadraw}
\end{document}

image.png

挑一个玩玩...不妨假定目标是:

image.png

以下是基于 luadraw 的实现:

\documentclass{standalone}
\usepackage[3d]{luadraw}% lualatex needed
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=circumsphere}
    local ld = luadraw
    local pt3d, cpx = ld.pt3d, ld.cpx
    local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
    local sqrt = math.sqrt
    require 'luadraw_spherical'
    local g = ld.graph3d:new{
        window3d = {-5,5,-5,5,-5,5},
        window = {-5,5,-5,5},
        viewdir = {0,80}
    }
    ld.Hiddenlinestyle = "dashed"
    local R, hBottom, hTop = 3, -1, 2.5
    local O1, O2 = hBottom*vecK, hTop*vecK
    local R1, R2 = sqrt(R^2-hBottom^2), sqrt(R^2-hTop^2)
    local A1, A2 = Mc(R1,-30*ld.deg,hBottom), Mc(R2,-30*ld.deg,hTop)
    g:Define_sphere{color = "",edgecolor = "black",edgewidth = 8,hiddenstyle = "dashed",mode = ld.mWireframe}
    g:Dfrustum(O1,R1,R2,O2,{color="violet", edgecolor="black"})
    g:Dpolyline3d({{O1,O2},{O1,A1},{O2,A2},{A1,A2}},"magenta,dashed,semithick")
    g:Dpolyline3d({{Origin,A1},{Origin,A2}},"cyan,dashed,semithick")
    g:Dballdots3d({Origin,O1,O2,A1,A2},"black",0.75)
    g:Dlabel3d(
        "$O$",Origin,{pos="E"},
        "$O_1$",O1,{},
        "$O_2$",O2,{},
        "$A$",A1,{pos="S"},
        "$A_1$",A2,{pos="SW"},
        "$h$",(O1+O2)/2,{pos="E",node_options="text=magenta"},
        "$r_1$",(O1+A1)/2,{pos="SE"},
        "$r_2$",(O2+A2)/2,{pos="N"},
        "$R$",A1/2,{pos="N",node_options="text=cyan"}
    )
    g:Dspherical()
    g:Show()
\end{luadraw}
\end{document}

image.png

再补充几种变式,通过 adjustboxminipage模式可以更好地控制位置关系:

\documentclass[12pt]{book}
\usepackage{mathatlas}
\usepackage{lipsum}
\usepackage[export]{adjustbox}%<----
\usepackage{lua-visual-debug}%<---- lualatex
\presetAnswer
\begin{document}


\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$\par
\begin{adjustbox}{valign=t,minipage=.7\linewidth}
    \begin{choices}
    \item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
    \item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
    \item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
    \item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{adjustbox}%
\begin{minipage}[t]{.28\linewidth}
\lipsum[2][1-2]
\end{minipage}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$\par
\begin{adjustbox}{valign=t,minipage=.7\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{adjustbox}%
\begin{minipage}[t]{.28\linewidth}
\includegraphics[width=\linewidth,height=3cm,valign=t]{example-image-duck}
\end{minipage}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$\par
\begin{adjustbox}{valign=M,minipage=.7\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{adjustbox}%
\begin{minipage}{.28\linewidth}
\includegraphics[width=\linewidth,height=3cm,valign=M]{example-image-duck}
\end{minipage}
\end{exercise}

\end{document}

image.png

(顺便看看基线)

image.png

这里的模板是「LuaTeX友好」的,可以用 lua-visual-debug 看看猫腻:

\documentclass[12pt]{book}
\usepackage{lua-visual-debug}%<-lualatex
\usepackage{mathatlas}
\usepackage{lipsum}
\presetAnswer
\begin{document}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$

\noindent\begin{minipage}[t]{.78\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{minipage}\hfill%
\begin{minipage}[t]{.2\linewidth}
\lipsum[2][1-2]
\end{minipage}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$

\noindent\begin{minipage}[t]{.78\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{minipage}\hfill%
\begin{minipage}[t]{.2\linewidth}
\includegraphics[width=\linewidth,height=3cm]{example-image-duck}
\end{minipage}
\end{exercise}

\end{document}

image.png

可以看到这里的「t」实际上指的是「与第一行元素的基线对齐」,此时在此亦有记载:

image.png

据我个人的认知,一般的方案是基于「adjustbox」来修改图片元素基线:

\documentclass[12pt]{book}
\usepackage{mathatlas}
\usepackage{lipsum}
\usepackage[export]{adjustbox}%<----
\geometry{vmargin=1cm}
\presetAnswer
\begin{document}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$

\noindent\begin{minipage}[t]{.78\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{minipage}\hfill%
\begin{minipage}[t]{.2\linewidth}
\lipsum[2][1-2]
\end{minipage}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$

\noindent\begin{minipage}[t]{.78\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{minipage}\hfill%
\begin{minipage}[t]{.2\linewidth}
\includegraphics[width=\linewidth,height=3cm]{example-image-duck}
\end{minipage}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$

\noindent\begin{minipage}[t]{.78\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{minipage}\hfill%
\begin{minipage}[t]{.2\linewidth}
\includegraphics[width=\linewidth,height=3cm,valign=t]{example-image-duck}
\end{minipage}
\end{exercise}

\begin{exercise}[S]
\res{2026·四川巴中期末}\par
在三棱柱$A_1B_1C_1-ABC$中,$D$是$BC_1$的中点,且
$\overrightarrow{AA_1} = \vec{a}, \overrightarrow{AB} = \vec{b}, \overrightarrow{AC} = \vec{c}$,则$\overrightarrow{A_1D}=$

\noindent\begin{minipage}[t]{.78\linewidth}
\begin{choices}
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $-\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} - \frac{1}{2}\vec{b} + \frac{1}{2}\vec{c}$
\item $\frac{1}{2}\vec{a} + \frac{1}{2}\vec{b} - \frac{1}{2}\vec{c}$
\end{choices}
\end{minipage}\hfill%
\begin{minipage}[t]{.2\linewidth}
\includegraphics[width=\linewidth,height=3cm,valign=T]{example-image-duck}
\end{minipage}
\end{exercise}

\end{document}

image.png

这里「adjustbox」提供了tT两种对齐方式,而且有行间距的细微差别...

image.png

(先这样吧...这里左侧对齐的不是那么理想/行距有问题的原因我猜是「exam-zh-choices」提供的choices环境其实是一个拼起来的coffin(希望没记错),它的基线似乎不是第一行元素的基线...)

wrapstuff没那么聪明,需要自行根据情况在合适的位置加上\wrapstuffclear:

\documentclass[10pt, twoside]{ctexbook}
\usepackage[paperwidth=185mm, paperheight=260mm, left=18.5mm, right=18.5mm, top=25.5mm, bottom=25.5mm]{geometry}
\usepackage{amsmath}
\usepackage{caption}
\usepackage{graphicx}
\usepackage{wrapstuff}
\begin{document}


\begin{wrapstuff}[r,top=2]
\parbox{0.3\linewidth}{
  \centering
  \includegraphics[width=\linewidth]{example-image}
  \captionof{figure}{什么原因}
  \label{fig:4-3-2}
}
\end{wrapstuff}
如图 \ref{fig:4-3-2} 所示,在图片的左侧,公式的编号是不连续的,不知道什么原因呢:
\begin{equation}
  1 +1 = 2
  \label{eq:1}
\end{equation}
上面是第一个公式编号是 $1$。

我隐身了吗?
\begin{equation}
  2 +2 =4
  \label{eq:}
\end{equation}

我也隐身了呢
\wrapstuffclear%<---------
我也隐身了吗
\begin{equation}
  3 + 3= 6
  \label{eq:3}
\end{equation}

下面的公式怎么回事呢,上面的内容都没了呢
\begin{equation}
  4 + 4 = 8
  \label{eq:4}
\end{equation}

怎么跳跃这么大呢。
\end{document}

image.png

另外,可以避免一些冗余代码:

  • 对于ctexbook,它的twoside是默认选项,可忽略
  • 对于geometry,可以用hmarginvmargin选项避免重复写18.525.5

发布
问题