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

注册于 4年前

回答
598
文章
0
关注者
22

学到一些新东西...

查看原图,这里定位的方式最佳的方式应该不是直接通过极坐标给定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

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

\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」提供了t和T两种对齐方式,而且有行间距的细微差别...

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,可以用hmargin和vmargin选项避免重复写18.5和25.5

只是一些探索,可能不能算得上是答案...
其实这个问题和 tabularray 无关... 先简化一下问题MWE

\documentclass[fontset=fandol]{ctexbook}
% \usepackage{capt-of}
\usepackage{caption}
\usepackage{zhlipsum}
\begin{document}
\zhlipsum[1]

\captionof{table}{我的表哥}

\zhlipsum[1-2]

\end{document}

image.png

Finding A

如果只需要\captionof而不需要其他命令,可以使用capt-of包(只提供了\captionof这个命令)

\documentclass[fontset=fandol]{ctexbook}
\usepackage{capt-of}
\usepackage{zhlipsum}
\begin{document}
\zhlipsum[1]

\captionof{table}{我的表哥}

\zhlipsum[1-2]

\end{document}   

image.png

Finding B

如果确实需要caption的其他功能,可以使用 egreg 提供的方案:

\documentclass[fontset=fandol]{ctexbook}
\usepackage{tabularray}
% \usepackage{capt-of}
\usepackage{caption}
\usepackage{zhlipsum}
\newenvironment{nobox}{\par}{\par}
\NewTblrTheme{notag}{
  \DefTblrTemplate{caption-tag}{default}{}
  \DefTblrTemplate{caption-sep}{default}{}
  \addtocounter{table}{-1}
}
\begin{document}
\zhlipsum[1]

\begin{nobox}
\captionof{table}{我的表哥}
\hfill 单位\underline{\hspace{4\ccwd}}m\phantom{单位}\\[-25pt]
\begin{longtblr}[
    theme = notag,
  ]{colspec = {*{6}{X[c]}},
    rowspec = {|Q[m]|*{3}{Q[m]|}},
    hline{1,Z} = {1pt},
    row{1-Z} = {font = \footnotesize},
  }
  记录 & & & & & & \\
  数量 & & & & & &
\end{longtblr}
\end{nobox}

\zhlipsum[1-2]

\end{document}

image.png

使用神秘代数结论(读者自证不难:P),可以得到利用重心坐标系的极简纯tikz版本:

\documentclass[tikz,border=3.14pt]{standalone}
\usepackage{fourier}
\begin{document}
\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \coordinate (B) at (5,0);
  \coordinate (C) at (1,3);
  \draw (A) -- (B) -- (C) -- cycle;
  \draw[semithick,magenta]
    plot[domain=0:360,samples=144,smooth]
    (
        barycentric cs:A={1/3+cos(\x)/3},B={1/3+cos(\x-120)/3},C={1/3+cos(\x+120)/3}
    );
  \node[below left]  at (A) {$A$};
  \node[below right] at (B) {$B$};
  \node[above]       at (C) {$C$};
\end{tikzpicture}
\end{document}

image.png

事实上,这种经典问题早已被 tkz-elements 一网打尽了,斯坦纳内切椭圆外接椭圆两手都要抓两手都要硬😡

image.png

使用仿射变换略施小计可以避免复杂的求根操作:

\documentclass{standalone}
\usepackage{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
    \begin{luadraw}{name=steiner_inellipse}
    local ld = luadraw
    local cpx = ld.cpx
    local g = ld.graph:new{window={-1,6,-1,4},size={10,10}
    }
    local i, Z = cpx.I, cpx.Z
    local sqrt, pi = math.sqrt, math.pi
    local A0,B0,C0 = Z(-1,0), Z(1,0), Z(0,sqrt(3))
    local A,B,C = Z(0,0), Z(5,0), Z(1,3)
    local MA1 = {A0, B0-A0, C0-A0}
    local MA2 = {A,  B-A,  C-A}
    local M = ld.composematrix(MA2, ld.invmatrix(MA1))
    local In, r = ld.incircle(A0,B0,C0)
 
    g:Savematrix();g:Setmatrix(M)
    g:Dpolyline({A0,B0,C0}, true)
    g:Dpolyline(ld.circle({In,r}), true, "semithick,magenta")
    g:Restorematrix()

    g:Dlabel(
        "$A$",A,{pos="SW"},
        "$B$",B,{pos="SE"},
        "$C$",C,{pos="N"}
    )
    g:Show()
\end{luadraw}
\end{document}

这里用到的原理是,deepseek告诉我「三角形之于其内切斯坦纳椭圆的关系」,正如「一个等边三角形之于其内切圆的关系」。因此只要知道「A0B0C0」到「ABC」的仿射矩阵(代码中以基矩阵作为媒介),便可以对内切圆进行仿射变换M,立刻得到目标的内切椭圆...

image.png

Some Notes:

KaoBook下载链接:https://github.com/fmarotta/kaobook

发布
问题