Another possibility in tikz-cd:

Another possibility in tikz-cd:

\documentclass[tikz,border=8pt]{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{fourier}
\usetikzlibrary{arrows.meta,calc,positioning,shadows,shapes.geometric,shapes.symbols}
\begin{document}
\begin{tikzpicture}[
font=\sffamily,=Latex,
line/.style={wire,draw=black!75},
orange line/.style={wire,draw=DarkOrange},
wire/.style={line width=.8pt,-{Latex[length=3mm,width=2.2mm]}},
component/.style={draw=black!75,line width=.8pt,fill=white,drop shadow},
tag/.style={component,signal,signal to=#1,minimum width=31mm,minimum height=8mm,inner xsep=4mm},
block/.style={component,draw=DarkOrange,fill=gray!20,line width=.9pt,minimum width=34mm,minimum height=48mm},
constant/.style={component,minimum size=12mm},
gain/.style={component,regular polygon,regular polygon sides=3,shape border rotate=-90,minimum size=17mm},
display/.style={component,minimum width=12mm,minimum height=13mm}
]
\node[block] (system) {};
\node[tag=east,fill=Violet!45,anchor=east] (isabc) at ([xshift=-30mm,yshift=14mm]system.west) {Is\_ABC};
\node[constant,anchor=west] (dc) at (isabc.west |- system.west) {$320$};
\node[tag=east,fill=LightSalmon,anchor=east] (theta) at ([xshift=-30mm,yshift=-14mm]system.west) {theta\_e};
\node[anchor=west] at ([yshift=14mm]system.west) {Is\_ABC};
\node[anchor=west] at (system.west) {V\_dc};
\node[anchor=west] at ([yshift=-14mm]system.west) {theta\_e};
\node[anchor=east] at ([yshift=10mm]system.east) {idq\_pu};
\node[anchor=east] at ([yshift=-10mm]system.east) {V\_dc\_pu};
\node[DarkOrange,anchor=north,font=\bfseries] at ([yshift=-1mm]system.south) {$3s{>}2s\ \&\ pu$};
\node[tag=west,fill=Cyan!45,anchor=west] (idqpu) at ([xshift=25mm,yshift=10mm]system.east) {idq\_pu};
\node[tag=west,fill=SlateBlue!55,anchor=west] (vdcpu) at ([xshift=25mm,yshift=-10mm]system.east) {Vdc\_pu};
\coordinate (branch) at ($(system.east)+(12mm,10mm)$);
\node[gain] (ibase) at ([xshift=22mm,yshift=22mm]branch) {};
\node at (ibase) {ibase};
\node[below=2mm of ibase] (ibaselabel) {ibase};
\node[display,right=14mm of ibase] (display) {};
\node[rectangle,draw=black!75,line width=.7pt,minimum width=8mm,minimum height=5mm] at ([yshift=2mm]display.center) {};
\node at (ibaselabel -| display) {idq};
\draw[line] (isabc.east) -- ([yshift=14mm]system.west);
\draw[line] (dc.east) -- (system.west);
\draw[line] (theta.east) -- ([yshift=-14mm]system.west);
\draw[orange line] ([yshift=10mm]system.east) -- (idqpu.west);
\draw[orange line] ([yshift=-10mm]system.east) -- (vdcpu.west);
\fill[DarkOrange] (branch) circle (1.1pt);
\draw[orange line] (branch) |- (ibase.west);
\draw[line] (ibase.east) -- (display.west);
\end{tikzpicture}
\end{document}
Here below is the proposal based on luadraw:
\documentclass[border=5pt]{standalone}
\usepackage{fourier-otf}
\usepackage{luadraw}
\begin{document}
\begin{luadraw}{name=fillarea}
local ld = luadraw
local g = ld.graph:new{
window={-2.5,2.5,-2.5,2.5,2,1},
size={8,10},margin=0.25
}
local pi,f = math.pi,math.atan
local h = function() return pi/2 end
g:Filloptions("full","red!30",0.3)
g:Linestyle("noline")
g:Ddomain2(f,h,{x={0,2}})
g:Lineoptions("dashed","black",4)
g:Filloptions("none",nil,1)
g:DlineEq(0,1,-pi/2)
g:DlineEq(0,1,pi/2)
g:Lineoptions("solid","black",6)
g:Dcartesian(f,{x={-2,2}})
g:Daxes({0,1,1},{labelpos={"none","none"},originpos={"none","none"},xyticks={0,0},legend={"$x$","$y$"},arrows="-Stealth"})
g:Show()
\end{luadraw}
\end{document}
\documentclass[border=5pt]{standalone}
\usepackage{fourier-otf}
\usepackage{luadraw}
\usepackage[svgnames]{xcolor}
\begin{document}
\begin{luadraw}{name=gradbox}
local ld = luadraw
local g = ld.graph:new{window={-5,4,-5.5,5},size={10,10}}
local i, pi = ld.cpx.I, math.pi
local h = function(x) return x^2/2-2 end
local f = function(x) return math.sin(3*x)+h(x) end
g:Dgradbox(
{-pi-4*i,pi+4*i,pi/3,1},
{
grid=true,originloc=0,
originnum={0,0},
labeltext={"\\pi",""},
labelden={3,1},
title="\\textbf{Title}",
legend={"Legend $x$","Legend $y$"}
}
)
g:Filloptions("full","blue",0.6); g:Linestyle("noline")
g:Ddomain2(f,h,{x={-pi/2,2*pi/3}})
g:Filloptions("none",nil,1); g:Lineoptions("solid",nil,8)
g:Dcartesian(h,{x={-pi,pi}, draw_options="DarkBlue"})
g:Dcartesian(f,{x={-pi,pi},draw_options="Crimson"})
g:Show()
\end{luadraw}
\end{document}
\documentclass[border=5pt]{standalone}
\usepackage{fourier-otf}
\usepackage{luadraw}
\usepackage[svgnames]{xcolor}
\begin{document}
\begin{luadraw}{name=implicit_inequalities}
local ld = luadraw
local cpx = ld.cpx
local Z = cpx.Z
local g = ld.graph:new{ window = {-3, 4, -3, 5}, size = {10, 10} }
local f1 = function(x,y) return -x*y+y^2-x^2-1 end
local f2 = function(x,y) return x^3-x-y^2+4 end
local filloptions = "draw=none,pattern= north west lines, pattern color=cyan"
g:Daxes( {0,1,1},{grid=true,gridstyle="dashed",xyticks={0,0},arrows="-Stealth"})
g:Dimplicit_inequalities(
{f1,'<',f2,">"},
{view={-2,5,-5,5}, draw_options=filloptions}
)
g:Dimplicit(f1, {draw_options="red,thick"})
g:Dimplicit(f2, {view={-2,5,-5,5}, draw_options="violet,thick"})
local eq = \luastringO{$\begin{cases}y^2-x^2-xy < 1\\ x^3-x+4 > y^2\end{cases}$}
g:Dlabel( eq, Z(2.25,1), {node_options="fill=white"})
g:Show()
\end{luadraw}
\end{document}
\documentclass[multi={luadraw},border=5pt]{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{luadraw}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=implicit_inequalities1}
local ld = luadraw
local cpx = ld.cpx
local Z = cpx.Z
local g = ld.graph:new{ window = {-3, 4, -2, 6}, size = {10, 10} }
g:Daxes({0,1,1}, {grid=true, gridstyle = "dashed",arrows="-Stealth", legend={"$x$","$y$"}})
local f1 = function(x,y) return x^2 + y^2 - 2*x - 4*y - 4 end
local f2 = function(x,y) return y-math.sin(8*x) end
local f3 = function(x,y) return math.sin(8*x) end
local filloptions = "draw=none,pattern= north west lines, pattern color=cyan"
g:Dimplicit_inequalities( {f1,'<',f2,">"}, {grid={100,100}, draw_options=filloptions})
g:Dimplicit(f1, {draw_options="red,thick"})
g:Dcartesian(f3, {draw_options="blue"});
g:Show()
\end{luadraw}
\begin{luadraw}{name=implicit_inequalities2}
local ld = luadraw
local cpx = ld.cpx
local Z = cpx.Z
local g = ld.graph:new{ window = {-3, 4, -2, 6}, size = {10, 10} }
g:Daxes({0,1,1}, {grid=true, gridstyle = "dashed",arrows="-Stealth", legend={"$x$","$y$"}})
local f1 = function(x,y) return x^2 + y^2 - 2*x - 4*y - 4 end
local f2 = function(x,y) return y-math.sin(8*x) end
local f3 = function(x,y) return math.sin(8*x) end
local filloptions = "draw=none,pattern= north west lines, pattern color=cyan"
g:Dimplicit_inequalities( {f1,'<',f2,"<"}, {grid={100,100}, draw_options=filloptions})
g:Dimplicit(f1, {draw_options="red,thick"})
g:Dcartesian(f3, {draw_options="blue"});
g:Show()
\end{luadraw}
\end{document} 
代码是没问题的,问题很可能事万恶的该死的「CTeX套装」...
\documentclass[tikz,border=5pt]{standalone}
\begin{document}
\begin{tikzpicture}[scale=.4]
\draw[->,>=stealth](-2.2,0)--(3,0) node[below] {$x$};
\draw[->,>=stealth](0,-2)--(0,4) node[left] {$y$};
\draw[domain=-2:1.8,smooth] plot(\x,{2^\x});
\end{tikzpicture}
\end{document}在TeXLive2026下效果一切正常:

单个第三个图片怎么画出来?
Here below is the proposal:
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage[3d]{luadraw}
\begin{document}
\begin{luadraw}{name=round-cobuid}
local ld = luadraw
local pt3d = ld.pt3d
local M, vecI, vecJ, vecK = pt3d.M, pt3d.vecI, pt3d.vecJ, pt3d.vecK
local sqrt, sin, cos = math.sqrt, math.sin, math.cos
local g = ld.graph3d:new{
window3d={-5,5,-5,5,-5,5},
window={-4,3,-2,4},viewdir={35,80}
}
-- length, width, height
local L, W, H = 5.0, 2.4, 3.0
local t = 0.5
local scene = {}
local function add_quarter_cylinder(center, r1, r2, axis, n)
local poly = ld.cylinder(
center, axis, sqrt(pt3d.dot(r1, r1)), 4*n
)
poly = ld.cutpoly(poly, {center, r1}, true)
poly = ld.cutpoly(poly, {center, r2}, true)
local arc1, arc2 = {}, {}
for k=0,n do
local u = k*math.pi/2/n
local p = center + cos(u)*r1 + sin(u)*r2
table.insert(arc1, p)
table.insert(arc2, p+axis)
end
table.insert(scene, g:addPoly(poly, {color="white"}))
table.insert(scene, g:addPolyline({
arc1, arc2,
{arc1[1], arc2[1]},
{arc1[#arc1], arc2[#arc2]}
}, {hidden=true, hiddenstyle="dashed"}))
end
local function add_octant_sphere(center, r1, r2, r3, n)
local poly = ld.sphere(center, sqrt(pt3d.dot(r1, r1)), 4*n, 2*n)
poly = ld.cutpoly(poly, {center, r1}, true)
poly = ld.cutpoly(poly, {center, r2}, true)
poly = ld.cutpoly(poly, {center, r3}, true)
local function arc(a, b)
local points = {}
for k=0,n do
local u = k*math.pi/2/n
table.insert(points, center + cos(u)*a + sin(u)*b)
end
return points
end
table.insert(scene, g:addPoly(poly, {color="white", contrast=0}))
table.insert(scene, g:addPolyline({
arc(r1, r2), arc(r1, r3), arc(r2, r3)
}, {hidden=true, hiddenstyle="dashed"}))
end
local boxes = {
ld.parallelep(M(0,0,0), L*vecI, W*vecJ, H*vecK),
ld.parallelep(M(0,0,H), L*vecI, W*vecJ, t*vecK),
ld.parallelep(M(0,W,0), L*vecI, t*vecJ, H*vecK),
ld.parallelep(M(L,0,0), t*vecI, W*vecJ, H*vecK)
}
for _,poly in ipairs(boxes) do
table.insert(scene, g:addPoly(poly, {color="white",edge=true,hidden=true,hiddenstyle="dashed"}))
end
add_quarter_cylinder(M(0,W,H), t*vecJ, t*vecK, L*vecI, 18)
add_quarter_cylinder(M(L,0,H), t*vecI, t*vecK, W*vecJ, 18)
add_quarter_cylinder(M(L,W,0), t*vecI, t*vecJ, H*vecK, 18)
add_quarter_cylinder(M(0,W,0), t*vecJ, -t*vecK, L*vecI, 18)
add_quarter_cylinder(M(L,0,0), t*vecI, -t*vecK, W*vecJ, 18)
add_octant_sphere(M(L,W,H), t*vecI, t*vecJ, t*vecK, 12)
add_octant_sphere(M(L,W,0), t*vecI, t*vecJ, -t*vecK, 12)
g:Dscene3d(table.unpack(scene))
g:Show()
\end{luadraw}
\end{document}
在.cls里面搜类似「浙大蓝」这种颜色的名称...改一下...
另外,你猜猜「巧妇难为无米之炊」的LaTeX论坛版是什么呢...
参考knots包虽然已经有最佳答案了,我也来补充一个治标的方法,需要保证连续的线可以使用双线
double绘制,选项[draw = white, double=black,double distance =0.4pt]
也许比较治本的方法。
\documentclass[tikz,border=5pt]{standalone}
% https://tex.stackexchange.com/a/762955/322482
% https://github.com/loopspace/spath3/issues/37
\ExplSyntaxOn
\msg_redirect_name:nnn { kernel } { variant-same-as-base } { info }
\ExplSyntaxOff
\usetikzlibrary{knots}
\ExplSyntaxOn
\msg_redirect_name:nnn { kernel } { variant-same-as-base } { error }
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\begin{knot}[clip width=5, flip crossing=1]
\strand[red, ultra thick] (0,0) .. controls +(1,0) and +(-1,0) .. (2,1) .. controls +(1,0) and +(-1,0) .. (4,0);
\strand[blue, ultra thick] (0,1) .. controls +(1,0) and +(-1,0) .. (2,0) .. controls +(1,0) and +(-1,0) .. (4,1);
\end{knot}
\end{tikzpicture}
\end{document}
\documentclass[tikz,border=5pt]{standalone}
% https://tex.stackexchange.com/a/762955/322482
% https://github.com/loopspace/spath3/issues/37
\ExplSyntaxOn
\msg_redirect_name:nnn { kernel } { variant-same-as-base } { info }
\ExplSyntaxOff
\usetikzlibrary{intersections,spath3}
\ExplSyntaxOn
\msg_redirect_name:nnn { kernel } { variant-same-as-base } { error }
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\path[spath/save=pathA] (0,0) .. controls +(1,0) and +(-1,0) .. (2,1) .. controls +(1,0) and +(-1,0) .. (4,0);
\path[spath/save=pathB] (0,1) .. controls +(1,0) and +(-1,0) .. (2,0) .. controls +(1,0) and +(-1,0) .. (4,1);
\tikzset{
spath/split at intersections={pathA}{pathB},
spath/insert gaps after components={pathA}{5pt}{1},
spath/insert gaps after components={pathB}{5pt}{2},
}
\draw[red, ultra thick, spath/use=pathA];
\draw[blue, ultra thick, spath/use=pathB];
\end{tikzpicture}
\end{document}
那个最佳答案里的 knot 宏包实际上也有问题,不能满足我的要求
...? 或许补充更多原始需求的信息...?
类似花老师的这个需求:
Step1. 代码不要包含一大堆与原始问题无关的内容。
Step2. 可以考虑基于angles库绘制代码,简化并美化角度的标注
Step3. 基于patterns库实现阴影的绘制
\documentclass[tikz,border=5pt]{standalone}
\usepackage{amsmath}
\usepackage{fourier}
\usetikzlibrary{arrows.meta,angles,quotes,patterns,bending}
\begin{document}
\begin{tikzpicture}
\draw[-Stealth,thick] (-2,0)--(4,0);
\draw[-Stealth,thick] (0,-3)--(0,3) node[above]{$(z)$};
\draw (3,-3) -- coordinate[pos=.1] (A) (0,0) node[label=below left:$O$] (O) {} -- coordinate[pos=.9] (B) (2.5,3);
\draw[pattern=north west lines,pattern color=magenta!50] (A) -- (0,0) -- (B) -- (A) -- cycle;
\pic["$\pi/\alpha$", draw=teal, text=teal, fill=white, -Stealth, angle eccentricity=1.75] {angle = A--O--B};
\end{tikzpicture}
\end{document}
\documentclass{standalone}
\usepackage{libertine}
\usepackage{libertinust1math}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
width=10cm,height=6cm,
ymin=0, ymax=450,
xtick={1,2,3,4,5},
ytick={0,50,100,150,200,250,300,350,400,450},
xticklabels={Jan., Feb., Mar., Apr., May.},
ymajorgrids=true,
axis line style={gray},
tick style={draw=none}
]
\addplot[
color=blue!60!cyan,
line width=1.5pt,
mark=diamond*,
mark size=3pt,
scatter,scatter src=explicit symbolic,
scatter/classes={
a={cyan},
b={magenta},
c={teal},
d={orange},
e={violet}
}
] table [meta=color] {
x y color
1 100 e
2 200 d
3 265 c
4 400 b
5 355 a
};
\end{axis}
\end{tikzpicture}
\end{document}
在我的电脑下,情况恰恰相反。在 C:\texlive\2026\bin\windows\pdftocairo.exe下的数据可以正确处理问题:

是否可以正确处理中文取决于被置于环境变量首位的 pdftocairo.exe 是否可以找到合适的 cmap 文件:
以 texlive/bin/windows/pdftocairo.exe 为例,根据 codex 老师的扫盘,其 cmap 数据位于:
/c/texlive/2026/tlpkg/texworks/share/poppler/cMap
$ tree
.
|-- Adobe-CNS1
| |-- Adobe-CNS1-0
| |-- Adobe-CNS1-1
| |-- Adobe-CNS1-2
| |-- Adobe-CNS1-3
| |-- Adobe-CNS1-4
| |-- Adobe-CNS1-5
| |-- Adobe-CNS1-6
| |-- Adobe-CNS1-7
| |-- Adobe-CNS1-B5pc
| |-- Adobe-CNS1-ETen-B5
| |-- Adobe-CNS1-H-CID
| |-- Adobe-CNS1-H-Host
| |-- Adobe-CNS1-H-Mac
| |-- Adobe-CNS1-UCS2
| |-- B5-H
| |-- B5-V
| |-- B5pc-H
| |-- B5pc-UCS2
| |-- B5pc-UCS2C
| |-- B5pc-V
| |-- CNS-EUC-H
| |-- CNS-EUC-V
| |-- CNS1-H
| |-- CNS1-V
| |-- CNS2-H
| |-- CNS2-V
| |-- ETHK-B5-H
| |-- ETHK-B5-V
| |-- ETen-B5-H
| |-- ETen-B5-UCS2
| |-- ETen-B5-V
| |-- ETenms-B5-H
| |-- ETenms-B5-V
| |-- HKdla-B5-H
| |-- HKdla-B5-V
| |-- HKdlb-B5-H
| |-- HKdlb-B5-V
| |-- HKgccs-B5-H
| |-- HKgccs-B5-V
| |-- HKm314-B5-H
| |-- HKm314-B5-V
| |-- HKm471-B5-H
| |-- HKm471-B5-V
| |-- HKscs-B5-H
| |-- HKscs-B5-V
| |-- UCS2-B5pc
| |-- UCS2-ETen-B5
| |-- UniCNS-UCS2-H
| |-- UniCNS-UCS2-V
| |-- UniCNS-UTF16-H
| |-- UniCNS-UTF16-V
| |-- UniCNS-UTF32-H
| |-- UniCNS-UTF32-V
| |-- UniCNS-UTF8-H
| `-- UniCNS-UTF8-V
|-- Adobe-GB1
| |-- Adobe-GB1-0
| |-- Adobe-GB1-1
| |-- Adobe-GB1-2
| |-- Adobe-GB1-3
| |-- Adobe-GB1-4
| |-- Adobe-GB1-5
| |-- Adobe-GB1-GBK-EUC
| |-- Adobe-GB1-GBpc-EUC
| |-- Adobe-GB1-H-CID
| |-- Adobe-GB1-H-Host
| |-- Adobe-GB1-H-Mac
| |-- Adobe-GB1-UCS2
| |-- GB-EUC-H
| |-- GB-EUC-V
| |-- GB-H
| |-- GB-V
| |-- GBK-EUC-H
| |-- GBK-EUC-UCS2
| |-- GBK-EUC-V
| |-- GBK2K-H
| |-- GBK2K-V
| |-- GBKp-EUC-H
| |-- GBKp-EUC-V
| |-- GBT-EUC-H
| |-- GBT-EUC-V
| |-- GBT-H
| |-- GBT-V
| |-- GBTpc-EUC-H
| |-- GBTpc-EUC-V
| |-- GBpc-EUC-H
| |-- GBpc-EUC-UCS2
| |-- GBpc-EUC-UCS2C
| |-- GBpc-EUC-V
| |-- UCS2-GBK-EUC
| |-- UCS2-GBpc-EUC
| |-- UniGB-UCS2-H
| |-- UniGB-UCS2-V
| |-- UniGB-UTF16-H
| |-- UniGB-UTF16-V
| |-- UniGB-UTF32-H
| |-- UniGB-UTF32-V
| |-- UniGB-UTF8-H
| `-- UniGB-UTF8-V
|-- Adobe-Japan1
| |-- 78-EUC-H
| |-- 78-EUC-V
| |-- 78-H
| |-- 78-RKSJ-H
| |-- 78-RKSJ-V
| |-- 78-V
| |-- 78ms-RKSJ-H
| |-- 78ms-RKSJ-V
| |-- 83pv-RKSJ-H
| |-- 90ms-RKSJ-H
| |-- 90ms-RKSJ-UCS2
| |-- 90ms-RKSJ-V
| |-- 90msp-RKSJ-H
| |-- 90msp-RKSJ-V
| |-- 90pv-RKSJ-H
| |-- 90pv-RKSJ-UCS2
| |-- 90pv-RKSJ-UCS2C
| |-- 90pv-RKSJ-V
| |-- Add-H
| |-- Add-RKSJ-H
| |-- Add-RKSJ-V
| |-- Add-V
| |-- Adobe-Japan1-0
| |-- Adobe-Japan1-1
| |-- Adobe-Japan1-2
| |-- Adobe-Japan1-3
| |-- Adobe-Japan1-4
| |-- Adobe-Japan1-5
| |-- Adobe-Japan1-6
| |-- Adobe-Japan1-7
| |-- Adobe-Japan1-90ms-RKSJ
| |-- Adobe-Japan1-90pv-RKSJ
| |-- Adobe-Japan1-H-CID
| |-- Adobe-Japan1-H-Host
| |-- Adobe-Japan1-H-Mac
| |-- Adobe-Japan1-PS-H
| |-- Adobe-Japan1-PS-V
| |-- Adobe-Japan1-UCS2
| |-- EUC-H
| |-- EUC-V
| |-- Ext-H
| |-- Ext-RKSJ-H
| |-- Ext-RKSJ-V
| |-- Ext-V
| |-- H
| |-- Hankaku
| |-- Hiragana
| |-- Hojo-EUC-H
| |-- Hojo-EUC-V
| |-- Hojo-H
| |-- Hojo-V
| |-- Katakana
| |-- NWP-H
| |-- NWP-V
| |-- RKSJ-H
| |-- RKSJ-V
| |-- Roman
| |-- UCS2-90ms-RKSJ
| |-- UCS2-90pv-RKSJ
| |-- UniHojo-UCS2-H
| |-- UniHojo-UCS2-V
| |-- UniHojo-UTF16-H
| |-- UniHojo-UTF16-V
| |-- UniHojo-UTF32-H
| |-- UniHojo-UTF32-V
| |-- UniHojo-UTF8-H
| |-- UniHojo-UTF8-V
| |-- UniJIS-UCS2-H
| |-- UniJIS-UCS2-HW-H
| |-- UniJIS-UCS2-HW-V
| |-- UniJIS-UCS2-V
| |-- UniJIS-UTF16-H
| |-- UniJIS-UTF16-V
| |-- UniJIS-UTF32-H
| |-- UniJIS-UTF32-V
| |-- UniJIS-UTF8-H
| |-- UniJIS-UTF8-V
| |-- UniJIS2004-UTF16-H
| |-- UniJIS2004-UTF16-V
| |-- UniJIS2004-UTF32-H
| |-- UniJIS2004-UTF32-V
| |-- UniJIS2004-UTF8-H
| |-- UniJIS2004-UTF8-V
| |-- UniJISPro-UCS2-HW-V
| |-- UniJISPro-UCS2-V
| |-- UniJISPro-UTF8-V
| |-- UniJISX0213-UTF32-H
| |-- UniJISX0213-UTF32-V
| |-- UniJISX02132004-UTF32-H
| |-- UniJISX02132004-UTF32-V
| |-- V
| `-- WP-Symbol
|-- Adobe-Japan2
| `-- Adobe-Japan2-0
|-- Adobe-KR
| |-- Adobe-KR-0
| |-- Adobe-KR-1
| |-- Adobe-KR-2
| |-- Adobe-KR-3
| |-- Adobe-KR-4
| |-- Adobe-KR-5
| |-- Adobe-KR-6
| |-- Adobe-KR-7
| |-- Adobe-KR-8
| |-- Adobe-KR-9
| |-- Adobe-KR-UCS2
| |-- UniAKR-UTF16-H
| |-- UniAKR-UTF32-H
| `-- UniAKR-UTF8-H
`-- Adobe-Korea1
|-- Adobe-Korea1-0
|-- Adobe-Korea1-1
|-- Adobe-Korea1-2
|-- Adobe-Korea1-H-CID
|-- Adobe-Korea1-H-Host
|-- Adobe-Korea1-H-Mac
|-- Adobe-Korea1-KSCms-UHC
|-- Adobe-Korea1-KSCpc-EUC
|-- Adobe-Korea1-UCS2
|-- KSC-EUC-H
|-- KSC-EUC-V
|-- KSC-H
|-- KSC-Johab-H
|-- KSC-Johab-V
|-- KSC-V
|-- KSCms-UHC-H
|-- KSCms-UHC-HW-H
|-- KSCms-UHC-HW-V
|-- KSCms-UHC-UCS2
|-- KSCms-UHC-V
|-- KSCpc-EUC-H
|-- KSCpc-EUC-UCS2
|-- KSCpc-EUC-UCS2C
|-- KSCpc-EUC-V
|-- UCS2-KSCms-UHC
|-- UCS2-KSCpc-EUC
|-- UniKS-UCS2-H
|-- UniKS-UCS2-V
|-- UniKS-UTF16-H
|-- UniKS-UTF16-V
|-- UniKS-UTF32-H
|-- UniKS-UTF32-V
|-- UniKS-UTF8-H
`-- UniKS-UTF8-V可以检查一下该路径是否存在。
BTW, 我基于 scoop 安装的 C:\Users\Kasmir\scoop\shims\pdftocairo.exe 不能正确处理中文,我猜是我安装的版本不是很对...
pdftocairo.exe --help
pdftocairo version 25.12.0
Copyright 2005-2025 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011, 2022 Glyph & Cog, LLC针对上面对于\multirow的数字不好确定的情况,这是该方法的缺陷:
\documentclass[fontset=fandol]{ctexart}
\usepackage{array}
\usepackage{multirow}
\usepackage{amsmath,amsfonts}
\usepackage{makecell}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\textbf{条件} & \textbf{方程} & \textbf{说明} \\ \hline
\multirow{2}{*}{圆心在原点} & $x^2+y^2=r^2$ & $a=b=0$ \\ \cline{2-3}
& $x^2+y^2+F=0$ & $D=E=0$ \\ \hline
\multirow{3}{*}{圆与$x,y$轴都相切} & \makecell{$(x-a)^2+(y-b)^2=a^2$\\$(|a|=|b|\neq 0)$} & $|a|=|b|=r$ \\ \cline{2-3}
& \makecell{$x^2+y^2+Dx+Ey+F=0$\\$(|D|=|E|\neq 0)$} & $D^2=E^2=4F$ \\ \hline
\multirow{3}{*}{圆与$x,y$轴都相切} & \makecell{$\dfrac{1}{2}(x-a)^2+(y-b)^2=a^2$\\$(|a|=|b|\neq \dfrac{1}{2})$} & $|a|=|b|=r$ \\ \cline{2-3}
& \makecell{$x^2+y^2+\dfrac{4}{5}Dx+Ey+F=0$\\$(|D|=|E|\neq 0)$} & $D^2=E^2=F$ \\ \hline
\multirow{6.5}{*}{圆与$x,y$轴都相切} & \makecell{$\dfrac{1}{2}(x-a)^2+(y-b)^2=a^2$\\$(|a|=|b|\neq \dfrac{1}{2})$} & $|a|=|b|=r$ \\ \cline{2-3}
& \makecell{$x^2+y^2+\dfrac{4}{5}Dx+Ey+F=0$\\$(|D|=|E|\neq 0)$} &\includegraphics[width=4cm,height=3.25cm,valign=m]{example-image-duck}\\\hline
\end{tabular}
\end{document}
几个建议:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{latex}{
name={LaTeX},
description={A document preparation system}
}
\begin{document}
This document is written using \gls{latex}.
\printglossaries
\end{document}要正确编译上面的文档,有两种方案:
pdflatex main
makeglossaries main
pdflatex mainlatexmk,但也不能太直接一步到位,参考这个链接:在codex老师的帮助下,我发现我在windows下需要微调一下.latexmkrc:
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
sub run_makeglossaries {
my ($base_name, $path) = fileparse( $_[0] ); #handle -outdir param by splitting path and file, ...
pushd $path; # ... cd-ing into folder first, then running makeglossaries ...
if ( $silent ) {
# system "makeglossaries -q '$base_name'"; #unix
system "makeglossaries", "-q", "$base_name"; #windows
}
else {
# system "makeglossaries '$base_name'"; #unix
system "makeglossaries", "$base_name"; #windows
};
popd; # ... and cd-ing back again
}再用
latexmk -pdf main
现在要做的,就是如何把上述配置移植到 sublime 风格的配置文件上,让他实际上做和上面命令行完全相同的事。
有类似原理支持相关功能的 hwemoji 宏包,担任让不支持与ctex共同使用。
\documentclass{article}
% \usepackage{ctex}
\usepackage{hwemoji}
\begin{document}
\texttt{pdflatex-friendly}
%中文 + emoji ?
✏ 🆔 🍄 😀 😁
\end{document}

哎哎... CJK的内部实现想必修改了某些映射...不过为什么pdftex-only呢....2026年了,pdflatex+CJK也许已经不是主流,除非是在维护某些旧文档...
应但是bug...
理论上lang=cn与lang=it都应该覆盖\bibname,不应该出现这种行为的不一致性。
在 elegantbook.cls 中,语言分支的代码结构如下:
cn 分支(第 192-219 行 + 第 409-453 行):
% 第 194 行:加载 ctex 处理中文排版
\RequirePackage[UTF8, scheme=plain, fontset=none]{ctex}
% 第 418 行:手动重定义 \bibname
\renewcommand{\bibname}{参考文献}cn 分支没有加载 babel,也没有做任何与 biblatex 语言字符串相关的设置。
it 分支(第 492-526 行):
% 第 494 行:加载 babel 意大利语
\RequirePackage[italian]{babel}it 分支甚至没有手动写 \renewcommand{\bibname}{...},但 \printbibliography 的标题却是正确的意大利语。
% 第 403-407 行:biblatex 在语言分支之前加载
\RequirePackage[
backend=\ELEGANT@bibend,
citestyle=\ELEGANT@citestyle,
bibstyle=\ELEGANT@bibstyle]{biblatex}加载顺序为:
ctex 或 babel(语言分支,第 192 行起)biblatex(第 407 行)\renewcommand 覆盖(第 409 行起)biblatex 有两套并行的标题系统:
| 系统 | 机制 | 命令 |
|---|---|---|
| LaTeX 标题宏 | \bibname / \refname | 由 \renewcommand 修改 |
| biblatex 本地化字符串 | bibliography / references | 由 .lbx 文件或 \DeclareBibliographyStrings 定义 |
关键点:\printbibliography 的默认标题不是直接读取 \bibname,而是读取 biblatex 自己的本地化字符串 bibliography。biblatex 在初始化和 \begin{document} 时刻会用自己的字符串系统同步覆盖 \bibname。
lang=it 的完整链路:
elegantbook.cls 第 494 行:
\RequirePackage[italian]{babel}
↓
babel 将文档主语言注册为 italian
↓
biblatex 检测到 babel 语言为 italian
↓
自动加载 italian.lbx
(路径:texmf-dist/tex/latex/biblatex/lbx/italian.lbx)
↓
italian.lbx 第 90 行定义:
bibliography = {{Bibliografia}{Bibliografia}}
↓
\begin{document} 时,biblatex 用 italian.lbx 的字符串初始化
↓
\printbibliography 标题 → Bibliografia ✓lang=cn 的完整链路:
elegantbook.cls 第 194 行:
\RequirePackage[...]{ctex}
↓
ctex 只处理中文排版(字体、断行等),不注册 babel 语言
↓
biblatex 检测不到中文语言环境
↓
且 biblatex 标准发行版中没有 chinese.lbx
↓
biblatex 回退到默认语言 → english
↓
english.lbx 定义:
bibliography = {{Bibliography}{Bibliography}}
↓
elegantbook.cls 第 418 行:
\renewcommand{\bibname}{参考文献}
← 此时 \bibname 暂时被改为"参考文献"
↓
\begin{document} 时,biblatex 用 english.lbx 的字符串
重新初始化,\bibname 被覆盖回 "Bibliography"
↓
\printbibliography 标题 → Bibliography ✗用户提到的两种绕过方式:
% 方式一:延迟到 \begin{document} 之后覆盖
\AtBeginDocument{%
\renewcommand{\bibname}{参考文献}
}有效原因:\AtBeginDocument 在 biblatex 的 \begin{document} 初始化之后执行,所以覆盖不会被 biblatex 再冲掉。
% 方式二:直接指定标题
\printbibliography[title={参考文献}]有效原因:title= 参数直接覆盖了 biblatex 的默认标题逻辑,绕过了整个字符串系统。
| lang=it | lang=cn | |
|---|---|---|
| 语言包 | \RequirePackage[italian]{babel} | \RequirePackage[...]{ctex} |
| 是否注册 babel 语言 | 是 | 否 |
| biblatex 识别的语言 | italian | english(回退默认) |
| biblatex 加载的 .lbx | italian.lbx | english.lbx |
| bibliography 字符串 | Bibliografia | Bibliography |
\renewcommand{\bibname} 是否生效 | 不需要(.lbx 已处理) | 写了但被 biblatex 覆盖 |
一句话总结:lang=it 之所以正常,是因为 \RequirePackage[italian]{babel} 触发了 biblatex 自身的本地化机制(加载 italian.lbx),biblatex 从自己的字符串系统中获得了正确的意大利语标题。而 lang=cn 只是通过 \renewcommand{\bibname}{参考文献} 修改了 LaTeX 层面的标题宏,并没有对接 biblatex 的本地化字符串系统;biblatex 在 \begin{document} 时仍按默认的 english.lbx 重新初始化 \bibname,导致中文设置被覆盖。
这本质上是 elegantbook.cls 的 lang=cn 分支只做了一半的工作:改了 LaTeX caption macro,但遗漏了 biblatex 的 DeclareBibliographyStrings 接口。
在 elegantbook.cls 的 lang=cn 分支中,用 \DefineBibliographyStrings 接入 biblatex 的本地化字符串系统。由于 cn 分支没有注册 babel 语言,biblatex 实际加载的是 english.lbx,所以需要覆盖 english 语言的字符串。
elegantbook.cls 第 418-419 行之后(\bibname 和 \ebibname 定义之后),添加:
\ifdefstring{\ELEGANT@lang}{cn}{
\renewcommand{\baselinestretch}{1.3}
\renewcommand{\contentsname}{目录}
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
\renewcommand{\partname}{\color{structurecolor}}
\renewcommand{\thepart}{第\zhnumber{\arabic{part}}部分}
\renewcommand{\listfigurename}{插图目录}
\renewcommand{\listtablename}{表格目录}
\renewcommand{\bibname}{参考文献}
\newcommand{\ebibname}{参考文献}
% >>> 新增:接入 biblatex 本地化字符串系统 >>>
\DefineBibliographyStrings{english}{
bibliography = {参考文献},
references = {参考文献},
}
% <<< 新增结束 <<<
\renewcommand{\appendixname}{附录}
% ... 后续不变 ...
}{\relax}\documentclass[
lang=cn,fontset=fandol,
]{elegantbook}
\geometry{paperheight=8cm}
\addbibresource{xampl.bib}
\begin{document}
\chapter{第一章}
Hello\cite{article-minimal} World! 中文!
\printbibliography
\end{document}
问 在 tikz 绘制的一个图中,如何让所有的两两相交的曲线在交点处不重合