docx_rust/formatting/
character_property.rs

1use hard_xml::{XmlRead, XmlWrite};
2use std::borrow::Cow;
3
4use crate::{
5    __setter, __string_enum, __xml_test_suites,
6    formatting::{Bold, Color, Dstrike, Fonts, Italics, Lang, Outline, Size, Strike, Underline},
7};
8
9use super::{BoldComplex, Caps, Highlight, ItalicsComplex, Position, SmallCaps, VertAlign};
10
11/// Character Property
12///
13/// ```rust
14/// use docx_rust::formatting::{CharacterProperty, UnderlineStyle};
15///
16/// let prop = CharacterProperty::default()
17///     .style_id("foo")
18///     .color("00ff00")
19///     .color(0xff0000)
20///     .color((0x00, 0x00, 0xff))
21///     .size(42isize)
22///     .bold(true)
23///     .italics(false)
24///     .strike(true)
25///     .dstrike(false)
26///     .outline(true)
27///     .underline("00ff00")
28///     .underline(("ff0000", UnderlineStyle::Dash));
29/// ```
30#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
31#[cfg_attr(test, derive(PartialEq))]
32#[xml(tag = "w:rPr")]
33pub struct CharacterProperty<'a> {
34    /// Specifies the style ID of the character style.
35    #[xml(child = "w:rStyle")]
36    pub style_id: Option<CharacterStyleId<'a>>,
37    /// Specifies the font.
38    #[xml(child = "w:rFonts")]
39    pub fonts: Option<Fonts>,
40    /// Specifies that the text of the text run is to be bold.
41    #[xml(child = "w:b")]
42    pub bold: Option<Bold>,
43    #[xml(child = "w:bCs")]
44    pub bold_complex: Option<BoldComplex>,
45    /// Specifies that the text of the text run is to be italics.
46    #[xml(child = "w:i")]
47    pub italics: Option<Italics>,
48    ///  Complex Script Italics
49    #[xml(child = "w:iCs")]
50    pub italics_complex: Option<ItalicsComplex>,
51    ///  Display All Characters As Capital Letters
52    #[xml(child = "w:caps")]
53    pub caps: Option<Caps>,
54    ///  Small Caps
55    #[xml(child = "w:smallCaps")]
56    pub small_caps: Option<SmallCaps>,
57    /// Specifies that the contents are to be displayed with a horizontal line through the center of the line.
58    #[xml(child = "w:strike")]
59    pub strike: Option<Strike>,
60    /// Specifies that the contents are to be displayed with two horizontal lines through each character.
61    #[xml(child = "w:dstrike")]
62    pub dstrike: Option<Dstrike>,
63    /// Specifies that the content should be displayed as if it had an outline.
64    #[xml(child = "w:outline")]
65    pub outline: Option<Outline>,
66    ///  Shadow
67    #[xml(child = "w:shadow")]
68    pub shadow: Option<Shadow>,
69    ///  Embossing
70    #[xml(child = "w:emboss")]
71    pub emboss: Option<Emboss>,
72    ///  Imprinting
73    #[xml(child = "w:imprint")]
74    pub imprint: Option<Imprint>,
75    ///  Do Not Check Spelling or Grammar
76    #[xml(child = "w:noProof")]
77    pub no_proof: Option<NoProof>,
78    /// Use Document Grid Settings For Inter-Character Spacing
79    #[xml(child = "w:snapToGrid")]
80    pub snap_to_grid: Option<super::SnapToGrid>,
81    ///  Hidden Text
82    #[xml(child = "w:vanish")]
83    pub vanish: Option<Vanish>,
84    ///  Web Hidden Text
85    #[xml(child = "w:webHidden")]
86    pub web_hidden: Option<WebHidden>,
87    /// Specifies the color to be used to display text.
88    #[xml(child = "w:color")]
89    pub color: Option<Color<'a>>,
90    ///  Character Spacing Adjustment
91    #[xml(child = "w:spacing")]
92    pub spacing: Option<TextSpacing>,
93    ///Expanded/Compressed Text
94    #[xml(child = "w:w")]
95    pub scale: Option<Scale>,
96    ///  Font Kerning
97    #[xml(child = "w:kern")]
98    pub kern: Option<Kern>,
99    /// Vertically Raised or Lowered Text
100    #[xml(child = "w:position")]
101    pub position: Option<Position>,
102    /// Specifies the font size in half points.
103    #[xml(child = "w:sz")]
104    pub size: Option<Size>,
105    ///  Complex Script Font Size
106    #[xml(child = "w:szCs")]
107    pub size_complex: Option<SizeComplex>,
108    ///  Text Highlighting
109    #[xml(child = "w:highlight")]
110    pub highlight: Option<Highlight>,
111    /// Specifies that the content should be displayed with an underline
112    #[xml(child = "w:u")]
113    pub underline: Option<Underline<'a>>,
114    ///  Animated Text Effect
115    #[xml(child = "w:effect")]
116    pub effect: Option<Effect>,
117    ///  Text Border
118    #[xml(child = "w:bdr")]
119    pub border: Option<TextBorder<'a>>,
120    ///  Run Shading
121    #[xml(child = "w:shd")]
122    pub shading: Option<Shading<'a>>,
123    ///  Manual Run Width
124    #[xml(child = "w:fitText")]
125    pub fit_text: Option<FitText>,
126    /// Subscript/Superscript Text
127    #[xml(child = "w:vertAlign")]
128    pub vertical_align: Option<VertAlign>,
129    ///  Right To Left Text
130    #[xml(child = "w:rtl")]
131    pub rtl: Option<RightToLeftText>,
132    ///  Use Complex Script Formatting on Run
133    #[xml(child = "w:cs")]
134    pub complex_script: Option<ComplexScript>,
135    ///  Emphasis Mark
136    #[xml(child = "w:em")]
137    pub emphasis: Option<Emphasis>,
138    /// Specifies the language to be used.
139    #[xml(child = "w:lang")]
140    pub lang: Option<Lang<'a>>,
141    ///  East Asian Typography Settings
142    #[xml(child = "w:eastAsianLayout")]
143    pub east_asian_layout: Option<EastAsianLayout>,
144    ///  Paragraph Mark Is Always Hidden
145    #[xml(child = "w:specVanish")]
146    pub spec_vanish: Option<SpecVanish>,
147    ///  Office Open XML Math
148    #[xml(child = "w:oMath")]
149    pub o_math: Option<OMath>,
150}
151
152impl<'a> CharacterProperty<'a> {
153    __setter!(style_id: Option<CharacterStyleId<'a>>);
154    __setter!(color: Option<Color<'a>>);
155    __setter!(bold: Option<Bold>);
156    __setter!(dstrike: Option<Dstrike>);
157    __setter!(italics: Option<Italics>);
158    __setter!(outline: Option<Outline>);
159    __setter!(strike: Option<Strike>);
160    __setter!(size: Option<Size>);
161    __setter!(underline: Option<Underline<'a>>);
162    __setter!(fonts: Option<Fonts>);
163}
164
165#[derive(Debug, XmlRead, XmlWrite, Clone)]
166#[cfg_attr(test, derive(PartialEq))]
167#[xml(tag = "w:rStyle")]
168pub struct CharacterStyleId<'a> {
169    #[xml(attr = "w:val")]
170    pub value: Cow<'a, str>,
171}
172
173impl<'a, T: Into<Cow<'a, str>>> From<T> for CharacterStyleId<'a> {
174    fn from(val: T) -> Self {
175        CharacterStyleId { value: val.into() }
176    }
177}
178
179#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
180#[cfg_attr(test, derive(PartialEq))]
181#[xml(tag = "w:shadow")]
182pub struct Shadow {
183    #[xml(attr = "w:val")]
184    pub value: Option<bool>,
185}
186
187#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
188#[cfg_attr(test, derive(PartialEq))]
189#[xml(tag = "w:emboss")]
190pub struct Emboss {
191    #[xml(attr = "w:val")]
192    pub value: Option<bool>,
193}
194
195#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
196#[cfg_attr(test, derive(PartialEq))]
197#[xml(tag = "w:imprint")]
198pub struct Imprint {
199    #[xml(attr = "w:val")]
200    pub value: Option<bool>,
201}
202
203#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
204#[cfg_attr(test, derive(PartialEq))]
205#[xml(tag = "w:noProof")]
206pub struct NoProof {
207    #[xml(attr = "w:val")]
208    pub value: Option<bool>,
209}
210
211// #[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
212// #[cfg_attr(test, derive(PartialEq))]
213// #[xml(tag = "w:snapToGrid")]
214// pub struct SnapToGrid {
215//     #[xml(attr = "w:val")]
216//     pub value: Option<bool>,
217// }
218
219#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
220#[cfg_attr(test, derive(PartialEq))]
221#[xml(tag = "w:vanish")]
222pub struct Vanish {
223    #[xml(attr = "w:val")]
224    pub value: Option<bool>,
225}
226
227#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
228#[cfg_attr(test, derive(PartialEq))]
229#[xml(tag = "w:webHidden")]
230pub struct WebHidden {
231    #[xml(attr = "w:val")]
232    pub value: Option<bool>,
233}
234
235#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
236#[cfg_attr(test, derive(PartialEq))]
237#[xml(tag = "w:rtl")]
238pub struct RightToLeftText {
239    #[xml(attr = "w:val")]
240    pub value: Option<bool>,
241}
242
243#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
244#[cfg_attr(test, derive(PartialEq))]
245#[xml(tag = "w:cs")]
246pub struct ComplexScript {
247    #[xml(attr = "w:val")]
248    pub value: Option<bool>,
249}
250
251#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
252#[cfg_attr(test, derive(PartialEq))]
253#[xml(tag = "w:specVanish")]
254pub struct SpecVanish {
255    #[xml(attr = "w:val")]
256    pub value: Option<bool>,
257}
258
259#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
260#[cfg_attr(test, derive(PartialEq))]
261#[xml(tag = "w:oMath")]
262pub struct OMath {
263    #[xml(attr = "w:val")]
264    pub value: Option<bool>,
265}
266
267/// Positive or Negative Value in Twentieths of a Point
268#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
269#[cfg_attr(test, derive(PartialEq))]
270#[xml(tag = "w:spacing")]
271pub struct TextSpacing {
272    #[xml(attr = "w:val")]
273    pub value: Option<isize>,
274}
275
276/// Text Expansion/Compression Percentage, 0..=600.
277#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
278#[cfg_attr(test, derive(PartialEq))]
279#[xml(tag = "w:w")]
280pub struct Scale {
281    #[xml(attr = "w:val")]
282    pub value: Option<u16>,
283}
284
285/// Measurement in Half-Points
286#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
287#[cfg_attr(test, derive(PartialEq))]
288#[xml(tag = "w:szCs")]
289pub struct SizeComplex {
290    #[xml(attr = "w:val")]
291    pub value: Option<isize>,
292}
293
294/// Measurement in Half-Points
295#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
296#[cfg_attr(test, derive(PartialEq))]
297#[xml(tag = "w:kern")]
298pub struct Kern {
299    #[xml(attr = "w:val")]
300    pub value: Option<isize>,
301}
302
303#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
304#[cfg_attr(test, derive(PartialEq))]
305#[xml(tag = "w:effect")]
306pub struct Effect {
307    #[xml(attr = "w:val")]
308    pub value: Option<EffectType>,
309}
310
311#[derive(Debug, Clone, Default)]
312#[cfg_attr(test, derive(PartialEq))]
313pub enum EffectType {
314    BlinkBackground, //Blinking Background Animation
315    Lights,          //Colored Lights Animation
316    AntsBlack,       //Black Dashed Line Animation
317    AntsRed,         //Marching Red Ants
318    Shimmer,         //Shimmer Animation
319    Sparkle,         //Sparkling Lights Animation
320    #[default]
321    None, //No Animation
322}
323
324__string_enum! {
325    EffectType {
326        BlinkBackground = "blinkBackground",
327        Lights = "lights",
328        AntsBlack = "antsBlack",
329        AntsRed = "antsRed",
330        Shimmer = "shimmer",
331        Sparkle = "sparkle",
332        None = "none",
333    }
334}
335
336#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
337#[cfg_attr(test, derive(PartialEq))]
338#[xml(tag = "w:eastAsianLayout")]
339pub struct EastAsianLayout {
340    #[xml(attr = "w:id")]
341    pub id: Option<isize>,
342    #[xml(attr = "w:combine")]
343    pub combine: Option<bool>,
344    #[xml(attr = "w:combineBrackets")]
345    pub combine_brackets: Option<CombineBracketsType>,
346    #[xml(attr = "w:vert")]
347    pub vert: Option<bool>,
348    #[xml(attr = "w:vertCompress")]
349    pub vert_compress: Option<bool>,
350}
351
352#[derive(Debug, Clone, Default)]
353#[cfg_attr(test, derive(PartialEq))]
354pub enum CombineBracketsType {
355    #[default]
356    None, //	No Enclosing Brackets
357    Round,  //	Round Brackets
358    Square, //	Square Brackets
359    Angle,  //	Angle Brackets
360    Curly,  //	Curly Brackets
361}
362
363__string_enum! {
364    CombineBracketsType {
365        None = "none",
366        Round = "round",
367        Square = "square",
368        Angle = "angle",
369        Curly = "curly",
370    }
371}
372
373#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
374#[cfg_attr(test, derive(PartialEq))]
375#[xml(tag = "w:fitText")]
376pub struct FitText {
377    // Measurement in Twentieths of a Point
378    #[xml(attr = "w:val")]
379    pub value: Option<isize>,
380    #[xml(attr = "w:id")]
381    pub id: Option<isize>,
382}
383
384#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
385#[cfg_attr(test, derive(PartialEq))]
386#[xml(tag = "w:bdr")]
387pub struct TextBorder<'a> {
388    #[xml(attr = "w:val")]
389    pub style: super::BorderStyle,
390    #[xml(attr = "w:color")]
391    pub color: Option<Cow<'a, str>>,
392    #[xml(attr = "w:themeColor")]
393    pub theme_color: Option<ThemeColor>,
394    #[xml(attr = "w:themeTint")]
395    pub theme_tint: Option<Cow<'a, str>>,
396    #[xml(attr = "w:themeShade")]
397    pub theme_shade: Option<Cow<'a, str>>,
398    #[xml(attr = "w:sz")]
399    pub size: Option<isize>, // Measurement in Eighths of a Point
400    #[xml(attr = "w:space")]
401    pub space: Option<isize>,
402    #[xml(attr = "w:shadow")]
403    pub shadow: Option<bool>,
404    #[xml(attr = "w:frame")]
405    pub frame: Option<bool>,
406}
407
408#[derive(Debug, Clone, Default)]
409#[cfg_attr(test, derive(PartialEq))]
410pub enum ThemeColor {
411    #[default]
412    Dark1, //Dark 1 Theme Color.
413    Light1,            //Light 1 Theme Color.
414    Dark2,             //Dark 2 Theme Color.
415    Light2,            //Light 2 Theme Color.
416    Accent1,           //Accent 1 Theme Color.
417    Accent2,           //Accent 2 Theme Color.
418    Accent3,           //Accent 3 Theme Color.
419    Accent4,           //Accent 4 Theme Color.
420    Accent5,           //Accent 5 Theme Color.
421    Accent6,           //Accent 6 Theme Color.
422    Hyperlink,         //Hyperlink Theme Color.
423    FollowedHyperlink, //Followed Hyperlink Theme Color.
424    None,              //No Theme Color.
425    Background1,       //Background 1 Theme Color.
426    Text1,             //Text 1 Theme Color.
427    Background2,       //Background 2 Theme Color.
428    Text2,             //Text 2 Theme Color.
429}
430
431__string_enum! {
432    ThemeColor {
433        Dark1 = "dark1",
434        Light1 = "light1",
435        Dark2 = "dark2",
436        Light2 = "light2",
437        Accent1 = "accent1",
438        Accent2 = "accent2",
439        Accent3 = "accent3",
440        Accent4 = "accent4",
441        Accent5 = "accent5",
442        Accent6 = "accent6",
443        Hyperlink = "hyperlink",
444        FollowedHyperlink = "followedHyperlink",
445        None = "none",
446        Background1 = "background1",
447        Text1 = "text1",
448        Background2 = "background2",
449        Text2 = "text2",
450    }
451}
452
453#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
454#[cfg_attr(test, derive(PartialEq))]
455#[xml(tag = "w:shd")]
456pub struct Shading<'a> {
457    #[xml(attr = "w:val")]
458    pub style: Option<ShadingStyle>,
459    #[xml(attr = "w:color")]
460    pub color: Option<Cow<'a, str>>,
461    #[xml(attr = "w:themeColor")]
462    pub theme_color: Option<ThemeColor>,
463    #[xml(attr = "w:themeTint")]
464    pub theme_tint: Option<Cow<'a, str>>,
465    #[xml(attr = "w:themeShade")]
466    pub theme_shade: Option<Cow<'a, str>>,
467    #[xml(attr = "w:fill")]
468    pub fill: Option<Cow<'a, str>>,
469    #[xml(attr = "w:themeFill")]
470    pub theme_fill: Option<ThemeColor>,
471    #[xml(attr = "w:themeFillTint")]
472    pub theme_fill_tint: Option<Cow<'a, str>>,
473    #[xml(attr = "w:themeFillShade")]
474    pub theme_fill_shade: Option<Cow<'a, str>>,
475}
476
477#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
478#[cfg_attr(test, derive(PartialEq))]
479#[xml(tag = "w:em")]
480pub struct Emphasis {
481    #[xml(attr = "w:val")]
482    pub value: Option<EmphasisType>,
483}
484
485#[derive(Debug, Default, Clone)]
486#[cfg_attr(test, derive(PartialEq))]
487pub enum ShadingStyle {
488    #[default]
489    Nil, //No Pattern.
490    Clear,                 //No Pattern.
491    Solid,                 //100% Fill Pattern.
492    HorzStripe,            //Horizontal Stripe Pattern.
493    VertStripe,            //Vertical Stripe Pattern.
494    ReverseDiagStripe,     //Reverse Diagonal Stripe Pattern.
495    DiagStripe,            //Diagonal Stripe Pattern.
496    HorzCross,             //Horizontal Cross Pattern.
497    DiagCross,             //Diagonal Cross Pattern.
498    ThinHorzStripe,        //Thin Horizontal Stripe Pattern.
499    ThinVertStripe,        //Thin Vertical Stripe Pattern.
500    ThinReverseDiagStripe, //Thin Reverse Diagonal Stripe Pattern.
501    ThinDiagStripe,        //Thin Diagonal Stripe Pattern.
502    ThinHorzCross,         //Thin Horizontal Cross Pattern.
503    ThinDiagCross,         //Thin Diagonal Cross Pattern.
504    Pct5,                  //5% Fill Pattern.
505    Pct10,                 //10% Fill Pattern.
506    Pct12,                 //12.5% Fill Pattern.
507    Pct15,                 //15% Fill Pattern.
508    Pct20,                 //20% Fill Pattern.
509    Pct25,                 //25% Fill Pattern.
510    Pct30,                 //30% Fill Pattern.
511    Pct35,                 //35% Fill Pattern.
512    Pct37,                 //37.5% Fill Pattern.
513    Pct40,                 //40% Fill Pattern.
514    Pct45,                 //45% Fill Pattern.
515    Pct50,                 //50% Fill Pattern.
516    Pct55,                 //55% Fill Pattern.
517    Pct60,                 //60% Fill Pattern.
518    Pct62,                 //62.5% Fill Pattern.
519    Pct65,                 //65% Fill Pattern.
520    Pct70,                 //70% Fill Pattern.
521    Pct75,                 //75% Fill Pattern.
522    Pct80,                 //80% Fill Pattern.
523    Pct85,                 //85% Fill Pattern.
524    Pct87,                 //87.5% Fill Pattern.
525    Pct90,                 //90% Fill Pattern.
526    Pct95,                 //95% Fill Pattern.
527}
528
529__string_enum! {
530    ShadingStyle {
531        Nil = "nil",
532        Clear = "clear",
533        Solid = "solid",
534        HorzStripe = "horzStripe",
535        VertStripe = "vertStripe",
536        ReverseDiagStripe = "reverseDiagStripe",
537        DiagStripe = "diagStripe",
538        HorzCross = "horzCross",
539        DiagCross = "diagCross",
540        ThinHorzStripe = "thinHorzStripe",
541        ThinVertStripe = "thinVertStripe",
542        ThinReverseDiagStripe = "thinReverseDiagStripe",
543        ThinDiagStripe = "thinDiagStripe",
544        ThinHorzCross = "thinHorzCross",
545        ThinDiagCross = "thinDiagCross",
546        Pct5 = "pct5",
547        Pct10 = "pct10",
548        Pct12 = "pct12",
549        Pct15 = "pct15",
550        Pct20 = "pct20",
551        Pct25 = "pct25",
552        Pct30 = "pct30",
553        Pct35 = "pct35",
554        Pct37 = "pct37",
555        Pct40 = "pct40",
556        Pct45 = "pct45",
557        Pct50 = "pct50",
558        Pct55 = "pct55",
559        Pct60 = "pct60",
560        Pct62 = "pct62",
561        Pct65 = "pct65",
562        Pct70 = "pct70",
563        Pct75 = "pct75",
564        Pct80 = "pct80",
565        Pct85 = "pct85",
566        Pct87 = "pct87",
567        Pct90 = "pct90",
568        Pct95 = "pct95",
569    }
570}
571
572#[derive(Debug, Default, Clone)]
573#[cfg_attr(test, derive(PartialEq))]
574pub enum EmphasisType {
575    #[default]
576    None, //	No Emphasis Mark
577    Dot,      //	Dot Emphasis Mark Above Characters
578    Comma,    //	Comma Emphasis Mark Above Characters
579    Circle,   //	Circle Emphasis Mark Above Characters
580    UnderDot, //	Dot Emphasis Mark Below Characters
581}
582
583__string_enum! {
584    EmphasisType {
585        None = "none",
586        Dot = "dot",
587        Comma = "comma",
588        Circle = "circle",
589        UnderDot = "underdot",
590    }
591}
592
593__xml_test_suites!(
594    CharacterProperty,
595    CharacterProperty::default(),
596    r#"<w:rPr/>"#,
597    CharacterProperty::default().style_id("id"),
598    r#"<w:rPr><w:rStyle w:val="id"/></w:rPr>"#,
599    CharacterProperty::default().color("00ff00"),
600    r#"<w:rPr><w:color w:val="00ff00"/></w:rPr>"#,
601    CharacterProperty::default().size(42isize),
602    r#"<w:rPr><w:sz w:val="42"/></w:rPr>"#,
603    CharacterProperty::default().bold(true),
604    r#"<w:rPr><w:b w:val="true"/></w:rPr>"#,
605    CharacterProperty::default().italics(false),
606    r#"<w:rPr><w:i w:val="false"/></w:rPr>"#,
607    CharacterProperty::default().outline(true),
608    r#"<w:rPr><w:outline w:val="true"/></w:rPr>"#,
609    CharacterProperty::default().strike(false),
610    r#"<w:rPr><w:strike w:val="false"/></w:rPr>"#,
611    CharacterProperty::default().dstrike(true),
612    r#"<w:rPr><w:dstrike w:val="true"/></w:rPr>"#,
613    CharacterProperty::default().underline(Underline::default()),
614    r#"<w:rPr><w:u/></w:rPr>"#,
615    CharacterProperty::default().fonts(Fonts::default().east_asia("宋体")),
616    r#"<w:rPr><w:rFonts w:eastAsia="宋体"/></w:rPr>"#,
617);