@@ -65,24 +65,26 @@ createApp({
6565 components : { MathBlock } ,
6666 setup ( ) {
6767 // 初始示例
68- const defaultText = `#0a 2050 年上海市普通高校冬季招生统一文化考试
68+ const defaultText = `#font simsun
69+ #size 15px
70+
71+ #0a 2050 年上海市普通高校冬季招生统一文化考试
6972#0b 数学试卷
7073#note (考试时间 120 分钟,满分 150 分)
7174#note (试卷共 4 页,答题纸共 2 页)
7275### 一、填空题(本大题共 12 题,第 1—6 题每题 4 分,第 7—12 题每题 5 分,共 54 分)
73- 1. 欧拉公式的提出者是_________.
74- 2. 上海高中数学共有选择性必修_________册.
75- 11. 已知抛物线 $\\Gamma: y^2=2px(p>0)$,对 $\\Gamma$ 上的任意一点 $P$,在 $\\Gamma$ 上均存在两点 $A,B$(与 $P$ 不重合),使得 $\\triangle ABP$ 为等边三角形,则 $\\Gamma$ 离心率的取值范围为________。
76- 12. 已知 $\\vec{a}, \\vec{b}, \\vec{c}$ 为平面内的单位向量,若对任意 $\\vec{a}, \\vec{b}$,均存在 $\\vec{c}$ 使 $\\vec{a} \\cdot \\vec{c}$ 与 $\\vec{b} \\cdot \\vec{c}$ 均小于 $\\dfrac 1 2$,则 $| \\vec{a} | + | \\vec{b} |$ 的最小值为________。
77-
76+ 1. 欧拉公式的提出者是___。
77+ 2. 上海高中数学共有选择性必修___册。(精确到 0.01)
78+ 11. 已知抛物线 $\\Gamma: y^2=2px(p>0)$,对 $\\Gamma$ 上的任意一点 $P$,在 $\\Gamma$ 上均存在两点 $A,B$ (与 $P$ 不重合),使得 $\\triangle ABP$ 为等边三角形,则 $\\Gamma$ 离心率的取值范围为___。
79+ 12. 已知 $\\vec{a}, \\vec{b}, \\vec{c}$ 为平面内的单位向量,若对任意 $\\vec{a}, \\vec{b}$,均存在 $\\vec{c}$ 使 $\\vec{a} \\cdot \\vec{c}$ 与 $\\vec{b} \\cdot \\vec{c}$ 均小于 $\\dfrac 1 2$,则 $| \\vec{a} | + | \\vec{b} |$ 的最小值为___。
7880
7981### 二、选择题(本大题共 4 题,第 13、14 题每题 4 分,第 15、16 题每题 5 分,共 18 分)
80- 13. 下列关于等式 “$1+1=2$” 的说法正确的是_______.( 不定项)
82+ 13. 下列关于等式 “$1+1=2$” 的说法正确的是___。( 不定项)
8183A. 既是真命题也是数学公理;
8284B. 体现了数学公式的对称美;
8385C. 体现了数学公式的简洁性;
8486D. 运用了“等量代换”的思想。
85- 16. 给出以下两个命题,下列说法正确的是_______.
87+ 16. 给出以下两个命题,下列说法正确的是___。
8688(1)$\\left(\\sin \\dfrac \\pi 2\\right)'= \\cos \\dfrac \\pi 2$;
8789(2)$\\left(\\cos \\dfrac \\pi 2\\right)'= \\sin \\dfrac \\pi 2$。
8890A. (1) 为真命题, (2) 为真命题;
@@ -92,7 +94,7 @@ D. (1) 为假命题, (2) 为假命题。
9294
9395### 三、解答题(本大题共 5 题,第 17—19 题每题 14 分,第 20—21 题每题 18 分,共 78 分)
9496
95- 21. ( 第 1 小题满分 4 分,第 2 小题满分 6 分,第 3 小题满分 8 分)
97+ 21. ( 第 1 小题满分 4 分,第 2 小题满分 6 分,第 3 小题满分 8 分)
9698若函数 $f(x)$ 的定义域为 $D_f$,当对 $\\forall x \\in D_f$ 均有 $f(x)=f_0(x)$ 时,我们称 $f(x)$ 为 $f_0(x)$-函数。
9799(1)判断 $f(x)=\\sin x$ 是否为 $\\sin x$-函数,并说明理由;
98100(2)已知 $a \\in \\mathbb{R}$,$f(x)=a\\sqrt{1-x}$,当 $f(x)$ 为 $\\pi\\sqrt{1-x}$-函数时,求 $a$ 的值,并判断此时 $a$ 是否是有理数;
@@ -114,6 +116,12 @@ D. (1) 为假命题, (2) 为假命题。
114116 '### ' : { type : 'title3' , render : ( content ) => `<div class="third-title">${ content } </div>` } ,
115117 } ;
116118
119+ const FONT_CONFIG = {
120+ 'simsun' : { family : 'simsun' , offset : '-0.03em' , scale : '1.05em' } ,
121+ 'zhongsong' : { family : '"STZhongsong", serif' , offset : '0.045em' , scale : '1em' } ,
122+ 'shusong' : { family : '"STShusong-Z01S", serif' , offset : '0.045em' , scale : '1em' } ,
123+ }
124+
117125 // --- 解析器 (包含新 Feature) ---
118126 const parse = ( ) => {
119127 statusText . value = "解析中..." ;
@@ -124,16 +132,19 @@ D. (1) 为假命题, (2) 为假命题。
124132 let current = null ;
125133 let idSeq = 1 ;
126134 let optionBuffer = [ ] ; // 选择题缓冲区
135+ let currentFont = 'zhongsong' ; // 字体缓冲区
136+ let currentSize = '16px' ;
127137
128138 const fixFont = ( str ) => str . replace ( / \* \* ( .+ ?) \* \* / g, '<strong>$1</strong>' ) ;
129139
130140 // [新增] 专门用于将缓存的选择题推入块中
131141 const flushOptions = ( ) => {
132142 if ( optionBuffer . length > 0 ) {
133143 // 启发式测算:剥除KaTeX标识符后计算最大字符长度
134- let maxLen = Math . max ( ...optionBuffer . map ( o => o . text . length ) ) ;
144+ const getVisualLength = s => s . replace ( / \$ .* ?\$ / g, "###" ) . replace ( / < [ ^ > ] + > / g, "" ) . split ( '' ) . reduce ( ( l , c ) => l + ( c . charCodeAt ( 0 ) > 255 ? 2 : 1 ) , 0 ) ;
145+ let maxLen = Math . max ( ...optionBuffer . map ( o => getVisualLength ( o . text ) ) ) ;
135146 console . log ( optionBuffer , "选项最大长度:" , maxLen ) ;
136- let colsClass = maxLen <= 8 ? 'mcq-cols-4' : ( maxLen <= 19 ? 'mcq-cols-2' : 'mcq-cols-1' ) ;
147+ let colsClass = maxLen <= 18 ? 'mcq-cols-4' : ( maxLen <= 30 ? 'mcq-cols-2' : 'mcq-cols-1' ) ;
137148
138149 let optionsHtml = `<div class="mcq-options ${ colsClass } ">` ;
139150 optionBuffer . forEach ( opt => {
@@ -157,7 +168,6 @@ D. (1) 为假命题, (2) 为假命题。
157168 const content = fixFont ( current . rawContent ) ;
158169 const config = Object . values ( FORMAT_CONFIG ) . find ( c => c . type === current . type ) ;
159170 if ( config ) { // 匹配到特殊格式
160- console . log ( "渲染格式:" , current . type , content ) ;
161171 current . html = config . render ( content ) ;
162172 } else if ( current . type === 'question' ) { // 题目
163173 current . html = `<ol start="${ current . number } "><li>${ content } </li></ol>` ;
@@ -168,10 +178,22 @@ D. (1) 为假命题, (2) 为假命题。
168178 } ;
169179
170180 lines . forEach ( line => {
171- const trim0 = line . trim ( ) ;
181+ const trim0 = line . trim ( ) . replace ( '___' , '_________' ) . replace ( '(_)' , '($\\hspace{0.8cm}$)' ) ;
172182 // 处理中文字体包裹
173183 const trim = trim0 . replace ( / ( [ \u4e00 - \u9fff ] + ) / g, '<span class="chinese-fix">$1</span>' ) ;
174184
185+ // -1. 解析 meta 信息(字体大小等)
186+ // 匹配字体设置
187+ if ( trim0 . startsWith ( '#font ' ) ) {
188+ currentFont = trim0 . substring ( 6 ) . trim ( ) ;
189+ return ;
190+ }
191+ // 匹配大小设置
192+ if ( trim0 . startsWith ( '#size ' ) ) {
193+ currentSize = trim0 . substring ( 6 ) . trim ( ) ;
194+ return ;
195+ }
196+
175197 // 0. 判断是否为选择题选项 (兼容 A. A。A、A.)
176198 const mcqMatch = trim0 . match ( / ^ ( [ A - D ] ) [ . 。 、 . ] \s * ( .* ) / ) ;
177199 if ( mcqMatch ) {
@@ -250,6 +272,15 @@ D. (1) 为假命题, (2) 为假命题。
250272 } ) ;
251273 }
252274
275+ console . log ( currentFont , currentSize ) ;
276+ if ( FONT_CONFIG [ currentFont ] ) {
277+ const cfg = FONT_CONFIG [ currentFont ] ;
278+ document . documentElement . style . setProperty ( '--paper-font-family' , cfg . family ) ;
279+ document . documentElement . style . setProperty ( '--paper-font-vertical-align' , cfg . offset ) ;
280+ document . documentElement . style . setProperty ( '--paper-font-scale-size' , cfg . scale ) ;
281+ }
282+ document . documentElement . style . setProperty ( '--paper-base-size' , currentSize ) ;
283+
253284 allBlocks . value = blocks ;
254285 nextTick ( layout ) ;
255286 } ;
0 commit comments