From b0552bf2405ae220c448986eb8166737bf35e29d Mon Sep 17 00:00:00 2001 From: szdytom Date: Fri, 28 Apr 2023 16:58:24 +0800 Subject: [PATCH] =?UTF-8?q?Q6=20=E8=A7=A3=E7=AD=94A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/p5-explain-bad.txt | 2 +- assets/p5-explain-ok.txt | 2 +- assets/p5-intersect.svg | 10 +- assets/p5-intersect.txt | 4 +- assets/p7-pentagon.svg | 13 +++ assets/p7-pentagon.txt | 22 +++++ assets/p7-solA-hexagon.svg | 39 ++++++++ assets/p7-solA-hexagon.txt | 44 +++++++++ assets/p7-solA-hexagon2.svg | 44 +++++++++ assets/p7-solA-hexagon2.txt | 49 ++++++++++ assets/p7-square.svg | 11 +++ assets/p7-square.txt | 19 ++++ assets/p7-triangle.svg | 9 ++ assets/p7-triangle.txt | 18 ++++ lib.typ | 17 ++-- main.typ | 120 +++++++++++++++++++++-- scripts/diagram.svg | 14 --- scripts/g2s.cpp | 184 +++++++++++++++++++++++++++++------- template.typ | 40 ++++---- 19 files changed, 565 insertions(+), 96 deletions(-) create mode 100644 assets/p7-pentagon.svg create mode 100644 assets/p7-pentagon.txt create mode 100644 assets/p7-solA-hexagon.svg create mode 100644 assets/p7-solA-hexagon.txt create mode 100644 assets/p7-solA-hexagon2.svg create mode 100644 assets/p7-solA-hexagon2.txt create mode 100644 assets/p7-square.svg create mode 100644 assets/p7-square.txt create mode 100644 assets/p7-triangle.svg create mode 100644 assets/p7-triangle.txt delete mode 100644 scripts/diagram.svg diff --git a/assets/p5-explain-bad.txt b/assets/p5-explain-bad.txt index 0746bd6..33226a5 100644 --- a/assets/p5-explain-bad.txt +++ b/assets/p5-explain-bad.txt @@ -5,7 +5,7 @@ BorderColor="#616161" ColorMap:r="#FF7043" ColorMap:b="#29B6F6" Xaxis="right" -Yaxis="Down" +Yaxis="down" --- 6 1 -1 b diff --git a/assets/p5-explain-ok.txt b/assets/p5-explain-ok.txt index ecb16c1..f030174 100644 --- a/assets/p5-explain-ok.txt +++ b/assets/p5-explain-ok.txt @@ -5,7 +5,7 @@ BorderColor="#616161" ColorMap:r="#FF7043" ColorMap:b="#29B6F6" Xaxis="right" -Yaxis="Down" +Yaxis="down" --- 6 1 -1 b diff --git a/assets/p5-intersect.svg b/assets/p5-intersect.svg index 68a6538..36bb642 100644 --- a/assets/p5-intersect.svg +++ b/assets/p5-intersect.svg @@ -8,9 +8,9 @@ -A -B -C -D -E +A +B +C +D +E diff --git a/assets/p5-intersect.txt b/assets/p5-intersect.txt index 6ac43f4..6a9301c 100644 --- a/assets/p5-intersect.txt +++ b/assets/p5-intersect.txt @@ -6,9 +6,9 @@ ColorMap:r="#FF7043" ColorMap:b="#29B6F6" ColorMap:g="#212121" FontColor="white" -FontFamily="Ubuntu Mono" +FontFamily="Atkinson Hyperlegible" Xaxis="right" -Yaxis="Down" +Yaxis="down" Label="A" --- 5 diff --git a/assets/p7-pentagon.svg b/assets/p7-pentagon.svg new file mode 100644 index 0000000..5a8491f --- /dev/null +++ b/assets/p7-pentagon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/p7-pentagon.txt b/assets/p7-pentagon.txt new file mode 100644 index 0000000..102acdd --- /dev/null +++ b/assets/p7-pentagon.txt @@ -0,0 +1,22 @@ +OutputFile="p7-pentagon.svg" +R=.151515 +Thickness=.0151515 +BorderColor="#616161" +ColorMap:b="#29B6F6" +Xaxis="right" +Yaxis="up" +OutputShape="square" +--- +5 +1 1 b +2 1 b +2.309017 1.95105652 b +1.5 2.53884177 b +0.690983 1.95105652 b + +5 +1 2 +2 3 +3 4 +4 5 +5 1 \ No newline at end of file diff --git a/assets/p7-solA-hexagon.svg b/assets/p7-solA-hexagon.svg new file mode 100644 index 0000000..3120320 --- /dev/null +++ b/assets/p7-solA-hexagon.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +2 +3 +4 +5 +6 +1 +2 +3 +4 +5 +6 + diff --git a/assets/p7-solA-hexagon.txt b/assets/p7-solA-hexagon.txt new file mode 100644 index 0000000..7260223 --- /dev/null +++ b/assets/p7-solA-hexagon.txt @@ -0,0 +1,44 @@ +OutputFile="p7-solA-hexagon.svg" +R=.18333333 +Thickness=.01833333 +BorderColor="#616161" +ColorMap:r="#FF7043" +ColorMap:b="#29B6F6" +Xaxis="right" +Yaxis="up" +Label="1" +LabelMap:7="1" +LabelMap:8="2" +LabelMap:9="3" +LabelMap:10="4" +LabelMap:11="5" +LabelMap:12="6" +OutputShape="square" +--- +12 +1 1 b +2 1 b +2.5 1.866025 b +2 2.73205 b +1 2.7320508 b +.5 1.866025 b +1 2 r +1.1339746 1.5 r +1.6339746 1.366025 r +2 1.7320508 r +1.8660254 2.2320508 r +1.3660254 2.3660254 r + +12 +1 2 +2 3 +3 4 +4 5 +5 6 +1 6 +7 8 +8 9 +9 10 +10 11 +11 12 +12 7 diff --git a/assets/p7-solA-hexagon2.svg b/assets/p7-solA-hexagon2.svg new file mode 100644 index 0000000..b99f9f3 --- /dev/null +++ b/assets/p7-solA-hexagon2.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +2 +3 +4 +5 +6 +1 +2 +3 +4 +5 +6 + diff --git a/assets/p7-solA-hexagon2.txt b/assets/p7-solA-hexagon2.txt new file mode 100644 index 0000000..d8c0526 --- /dev/null +++ b/assets/p7-solA-hexagon2.txt @@ -0,0 +1,49 @@ +OutputFile="p7-solA-hexagon2.svg" +R=.1 +Thickness=.01833333 +BorderColor="#616161" +ColorMap:r="#FF7043" +ColorMap:b="#29B6F6" +Xaxis="right" +Yaxis="up" +Label="1" +LabelMap:7="1" +LabelMap:8="2" +LabelMap:9="3" +LabelMap:10="4" +LabelMap:11="5" +LabelMap:12="6" +OutputShape="square" +--- +12 +1 1 b +2 1 b +2.5 1.866025 b +2 2.73205 b +1 2.7320508 b +.5 1.866025 b +1 2 r +1.1339746 1.5 r +1.6339746 1.366025 r +2 1.7320508 r +1.8660254 2.2320508 r +1.3660254 2.3660254 r + +17 +1 2 +2 3 +3 4 +4 5 +5 6 +1 6 +7 8 +8 9 +9 10 +10 11 +11 12 +12 7 +1 7 +2 8 +3 9 +1 8 +2 9 \ No newline at end of file diff --git a/assets/p7-square.svg b/assets/p7-square.svg new file mode 100644 index 0000000..0eb5de1 --- /dev/null +++ b/assets/p7-square.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/p7-square.txt b/assets/p7-square.txt new file mode 100644 index 0000000..be12d40 --- /dev/null +++ b/assets/p7-square.txt @@ -0,0 +1,19 @@ +OutputFile="p7-squre.svg" +R=.1 +Thickness=.01 +BorderColor="#616161" +ColorMap:b="#29B6F6" +Xaxis="right" +Yaxis="up" +--- +4 +0 0 b +1 0 b +1 1 b +0 1 b + +4 +1 2 +2 3 +3 4 +4 1 \ No newline at end of file diff --git a/assets/p7-triangle.svg b/assets/p7-triangle.svg new file mode 100644 index 0000000..ce43e89 --- /dev/null +++ b/assets/p7-triangle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/p7-triangle.txt b/assets/p7-triangle.txt new file mode 100644 index 0000000..9d28529 --- /dev/null +++ b/assets/p7-triangle.txt @@ -0,0 +1,18 @@ +OutputFile="p7-triangle.svg" +R=.1 +Thickness=.01 +BorderColor="#616161" +ColorMap:b="#29B6F6" +Xaxis="right" +Yaxis="up" +OutputShape="square" +--- +3 +0 0 b +1 0 b +.5 .8660254038 b + +3 +1 2 +2 3 +3 1 \ No newline at end of file diff --git a/lib.typ b/lib.typ index f7da86d..fa58c1b 100644 --- a/lib.typ +++ b/lib.typ @@ -1,18 +1,14 @@ #import "template.typ": * #let pagebreak_until_odd() = { + // TODO: Issue #939 (https://github.com/typst/typst/issues/939) pagebreak() - locate(loc => if calc.even(thispage_number(loc)) { - skip_footer.update(true) - pagebreak() - skip_footer.update(false) - }) } #let italic(body) = text(style: "italic", body) -#let type_icon(name, color) = square(size: 45pt, fill: rgb(color))[ - #set text(22pt, white, font: "Arial", weight: "regular") +#let type_icon(name, color) = square(size: 40pt, fill: rgb(color))[ + #set text(20pt, white, font: labelfont, weight: "regular") #set align(center + horizon) #name ] @@ -26,7 +22,7 @@ #let bf(x) = {$upright(bold(#x))$} -#let hypergeometric-func(ax, bx, x) = {$upright(F)lr((mat(delim: #none, ax;bx)#h(5pt)#line(angle: 90deg, length: 40pt)#h(5pt)#x))$} +#let hypergeometric-func(ax, bx, x) = {$upright(F)lr((lr(mat(delim: #none, ax;bx)|)#x))$} #let transpose = {$upright(sans(T))$} @@ -45,4 +41,7 @@ body } -#let inprod(a,b) = {$angle.l #a,#b angle.r$} \ No newline at end of file +#let inprod(a,b) = {$angle.l #a,#b angle.r$} +#let trig = sym.triangle.stroked.t + +#let mtext(body) = text(font: cnmainfont, weight: "regular", body) \ No newline at end of file diff --git a/main.typ b/main.typ index 871dc6c..e5e1a20 100644 --- a/main.typ +++ b/main.typ @@ -45,22 +45,21 @@ block(width: 100%)[ } ) ) - #set text(weight: "light", font: cnfont) + #set text(font: cnfont) #block[ - #set text(2em) + #set text(weight: "extralight", 40pt) \##problem_id.display("1") ] - #block(fill: rgb("B3E5FC"))[ - #set text(1.5em) - #h(.3em) + #block(stroke: (bottom: 15pt + rgb("B3E5FC"),), inset: -2pt)[ + #set text(weight: "light", 30pt) + #h(10pt) #it.body ] - #v(25pt) + #v(20pt) ]} - - #pagebreak_until_odd() +#[] #problem_type.update((combinatorics_icon,)) = 随机游走的左端点 @@ -507,7 +506,7 @@ $ 2>=bf(E)(abs(X))=sum_(v in V)bf(P)(v in X)=sum_(v in V)1/(n-dd(v))>=n/(n-2m sl 红蓝各 1 个点的情况的情况是平凡的,下面均假设 $n>=2$。 -(反证法)假设不存在一种合法的配对方案。从全部配对可能的方案中选出连接的线段长度之和最短的一种方案之一,根据反证假设一定存在两条线段相交。如图,设相交的两条线段的红色端点分别为点 $A$ 和点 $B$,蓝色端点分别为点 $C$ 和点 $D$,$A$ 和 $C$ 配对,$B$ 和 $D$ 配对,$A C$ 和 $B D$ 的交点为 $E$。 +(反证法,无穷递降法)假设不存在一种合法的配对方案。从全部配对可能的方案中选出连接的线段长度之和最短的一种方案之一,根据反证假设一定存在两条线段相交。如图,设相交的两条线段的红色端点分别为点 $A$ 和点 $B$,蓝色端点分别为点 $C$ 和点 $D$,$A$ 和 $C$ 配对,$B$ 和 $D$ 配对,$A C$ 和 $B D$ 的交点为 $E$。 #figure(image( "./assets/p5-intersect.svg", @@ -607,3 +606,106 @@ $ dim bb(Z)_8^2=dimrange A^transpose+dimnull A^transpose $ $ 3=dimrange B<=dimrange A^transpose<=2 $ 这给出了 $3<=2$ 这样的错误的结果,故假设不成立,原命题得证。 + +#pagebreak_until_odd() +#problem_type.update((geometry_icon,number_thoery_icon,algebra_icon)) += 格点正多边形 + +求证:如果一个正多边形的每个顶点的横纵坐标均为整数,那么它一定是一个正方形。 + +== 提示 + +每个顶点的横纵坐标均为整数的多边形常常被称为“格点多边形”。 + +这里所说的正 $k(k>=3)$ 边形是指一个有恰好 $k$ 条边(以及 $k$ 个顶点)的凸多边形,使得每一条边的长度都相等。一般而言,我们把正三边形叫做“等边三角形”,把正四边形叫做“正方形”。 + +#align(center, + stack(dir: ltr, + figure(image( + "./assets/p7-triangle.svg", + width: 30%, + ), caption: [等边三角形]), + figure(image( + "./assets/p7-square.svg", + width: 30% + ), caption: [正方形]), + figure(image( + "./assets/p7-pentagon.svg", + width: 30% + ), caption: [正五边形]) + ) +) + +事实上,题目中的整数也可以换成有理数,因为一个每个顶点的横纵坐标均为有理数的图形只要恰当放大一个比例就一定可以得到一个每个顶点的横纵坐标均为整数的图形。 + +显然存在许多正方形,满足每个顶点的横纵坐标均为整数。 + +#pagebreak() +== 解答 A + +我们将给出两种不同的解答,在这个解答里,我们会使用“无穷递降法”来说明这个问题。 + +下面首先分类讨论对于等边三角形的情况,不妨设等边三角形的三个顶点分别为 $A(0,0)$、$B(b_1,b_2)$ 和 $C(c_1,c_2)$。于是根据勾股定理,有 + +$ cases(b_1^2+b_2^2=c_1^2+c_2^2,b_1^2+b_2^2=(c_1-b_1)^2+(c_2-b_2)^2) $ + +把 $b_1$ 和 $b_2$ 看做常数,$c_1$ 和 $c_2$ 看做未知数,这组方程解得 + +$ cases(c_1=1/2 (b_1 - sqrt(3) b_2),c_2=1/2 (sqrt(3) b_1+b_2)) #tab #mtext("或") #tab cases(c_1=1/2 (b_1 + sqrt(3) b_2),c_2=1/2 (-sqrt(3) b_1+b_2)) $ + +由于 $sqrt(3)$ 是无理数,当 $b_1$ 和 $b_2$ 均为整数时,$c_1$ 和 $c_2$ 必定都是无理数,也即不是整数。因此,每个顶点的横纵坐标均为整数的等边三角形不存在。 + +在说明一般情况之前,我们首先要引入如下引理: + +*引理* 一个横纵坐标均为整数的点绕着另一个横纵坐标均为整数的点旋转 $90 degree$ 后得到的点仍然是一个横纵坐标均为整数的点。 + +算出旋转后的点的坐标即可,读者自行验证该引理。 + +下面说明一般情况,(反证法,无穷递降法)假设存在格点正 $k(k>=5)$ 边形。从所有的格点正 $k$ 边形中找出面积最小的一个,设它的顶点按逆时针顺序依次为 $P_1,dots,P_k$。对于每个顶点 $P_i$,把它绕点 $P_(i-1)$(特别地,点 $P_1$ 绕点 $P_k$)逆时针旋转 $90 deg$,得到点 $Q_i$(如图 @P7fig1)。 + +#align(center, stack(dir: ltr, spacing: 5%, + [#figure(image( + "./assets/p7-solA-hexagon.svg", + width: 40%, + ), caption: [旋转后的得到的点]) ], + + [#figure(image( + "./assets/p7-solA-hexagon2.svg", + width: 40%, + ), caption: [连接辅助线]) ] +)) + +下面我们证明 $Q_1 dots.c Q_k $ 也是一个正 $k$ 边形(为了方便描述,我们给出 $Q_1 Q_2=Q_2 Q_3$ 的证明,其它的边之间的相等关系是同理可证的)。如图 @P7fig2,连接 $P_1 Q_1$、$P_1 Q_2$、$P_2 Q_2$、$P_2 Q_3$ 以及 $P_3 Q_3$ 五条线段。由于正多边的每个内角和每条边都相等,在 $trig P_1 P_2 Q_2$ 和 $trig P_2 P_3 Q_3$ 中,我们有 + +$ cases(P_1 P_2=P_2 P_3,angle P_1 P_2 Q_2=angle P_2 P_3 Q_3,P_2 Q_2=P_3 Q_3) $ + +所以 $trig P_1 P_2 Q_2 tilde.eqq trig P_2 P_3 Q_3$(SAS),于是 $P_1 Q_2=P_2 Q_3$ 以及 $angle Q_2 P_1 Q_1=angle Q_3 P_2 Q_2$。类似的,在 $trig Q_2 P_1 Q_1$ 和 $trig Q_3 P_2 Q_2$ 中, + +$ cases(P_1 Q_2=P_2 Q_3,angle Q_2 P_1 Q_1=angle Q_3 P_2 Q_2,P_1 Q_1=P_2 Q_2) $ + +所以 $trig Q_2 P_1 Q_1 tilde.eqq trig Q_3 P_2 Q_2$(SAS),这说明 $Q_1 Q_2=Q_2 Q_3$,于是 $Q_1 dots.c Q_k$ 也是一个正 $k$ 边形。因为 $k>=5$,正 $k$ 边形的每个内角均大于 $90 degree$,故点 $Q_1,dots,Q_k$ 均在多边形 $P_1 dots.c P_k$ 的内部,即多边形 $Q_1 dots.c Q_k$ 的面积小于多边形 $P_1 dots.c P_k$ 的面积,矛盾,故假设不成立。 + +综上所述,不存在格点等边三角形,也不存在格点正 $k$ 边形(其中 $k>=5$),故只可能存在格点正方形,原命题得证。 + +== 解答 B + +设格点三角形的三个顶点分别为 $A(0,0)$、$B(b_1,b_2)$ 和 $C(c_1,c_2)$。通过平行四边形割补,不难得出 $trig A B C$ 的面积 + +#[ +#show: math_numbering +$ S_(trig A B C)=1/2 abs(b_1 c_2 - b_2 c_1) $ +] + +是一个有理数,而任意格点多边形都可以划分为若干个不相交的格点三角形。于是我们得出了这样一个引理:任意一个格点多边形的面积均为有理数。 + +另一方面,我们知道正多边形的面积公式是 + +$ S=(k a^2)/(4 tan pi/k) $ + +其中 $k$ 表示该正多边形的边数,$a$ 表示正多边形的边长。若该正多边形至少有一条边的两个端点的横纵坐标均为整数,则 $a^2$ 一定是一个有理数,故正多边形的面积 $S$ 是有理数当且仅当 $tan pi/k$ 是有理数。 + +另一方面,由@P7solBeq1 我们知道,一个格点多边形的面积一定是一个有理数,因此我们只需说明“对于任意整数 $k>=3$,只有当 $k=4$ 时 $tan pi/k$ 才是有理数”,即可完成对原命题的论证。下面给出两个证明,其中第二个证明需要较多的代数知识。 + +=== 证明 a + +// TODO \ No newline at end of file diff --git a/scripts/diagram.svg b/scripts/diagram.svg deleted file mode 100644 index dc42e06..0000000 --- a/scripts/diagram.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Height -Height -Height -Height -Without family -With non-existing family -Time - -Curve - diff --git a/scripts/g2s.cpp b/scripts/g2s.cpp index 62bfed8..8d59de0 100644 --- a/scripts/g2s.cpp +++ b/scripts/g2s.cpp @@ -4,31 +4,125 @@ using namespace std; +float XL=0.1; +float XR=0.1; +float YL=0.1; +float YR=0.1; +float vertex_R=.1; +float border_width=.01; +float output_scale = 100; +string border_color="#616161"; +string label = "none"; +string font_family = "Atkinson Hyperlegible"; +string font_color = "white"; +string Xdir="right"; +string Ydir="down"; +string output_file="g2s_output.svg"; +string output_shape="default"; +map mp; + +const map float_map{ + {"OutputScale",&output_scale}, //输出比例 + {"XL",&XL}, //左边框留白比例 + {"XR",&XR}, //右边框留白比例 + {"YL",&YL}, //上边框留白比例 + {"YR",&YR}, //下边框留白比例 + {"R",&vertex_R}, //点的半径 + {"Thickness",&border_width} //点的边框粗细 +}; +const map string_map{ + {"BorderColor",&border_color}, //点的边框和边的颜色 + {"Label",&label}, // 标签格式 + {"FontFamily",&font_family}, // 标签字体 + {"FontColor",&font_color}, // 标签颜色 + {"Xaxis",&Xdir}, //x轴正方向 + {"Yaxis",&Ydir}, //y轴正方向 + {"OutputFile",&output_file}, //输出文件名 + {"OutputShape",&output_shape} //输出形状 +}; +const map> string_configuration{ + {"Label",{"a","A","1","none"}}, + {"Xaxis",{"left","right"}}, + {"Yaxis",{"up","down"}}, + {"OutputShape",{"default","square"}} +}; +//ColorMap: 颜色映射表 + +void getstring(string &s) +{ + getchar(); + s.clear(); + char ch=getchar(); + while(ch!='\"') s+=ch,ch=getchar(); +} + +void init() +{ + for(int line=1;;line++) + { + char ch=getchar(); + while(ch!='-'&&!isalpha(ch)) ch=getchar(); + if(ch=='-') + { + while(ch=='-') ch=getchar(); + break; + } + string s; + while(isalpha(ch)) s+=ch,ch=getchar(); + + if(float_map.find(s)!=float_map.end()) cin>>*(float_map.at(s)); + else if(string_map.find(s)!=string_map.end()) + { + getstring(*(string_map.at(s))); + if(string_configuration.find(s)!=string_configuration.end()) + { + bool bel=0; + auto vec=string_configuration.at(s); + s=*string_map.at(s); + for(string t:vec) bel|=(s==t); + if(!bel) + { + fprintf(stderr,R"(Error: Line %d. +Expected = "%s")",line,vec[0].c_str()); + for(size_t i=1;i+11) + fprintf(stderr,R"( or "%s")",vec.back().c_str()); + fprintf(stderr,".\n"); + fprintf(stderr,R"(found = "%s".)",s.c_str()); + abort(); + } + } + } + else if(s=="ColorMap") + { + s.clear(); + ch=getchar(); + while(ch!='=') s+=ch,ch=getchar(); + getstring(mp[s]); + } + else if(s=="LabelMap") + { + // TODO + } else { + fprintf(stderr,R"(Error: Line %d. "%s" is not a valid option.)",line,s.c_str()); + abort(); + } + } +} + struct vec { float x,y; - void operator += (const vec &a) {x+=a.x,y+=a.y;} - void operator -= (const vec &a) {x-=a.x,y-=a.y;} + void operator += (vec a) {x+=a.x,y+=a.y;} + void operator -= (vec a) {x-=a.x,y-=a.y;} void operator *= (float a) {x*=a,y*=a;} - vec operator + (const vec &a) const {vec b=(*this);b+=a;return b;} - vec operator - (const vec &a) const {vec b=(*this);b-=a;return b;} + vec operator + (vec a) const {vec b=(*this);b+=a;return b;} + vec operator - (vec a) const {vec b=(*this);b-=a;return b;} vec operator * (float a) const {vec b=(*this);b*=a;return b;} - float norm(){return sqrt(x*x+y*y);} + float norm() const {return sqrt(x*x+y*y);} }p[N]; -const float XL=0.1; //左边框留白比例 -const float XR=0.1; //右边框留白比例 -const float YL=0.1; //上边框留白比例 -const float YR=0.1; //下边框留白比例 -const float vertex_R=.1; //点的半径 -const float border_width=.01; //点的边框粗细 -const string border_color="#616161"; //点的边框和边的颜色 -const map mp{{"b","#29B6F6"},{"r","#FF7043"}}; //颜色映射表 -const string label = "A"; // 标签格式 -const string font_family = "Ubuntu Mono"; // 字体 -const string font_color = "white"; // 标签颜色 -const float output_scale = 100; - vec calc(vec a,vec b) { vec c=b-a; @@ -40,32 +134,47 @@ int n,m; float minX,minY,maxX,maxY; string pc[N]; -void printhelp(const char* name) +void printhelp(char* name) { printf( "g2s the 6east svg graph generator, built on %s.\n" - "Usage: %s \n" + "Usage: %s \n" ,__DATE__,name); exit(1); } int main(int argc,char** argv) { - if(argc!=3) printhelp(argv[0]); + if(argc!=2) printhelp(argv[0]); freopen(argv[1],"r",stdin); - freopen(argv[2],"w",stdout); + + init(); + freopen(output_file.c_str(),"w",stdout); + vertex_R*=output_scale; + border_width*=output_scale; + cin>>n; //输入点数(int) for(int i=1;i<=n;i++) { cin>>p[i].x>>p[i].y>>pc[i]; //输入第i个点的横坐标(float)、纵坐标(float)、半径(float)和颜色(string) + p[i].x*=output_scale,p[i].y*=output_scale; + if(Xdir=="left") p[i].x=-p[i].x; + if(Ydir=="up") p[i].y=-p[i].y; if(mp.find(pc[i])!=mp.end()) pc[i]=mp.find(pc[i])->second; + if(i==1) minX=maxX=p[i].x,minY=maxY=p[i].y; if(p[i].xmaxX) maxX=p[i].x; if(p[i].ymaxY) maxY=p[i].y; } + if(output_shape=="square") + { + float delta=((maxX-minX)-(maxY-minY))*0.5; + if(delta>0) minY-=delta,maxY+=delta; + else delta=-delta,minX-=delta,maxX+=delta; + } minX-=vertex_R,minY-=vertex_R; maxX+=vertex_R,maxY+=vertex_R; float X=minX-(maxX-minX)*XL; @@ -73,18 +182,17 @@ int main(int argc,char** argv) for(int i=1;i<=n;i++) p[i].x-=X,p[i].y-=Y; X=(maxX-X)+(maxX-minX)*XR; Y=(maxY-Y)+(maxY-minY)*YR; + printf(R"( -)", - X * output_scale, Y * output_scale, X * output_scale, Y * output_scale); + +)", X, Y, X, Y); for(int i=1;i<=n;i++) { - cout<<""< +)",pc[i].c_str(),border_width,border_color.c_str(),border_width*0.7,p[i].x,p[i].y,vertex_R); } + cin>>m; //输入边数(int) for(int i=1;i<=m;i++) { @@ -92,17 +200,23 @@ int main(int argc,char** argv) cin>>a>>b; //输入端点编号(int[1,n]) vec A=calc(p[a],p[b]); vec B=calc(p[b],p[a]); - cout<<""< +)",border_width,border_color.c_str(),border_width*0.7,A.x,A.y,B.x,B.y); } + if (label == "A" || label == "a") { for (int i = 1; i <= n; ++i) { printf(R"(%c -)", font_family.c_str(), font_color.c_str(), vertex_R * output_scale, p[i].x * output_scale, p[i].y * output_scale, i + label[0] - 1); +)", font_family.c_str(), font_color.c_str(), vertex_R, p[i].x, p[i].y, i + label[0] - 1); } } - cout<<""<%d +)", font_family.c_str(), font_color.c_str(), vertex_R, p[i].x, p[i].y, i); + } + } + puts(""); return 0; } \ No newline at end of file diff --git a/template.typ b/template.typ index f6c2ffa..9403209 100644 --- a/template.typ +++ b/template.typ @@ -1,7 +1,6 @@ #let cnfont = ("Noto Sans CJK SC", "Noto Sans SC", "Source Han Sans CN") #let cnmainfont = ("Noto Serif CJK SC", "Source Han Serif CN") - -#let mtext(body) = text(font: cnmainfont, weight: "regular", body) +#let labelfont = ("Atkinson Hyperlegible") #let tab = h(2em) #let halftab = h(1em) @@ -10,12 +9,7 @@ #let skip_footer = state("skip_footer", false) #let thispage_number(loc) = { - let numberstarter = query(, before: loc) - if numberstarter == () { - none - } else { - loc.page() - numberstarter.first().location().page() + 1 - } + counter(page).at(loc).first() } #let problem_id = counter("pid") @@ -24,9 +18,10 @@ set document(title: title) set text(font: cnmainfont, lang: "zh") set page( - width: 195mm, - height: 270mm, - margin: (top: 20mm) + // width: 195mm, + // height: 270mm, + // margin: (top: 20mm) + paper: "iso-b5" ) show par: set block(above: 1.2em, below: 1.2em) @@ -35,8 +30,10 @@ set ref(supplement: it => { if it.func() == math.equation { "式" + } else if it.func() == figure { + "" } else { - auto + "Typset Error!" } }) @@ -56,32 +53,35 @@ outline(depth: 1) [ - #counter(page).update(1) - #set page(footer: locate(loc => { if skip_footer.at(loc) { return } let thispage = thispage_number(loc) - let is_mainpart = query(, before: loc) != () - let is_mainpart = true + let is_mainpart = query(selector().before(loc), loc) != () let footer_content = if is_mainpart { [\##problem_id.at(loc).first() #footer_title.at(loc)] + } else { + none } let isleft = calc.even(thispage) set align(left) if isleft set align(right) if not isleft - if isleft { [#thispage] } - [ #halftab #underline(offset: 2pt, footer_content) #halftab ] - if not isleft { [#thispage] } + set text(font: cnmainfont) + stack(dir: if isleft { ltr } else { rtl }, + spacing: 1em, + str(thispage), + [#underline(offset: 2pt, footer_content)] + ) })) // Main body. #set par(justify: true) - #set text(15pt) + #set text(13pt) + #counter(page).update(1) #body ] } \ No newline at end of file