[{"data":1,"prerenderedAt":1906},["ShallowReactive",2],{"blog-zh-bold-italic-together":3},{"id":4,"title":5,"author":6,"body":10,"date":1875,"description":1876,"draft":1877,"extension":1878,"howTo":1879,"image":1897,"meta":1898,"navigation":144,"path":1899,"seo":1900,"stem":1901,"tags":1902,"updated":1897,"__hash__":1905},"blogZh/zh/blog/013.bold-italic-together.md","如何在 gpdf 中同时使用粗体和斜体",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/en/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1865},"minimark",[13,17,26,29,37,99,118,121,125,686,707,711,714,790,822,826,833,980,990,993,1601,1614,1617,1626,1738,1760,1787,1790,1823,1827,1830,1847,1861],[14,15,16],"h2",{"id":16},"把问题换种说法",[18,19,20,21,25],"p",{},"我想让 PDF 中的一个单词、或者整行文字，",[22,23,24],"strong",{},"同时是粗体和斜体","。怎么一次指定两个样式？为什么有时候输出看起来既不粗也不斜？",[14,27,28],{"id":28},"快速回答",[18,30,31,32,36],{},"在同一个 ",[33,34,35],"code",{},"c.Text"," 调用上传入两个选项：",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","c.Text(\"WARNING\", template.Bold(), template.Italic())\n","go","",[33,45,46],{"__ignoreMap":43},[47,48,51,55,59,63,66,69,73,75,78,81,83,86,89,91,93,96],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"sTEyZ","c",[47,56,58],{"class":57},"sMK4o",".",[47,60,62],{"class":61},"s2Zo4","Text",[47,64,65],{"class":57},"(",[47,67,68],{"class":57},"\"",[47,70,72],{"class":71},"sfazB","WARNING",[47,74,68],{"class":57},[47,76,77],{"class":57},",",[47,79,80],{"class":53}," template",[47,82,58],{"class":57},[47,84,85],{"class":61},"Bold",[47,87,88],{"class":57},"(),",[47,90,80],{"class":53},[47,92,58],{"class":57},[47,94,95],{"class":61},"Italic",[47,97,98],{"class":57},"())\n",[18,100,101,102,105,106,109,110,113,114,117],{},"gpdf 会组装变体 ID ",[33,103,104],{},"Family-BoldItalic"," 并在已注册字体中查找。对于 Adobe Standard 14 字体族（Helvetica、Courier、Times）这能直接工作——gpdf 在内部把 ",[33,107,108],{},"-BoldItalic"," 别名到正式名 ",[33,111,112],{},"-BoldOblique","，并使用内置的 AFM 度量。自己注册的 TrueType 字体需要",[22,115,116],{},"注册全部 4 个变体","，否则查找会静默回退到基础字体。",[18,119,120],{},"大多数 bug 都出在第二点。",[14,122,124],{"id":123},"可运行代码helvetica无需注册字体","可运行代码（Helvetica，无需注册字体）",[38,126,128],{"className":40,"code":127,"language":42,"meta":43,"style":43},"package main\n\nimport (\n    \"log\"\n    \"os\"\n\n    \"github.com/gpdf-dev/gpdf\"\n    \"github.com/gpdf-dev/gpdf/document\"\n    \"github.com/gpdf-dev/gpdf/template\"\n)\n\nfunc main() {\n    doc := gpdf.NewDocument(\n        gpdf.WithPageSize(gpdf.A4),\n        gpdf.WithMargins(document.UniformEdges(document.Mm(20))),\n    )\n\n    page := doc.AddPage()\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(\"Regular Helvetica.\")\n            c.Text(\"Bold only.\", template.Bold())\n            c.Text(\"Italic only.\", template.Italic())\n            c.Text(\"Bold and italic.\", template.Bold(), template.Italic())\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"emphasis.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[33,129,130,139,146,156,168,178,183,193,203,213,219,224,239,259,283,321,327,332,351,385,421,442,470,498,534,540,546,551,573,589,607,613,660,675,680],{"__ignoreMap":43},[47,131,132,135],{"class":49,"line":50},[47,133,134],{"class":57},"package",[47,136,138],{"class":137},"sBMFI"," main\n",[47,140,142],{"class":49,"line":141},2,[47,143,145],{"emptyLinePlaceholder":144},true,"\n",[47,147,149,153],{"class":49,"line":148},3,[47,150,152],{"class":151},"s7zQu","import",[47,154,155],{"class":57}," (\n",[47,157,159,162,165],{"class":49,"line":158},4,[47,160,161],{"class":57},"    \"",[47,163,164],{"class":137},"log",[47,166,167],{"class":57},"\"\n",[47,169,171,173,176],{"class":49,"line":170},5,[47,172,161],{"class":57},[47,174,175],{"class":137},"os",[47,177,167],{"class":57},[47,179,181],{"class":49,"line":180},6,[47,182,145],{"emptyLinePlaceholder":144},[47,184,186,188,191],{"class":49,"line":185},7,[47,187,161],{"class":57},[47,189,190],{"class":137},"github.com/gpdf-dev/gpdf",[47,192,167],{"class":57},[47,194,196,198,201],{"class":49,"line":195},8,[47,197,161],{"class":57},[47,199,200],{"class":137},"github.com/gpdf-dev/gpdf/document",[47,202,167],{"class":57},[47,204,206,208,211],{"class":49,"line":205},9,[47,207,161],{"class":57},[47,209,210],{"class":137},"github.com/gpdf-dev/gpdf/template",[47,212,167],{"class":57},[47,214,216],{"class":49,"line":215},10,[47,217,218],{"class":57},")\n",[47,220,222],{"class":49,"line":221},11,[47,223,145],{"emptyLinePlaceholder":144},[47,225,227,230,233,236],{"class":49,"line":226},12,[47,228,229],{"class":57},"func",[47,231,232],{"class":61}," main",[47,234,235],{"class":57},"()",[47,237,238],{"class":57}," {\n",[47,240,242,245,248,251,253,256],{"class":49,"line":241},13,[47,243,244],{"class":53},"    doc ",[47,246,247],{"class":57},":=",[47,249,250],{"class":53}," gpdf",[47,252,58],{"class":57},[47,254,255],{"class":61},"NewDocument",[47,257,258],{"class":57},"(\n",[47,260,262,265,267,270,272,275,277,280],{"class":49,"line":261},14,[47,263,264],{"class":53},"        gpdf",[47,266,58],{"class":57},[47,268,269],{"class":61},"WithPageSize",[47,271,65],{"class":57},[47,273,274],{"class":53},"gpdf",[47,276,58],{"class":57},[47,278,279],{"class":53},"A4",[47,281,282],{"class":57},"),\n",[47,284,286,288,290,293,295,298,300,303,305,307,309,312,314,318],{"class":49,"line":285},15,[47,287,264],{"class":53},[47,289,58],{"class":57},[47,291,292],{"class":61},"WithMargins",[47,294,65],{"class":57},[47,296,297],{"class":53},"document",[47,299,58],{"class":57},[47,301,302],{"class":61},"UniformEdges",[47,304,65],{"class":57},[47,306,297],{"class":53},[47,308,58],{"class":57},[47,310,311],{"class":61},"Mm",[47,313,65],{"class":57},[47,315,317],{"class":316},"sbssI","20",[47,319,320],{"class":57},"))),\n",[47,322,324],{"class":49,"line":323},16,[47,325,326],{"class":57},"    )\n",[47,328,330],{"class":49,"line":329},17,[47,331,145],{"emptyLinePlaceholder":144},[47,333,335,338,340,343,345,348],{"class":49,"line":334},18,[47,336,337],{"class":53},"    page ",[47,339,247],{"class":57},[47,341,342],{"class":53}," doc",[47,344,58],{"class":57},[47,346,347],{"class":61},"AddPage",[47,349,350],{"class":57},"()\n",[47,352,354,357,359,362,365,369,372,375,377,380,383],{"class":49,"line":353},19,[47,355,356],{"class":53},"    page",[47,358,58],{"class":57},[47,360,361],{"class":61},"AutoRow",[47,363,364],{"class":57},"(func(",[47,366,368],{"class":367},"sHdIc","r",[47,370,371],{"class":57}," *",[47,373,374],{"class":137},"template",[47,376,58],{"class":57},[47,378,379],{"class":137},"RowBuilder",[47,381,382],{"class":57},")",[47,384,238],{"class":57},[47,386,388,391,393,396,398,401,403,406,408,410,412,414,417,419],{"class":49,"line":387},20,[47,389,390],{"class":53},"        r",[47,392,58],{"class":57},[47,394,395],{"class":61},"Col",[47,397,65],{"class":57},[47,399,400],{"class":316},"12",[47,402,77],{"class":57},[47,404,405],{"class":57}," func(",[47,407,54],{"class":367},[47,409,371],{"class":57},[47,411,374],{"class":137},[47,413,58],{"class":57},[47,415,416],{"class":137},"ColBuilder",[47,418,382],{"class":57},[47,420,238],{"class":57},[47,422,424,427,429,431,433,435,438,440],{"class":49,"line":423},21,[47,425,426],{"class":53},"            c",[47,428,58],{"class":57},[47,430,62],{"class":61},[47,432,65],{"class":57},[47,434,68],{"class":57},[47,436,437],{"class":71},"Regular Helvetica.",[47,439,68],{"class":57},[47,441,218],{"class":57},[47,443,445,447,449,451,453,455,458,460,462,464,466,468],{"class":49,"line":444},22,[47,446,426],{"class":53},[47,448,58],{"class":57},[47,450,62],{"class":61},[47,452,65],{"class":57},[47,454,68],{"class":57},[47,456,457],{"class":71},"Bold only.",[47,459,68],{"class":57},[47,461,77],{"class":57},[47,463,80],{"class":53},[47,465,58],{"class":57},[47,467,85],{"class":61},[47,469,98],{"class":57},[47,471,473,475,477,479,481,483,486,488,490,492,494,496],{"class":49,"line":472},23,[47,474,426],{"class":53},[47,476,58],{"class":57},[47,478,62],{"class":61},[47,480,65],{"class":57},[47,482,68],{"class":57},[47,484,485],{"class":71},"Italic only.",[47,487,68],{"class":57},[47,489,77],{"class":57},[47,491,80],{"class":53},[47,493,58],{"class":57},[47,495,95],{"class":61},[47,497,98],{"class":57},[47,499,501,503,505,507,509,511,514,516,518,520,522,524,526,528,530,532],{"class":49,"line":500},24,[47,502,426],{"class":53},[47,504,58],{"class":57},[47,506,62],{"class":61},[47,508,65],{"class":57},[47,510,68],{"class":57},[47,512,513],{"class":71},"Bold and italic.",[47,515,68],{"class":57},[47,517,77],{"class":57},[47,519,80],{"class":53},[47,521,58],{"class":57},[47,523,85],{"class":61},[47,525,88],{"class":57},[47,527,80],{"class":53},[47,529,58],{"class":57},[47,531,95],{"class":61},[47,533,98],{"class":57},[47,535,537],{"class":49,"line":536},25,[47,538,539],{"class":57},"        })\n",[47,541,543],{"class":49,"line":542},26,[47,544,545],{"class":57},"    })\n",[47,547,549],{"class":49,"line":548},27,[47,550,145],{"emptyLinePlaceholder":144},[47,552,554,557,559,562,564,566,568,571],{"class":49,"line":553},28,[47,555,556],{"class":53},"    data",[47,558,77],{"class":57},[47,560,561],{"class":53}," err ",[47,563,247],{"class":57},[47,565,342],{"class":53},[47,567,58],{"class":57},[47,569,570],{"class":61},"Generate",[47,572,350],{"class":57},[47,574,576,579,581,584,587],{"class":49,"line":575},29,[47,577,578],{"class":151},"    if",[47,580,561],{"class":53},[47,582,583],{"class":57},"!=",[47,585,586],{"class":57}," nil",[47,588,238],{"class":57},[47,590,592,595,597,600,602,605],{"class":49,"line":591},30,[47,593,594],{"class":53},"        log",[47,596,58],{"class":57},[47,598,599],{"class":61},"Fatal",[47,601,65],{"class":57},[47,603,604],{"class":53},"err",[47,606,218],{"class":57},[47,608,610],{"class":49,"line":609},31,[47,611,612],{"class":57},"    }\n",[47,614,616,618,620,622,625,627,630,632,634,637,639,641,644,646,649,652,654,656,658],{"class":49,"line":615},32,[47,617,578],{"class":151},[47,619,561],{"class":53},[47,621,247],{"class":57},[47,623,624],{"class":53}," os",[47,626,58],{"class":57},[47,628,629],{"class":61},"WriteFile",[47,631,65],{"class":57},[47,633,68],{"class":57},[47,635,636],{"class":71},"emphasis.pdf",[47,638,68],{"class":57},[47,640,77],{"class":57},[47,642,643],{"class":53}," data",[47,645,77],{"class":57},[47,647,648],{"class":316}," 0o644",[47,650,651],{"class":57},");",[47,653,561],{"class":53},[47,655,583],{"class":57},[47,657,586],{"class":57},[47,659,238],{"class":57},[47,661,663,665,667,669,671,673],{"class":49,"line":662},33,[47,664,594],{"class":53},[47,666,58],{"class":57},[47,668,599],{"class":61},[47,670,65],{"class":57},[47,672,604],{"class":53},[47,674,218],{"class":57},[47,676,678],{"class":49,"line":677},34,[47,679,612],{"class":57},[47,681,683],{"class":49,"line":682},35,[47,684,685],{"class":57},"}\n",[18,687,688,689,692,693,696,697,696,700,696,703,706],{},"4 行代码，4 种样式。完全不用 ",[33,690,691],{},"WithFont","。生成的 PDF 以非嵌入的 Type 1 条目引用 ",[33,694,695],{},"Helvetica","、",[33,698,699],{},"Helvetica-Bold",[33,701,702],{},"Helvetica-Oblique",[33,704,705],{},"Helvetica-BoldOblique","——每个 PDF 阅读器都已经有这些字体。",[14,708,710],{"id":709},"gpdf-实际做了什么","gpdf 实际做了什么",[18,712,713],{},"解析器从样式标志拼出变体 ID：",[715,716,717,737],"table",{},[718,719,720],"thead",{},[721,722,723,729,734],"tr",{},[724,725,726],"th",{},[33,727,728],{},"Bold()",[724,730,731],{},[33,732,733],{},"Italic()",[724,735,736],{},"查找的变体 ID",[738,739,740,752,763,777],"tbody",{},[721,741,742,746,748],{},[743,744,745],"td",{},"否",[743,747,745],{},[743,749,750],{},[33,751,695],{},[721,753,754,757,759],{},[743,755,756],{},"是",[743,758,745],{},[743,760,761],{},[33,762,699],{},[721,764,765,767,769],{},[743,766,745],{},[743,768,756],{},[743,770,771,774,775],{},[33,772,773],{},"Helvetica-Italic"," → 别名到 ",[33,776,702],{},[721,778,779,781,783],{},[743,780,756],{},[743,782,756],{},[743,784,785,774,788],{},[33,786,787],{},"Helvetica-BoldItalic",[33,789,705],{},[18,791,792,793,796,797,800,801,803,804,806,807,809,810,806,812,814,815,800,818,821],{},"别名步骤是 Helvetica 唯一特殊的地方。",[33,794,795],{},"buildFontVariantID"," 不管字体族总是输出通用的 ",[33,798,799],{},"-Italic"," / ",[33,802,108],{}," 后缀；随后 Standard 14 的 init 钩子把 ",[33,805,773],{}," 指向 ",[33,808,702],{},"，把 ",[33,811,787],{},[33,813,705],{},"，让度量和阅读器绘制一致。Courier 同理。Times 不需要别名，因为它的正名本来就是 ",[33,816,817],{},"Times-Italic",[33,819,820],{},"Times-BoldItalic","。",[14,823,825],{"id":824},"陷阱truetype-字体必须注册全部-4-个","陷阱：TrueType 字体必须注册全部 4 个",[18,827,828,829,832],{},"CJK 文档静默出问题就在这里。即使注册了 Noto Sans JP，只要缺了任一变体，缺失的槽",[22,830,831],{},"不会","经过 Bold 或 Italic 过渡——它直接落到基础字体。",[38,834,836],{"className":40,"code":835,"language":42,"meta":43,"style":43},"// 看起来没问题。其实不是。\ndoc := gpdf.NewDocument(\n    gpdf.WithFont(\"NotoSansJP\", regular),\n    gpdf.WithFont(\"NotoSansJP-Bold\", bold),\n    gpdf.WithDefaultFont(\"NotoSansJP\", 12),\n)\n\n// 这里会用普通 NotoSansJP 渲染——既不粗也不斜。\nc.Text(\"强调文字\", template.Bold(), template.Italic())\n",[33,837,838,844,859,884,908,932,936,940,945],{"__ignoreMap":43},[47,839,840],{"class":49,"line":50},[47,841,843],{"class":842},"sHwdD","// 看起来没问题。其实不是。\n",[47,845,846,849,851,853,855,857],{"class":49,"line":141},[47,847,848],{"class":53},"doc ",[47,850,247],{"class":57},[47,852,250],{"class":53},[47,854,58],{"class":57},[47,856,255],{"class":61},[47,858,258],{"class":57},[47,860,861,864,866,868,870,872,875,877,879,882],{"class":49,"line":148},[47,862,863],{"class":53},"    gpdf",[47,865,58],{"class":57},[47,867,691],{"class":61},[47,869,65],{"class":57},[47,871,68],{"class":57},[47,873,874],{"class":71},"NotoSansJP",[47,876,68],{"class":57},[47,878,77],{"class":57},[47,880,881],{"class":53}," regular",[47,883,282],{"class":57},[47,885,886,888,890,892,894,896,899,901,903,906],{"class":49,"line":158},[47,887,863],{"class":53},[47,889,58],{"class":57},[47,891,691],{"class":61},[47,893,65],{"class":57},[47,895,68],{"class":57},[47,897,898],{"class":71},"NotoSansJP-Bold",[47,900,68],{"class":57},[47,902,77],{"class":57},[47,904,905],{"class":53}," bold",[47,907,282],{"class":57},[47,909,910,912,914,917,919,921,923,925,927,930],{"class":49,"line":170},[47,911,863],{"class":53},[47,913,58],{"class":57},[47,915,916],{"class":61},"WithDefaultFont",[47,918,65],{"class":57},[47,920,68],{"class":57},[47,922,874],{"class":71},[47,924,68],{"class":57},[47,926,77],{"class":57},[47,928,929],{"class":316}," 12",[47,931,282],{"class":57},[47,933,934],{"class":49,"line":180},[47,935,218],{"class":57},[47,937,938],{"class":49,"line":185},[47,939,145],{"emptyLinePlaceholder":144},[47,941,942],{"class":49,"line":195},[47,943,944],{"class":842},"// 这里会用普通 NotoSansJP 渲染——既不粗也不斜。\n",[47,946,947,949,951,953,955,957,960,962,964,966,968,970,972,974,976,978],{"class":49,"line":205},[47,948,54],{"class":53},[47,950,58],{"class":57},[47,952,62],{"class":61},[47,954,65],{"class":57},[47,956,68],{"class":57},[47,958,959],{"class":71},"强调文字",[47,961,68],{"class":57},[47,963,77],{"class":57},[47,965,80],{"class":53},[47,967,58],{"class":57},[47,969,85],{"class":61},[47,971,88],{"class":57},[47,973,80],{"class":53},[47,975,58],{"class":57},[47,977,95],{"class":61},[47,979,98],{"class":57},[18,981,982,983,986,987,989],{},"原因在解析器实现里。先查 ",[33,984,985],{},"NotoSansJP-BoldItalic","，未命中时只回退一个东西：基础字体 ",[33,988,874],{},"。没有「退而求其次用粗体版」的中间步骤。你要 bold-italic，得到的是普通。",[18,991,992],{},"修复方法是把要用的变体全部注册：",[38,994,996],{"className":40,"code":995,"language":42,"meta":43,"style":43},"package main\n\nimport (\n    \"log\"\n    \"os\"\n\n    \"github.com/gpdf-dev/gpdf\"\n    \"github.com/gpdf-dev/gpdf/document\"\n    \"github.com/gpdf-dev/gpdf/template\"\n)\n\nfunc main() {\n    regular := mustRead(\"NotoSansJP-Regular.ttf\")\n    bold := mustRead(\"NotoSansJP-Bold.ttf\")\n    italic := mustRead(\"NotoSansJP-Italic.ttf\")\n    boldItalic := mustRead(\"NotoSansJP-BoldItalic.ttf\")\n\n    doc := gpdf.NewDocument(\n        gpdf.WithPageSize(gpdf.A4),\n        gpdf.WithFont(\"NotoSansJP\", regular),\n        gpdf.WithFont(\"NotoSansJP-Bold\", bold),\n        gpdf.WithFont(\"NotoSansJP-Italic\", italic),\n        gpdf.WithFont(\"NotoSansJP-BoldItalic\", boldItalic),\n        gpdf.WithDefaultFont(\"NotoSansJP\", 12),\n    )\n\n    page := doc.AddPage()\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(\"普通文本\")\n            c.Text(\"强调\", template.Bold(), template.Italic())\n        })\n    })\n\n    data, _ := doc.Generate()\n    os.WriteFile(\"jp-emphasis.pdf\", data, 0o644)\n}\n\nfunc mustRead(path string) []byte {\n    b, err := os.ReadFile(path)\n    if err != nil { log.Fatal(err) }\n    return b\n}\n",[33,997,998,1004,1008,1014,1022,1030,1034,1042,1050,1058,1062,1066,1076,1097,1117,1137,1157,1161,1175,1193,1215,1237,1261,1284,1306,1310,1314,1328,1352,1382,1401,1436,1440,1444,1448,1467,1496,1501,1506,1532,1557,1587,1596],{"__ignoreMap":43},[47,999,1000,1002],{"class":49,"line":50},[47,1001,134],{"class":57},[47,1003,138],{"class":137},[47,1005,1006],{"class":49,"line":141},[47,1007,145],{"emptyLinePlaceholder":144},[47,1009,1010,1012],{"class":49,"line":148},[47,1011,152],{"class":151},[47,1013,155],{"class":57},[47,1015,1016,1018,1020],{"class":49,"line":158},[47,1017,161],{"class":57},[47,1019,164],{"class":137},[47,1021,167],{"class":57},[47,1023,1024,1026,1028],{"class":49,"line":170},[47,1025,161],{"class":57},[47,1027,175],{"class":137},[47,1029,167],{"class":57},[47,1031,1032],{"class":49,"line":180},[47,1033,145],{"emptyLinePlaceholder":144},[47,1035,1036,1038,1040],{"class":49,"line":185},[47,1037,161],{"class":57},[47,1039,190],{"class":137},[47,1041,167],{"class":57},[47,1043,1044,1046,1048],{"class":49,"line":195},[47,1045,161],{"class":57},[47,1047,200],{"class":137},[47,1049,167],{"class":57},[47,1051,1052,1054,1056],{"class":49,"line":205},[47,1053,161],{"class":57},[47,1055,210],{"class":137},[47,1057,167],{"class":57},[47,1059,1060],{"class":49,"line":215},[47,1061,218],{"class":57},[47,1063,1064],{"class":49,"line":221},[47,1065,145],{"emptyLinePlaceholder":144},[47,1067,1068,1070,1072,1074],{"class":49,"line":226},[47,1069,229],{"class":57},[47,1071,232],{"class":61},[47,1073,235],{"class":57},[47,1075,238],{"class":57},[47,1077,1078,1081,1083,1086,1088,1090,1093,1095],{"class":49,"line":241},[47,1079,1080],{"class":53},"    regular ",[47,1082,247],{"class":57},[47,1084,1085],{"class":61}," mustRead",[47,1087,65],{"class":57},[47,1089,68],{"class":57},[47,1091,1092],{"class":71},"NotoSansJP-Regular.ttf",[47,1094,68],{"class":57},[47,1096,218],{"class":57},[47,1098,1099,1102,1104,1106,1108,1110,1113,1115],{"class":49,"line":261},[47,1100,1101],{"class":53},"    bold ",[47,1103,247],{"class":57},[47,1105,1085],{"class":61},[47,1107,65],{"class":57},[47,1109,68],{"class":57},[47,1111,1112],{"class":71},"NotoSansJP-Bold.ttf",[47,1114,68],{"class":57},[47,1116,218],{"class":57},[47,1118,1119,1122,1124,1126,1128,1130,1133,1135],{"class":49,"line":285},[47,1120,1121],{"class":53},"    italic ",[47,1123,247],{"class":57},[47,1125,1085],{"class":61},[47,1127,65],{"class":57},[47,1129,68],{"class":57},[47,1131,1132],{"class":71},"NotoSansJP-Italic.ttf",[47,1134,68],{"class":57},[47,1136,218],{"class":57},[47,1138,1139,1142,1144,1146,1148,1150,1153,1155],{"class":49,"line":323},[47,1140,1141],{"class":53},"    boldItalic ",[47,1143,247],{"class":57},[47,1145,1085],{"class":61},[47,1147,65],{"class":57},[47,1149,68],{"class":57},[47,1151,1152],{"class":71},"NotoSansJP-BoldItalic.ttf",[47,1154,68],{"class":57},[47,1156,218],{"class":57},[47,1158,1159],{"class":49,"line":329},[47,1160,145],{"emptyLinePlaceholder":144},[47,1162,1163,1165,1167,1169,1171,1173],{"class":49,"line":334},[47,1164,244],{"class":53},[47,1166,247],{"class":57},[47,1168,250],{"class":53},[47,1170,58],{"class":57},[47,1172,255],{"class":61},[47,1174,258],{"class":57},[47,1176,1177,1179,1181,1183,1185,1187,1189,1191],{"class":49,"line":353},[47,1178,264],{"class":53},[47,1180,58],{"class":57},[47,1182,269],{"class":61},[47,1184,65],{"class":57},[47,1186,274],{"class":53},[47,1188,58],{"class":57},[47,1190,279],{"class":53},[47,1192,282],{"class":57},[47,1194,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213],{"class":49,"line":387},[47,1196,264],{"class":53},[47,1198,58],{"class":57},[47,1200,691],{"class":61},[47,1202,65],{"class":57},[47,1204,68],{"class":57},[47,1206,874],{"class":71},[47,1208,68],{"class":57},[47,1210,77],{"class":57},[47,1212,881],{"class":53},[47,1214,282],{"class":57},[47,1216,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235],{"class":49,"line":423},[47,1218,264],{"class":53},[47,1220,58],{"class":57},[47,1222,691],{"class":61},[47,1224,65],{"class":57},[47,1226,68],{"class":57},[47,1228,898],{"class":71},[47,1230,68],{"class":57},[47,1232,77],{"class":57},[47,1234,905],{"class":53},[47,1236,282],{"class":57},[47,1238,1239,1241,1243,1245,1247,1249,1252,1254,1256,1259],{"class":49,"line":444},[47,1240,264],{"class":53},[47,1242,58],{"class":57},[47,1244,691],{"class":61},[47,1246,65],{"class":57},[47,1248,68],{"class":57},[47,1250,1251],{"class":71},"NotoSansJP-Italic",[47,1253,68],{"class":57},[47,1255,77],{"class":57},[47,1257,1258],{"class":53}," italic",[47,1260,282],{"class":57},[47,1262,1263,1265,1267,1269,1271,1273,1275,1277,1279,1282],{"class":49,"line":472},[47,1264,264],{"class":53},[47,1266,58],{"class":57},[47,1268,691],{"class":61},[47,1270,65],{"class":57},[47,1272,68],{"class":57},[47,1274,985],{"class":71},[47,1276,68],{"class":57},[47,1278,77],{"class":57},[47,1280,1281],{"class":53}," boldItalic",[47,1283,282],{"class":57},[47,1285,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304],{"class":49,"line":500},[47,1287,264],{"class":53},[47,1289,58],{"class":57},[47,1291,916],{"class":61},[47,1293,65],{"class":57},[47,1295,68],{"class":57},[47,1297,874],{"class":71},[47,1299,68],{"class":57},[47,1301,77],{"class":57},[47,1303,929],{"class":316},[47,1305,282],{"class":57},[47,1307,1308],{"class":49,"line":536},[47,1309,326],{"class":57},[47,1311,1312],{"class":49,"line":542},[47,1313,145],{"emptyLinePlaceholder":144},[47,1315,1316,1318,1320,1322,1324,1326],{"class":49,"line":548},[47,1317,337],{"class":53},[47,1319,247],{"class":57},[47,1321,342],{"class":53},[47,1323,58],{"class":57},[47,1325,347],{"class":61},[47,1327,350],{"class":57},[47,1329,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350],{"class":49,"line":553},[47,1331,356],{"class":53},[47,1333,58],{"class":57},[47,1335,361],{"class":61},[47,1337,364],{"class":57},[47,1339,368],{"class":367},[47,1341,371],{"class":57},[47,1343,374],{"class":137},[47,1345,58],{"class":57},[47,1347,379],{"class":137},[47,1349,382],{"class":57},[47,1351,238],{"class":57},[47,1353,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1378,1380],{"class":49,"line":575},[47,1355,390],{"class":53},[47,1357,58],{"class":57},[47,1359,395],{"class":61},[47,1361,65],{"class":57},[47,1363,400],{"class":316},[47,1365,77],{"class":57},[47,1367,405],{"class":57},[47,1369,54],{"class":367},[47,1371,371],{"class":57},[47,1373,374],{"class":137},[47,1375,58],{"class":57},[47,1377,416],{"class":137},[47,1379,382],{"class":57},[47,1381,238],{"class":57},[47,1383,1384,1386,1388,1390,1392,1394,1397,1399],{"class":49,"line":591},[47,1385,426],{"class":53},[47,1387,58],{"class":57},[47,1389,62],{"class":61},[47,1391,65],{"class":57},[47,1393,68],{"class":57},[47,1395,1396],{"class":71},"普通文本",[47,1398,68],{"class":57},[47,1400,218],{"class":57},[47,1402,1403,1405,1407,1409,1411,1413,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434],{"class":49,"line":609},[47,1404,426],{"class":53},[47,1406,58],{"class":57},[47,1408,62],{"class":61},[47,1410,65],{"class":57},[47,1412,68],{"class":57},[47,1414,1415],{"class":71},"强调",[47,1417,68],{"class":57},[47,1419,77],{"class":57},[47,1421,80],{"class":53},[47,1423,58],{"class":57},[47,1425,85],{"class":61},[47,1427,88],{"class":57},[47,1429,80],{"class":53},[47,1431,58],{"class":57},[47,1433,95],{"class":61},[47,1435,98],{"class":57},[47,1437,1438],{"class":49,"line":615},[47,1439,539],{"class":57},[47,1441,1442],{"class":49,"line":662},[47,1443,545],{"class":57},[47,1445,1446],{"class":49,"line":677},[47,1447,145],{"emptyLinePlaceholder":144},[47,1449,1450,1452,1454,1457,1459,1461,1463,1465],{"class":49,"line":682},[47,1451,556],{"class":53},[47,1453,77],{"class":57},[47,1455,1456],{"class":53}," _ ",[47,1458,247],{"class":57},[47,1460,342],{"class":53},[47,1462,58],{"class":57},[47,1464,570],{"class":61},[47,1466,350],{"class":57},[47,1468,1470,1473,1475,1477,1479,1481,1484,1486,1488,1490,1492,1494],{"class":49,"line":1469},36,[47,1471,1472],{"class":53},"    os",[47,1474,58],{"class":57},[47,1476,629],{"class":61},[47,1478,65],{"class":57},[47,1480,68],{"class":57},[47,1482,1483],{"class":71},"jp-emphasis.pdf",[47,1485,68],{"class":57},[47,1487,77],{"class":57},[47,1489,643],{"class":53},[47,1491,77],{"class":57},[47,1493,648],{"class":316},[47,1495,218],{"class":57},[47,1497,1499],{"class":49,"line":1498},37,[47,1500,685],{"class":57},[47,1502,1504],{"class":49,"line":1503},38,[47,1505,145],{"emptyLinePlaceholder":144},[47,1507,1509,1511,1513,1515,1518,1522,1524,1527,1530],{"class":49,"line":1508},39,[47,1510,229],{"class":57},[47,1512,1085],{"class":61},[47,1514,65],{"class":57},[47,1516,1517],{"class":367},"path",[47,1519,1521],{"class":1520},"spNyl"," string",[47,1523,382],{"class":57},[47,1525,1526],{"class":57}," []",[47,1528,1529],{"class":1520},"byte",[47,1531,238],{"class":57},[47,1533,1535,1538,1540,1542,1544,1546,1548,1551,1553,1555],{"class":49,"line":1534},40,[47,1536,1537],{"class":53},"    b",[47,1539,77],{"class":57},[47,1541,561],{"class":53},[47,1543,247],{"class":57},[47,1545,624],{"class":53},[47,1547,58],{"class":57},[47,1549,1550],{"class":61},"ReadFile",[47,1552,65],{"class":57},[47,1554,1517],{"class":53},[47,1556,218],{"class":57},[47,1558,1560,1562,1564,1566,1568,1571,1574,1576,1578,1580,1582,1584],{"class":49,"line":1559},41,[47,1561,578],{"class":151},[47,1563,561],{"class":53},[47,1565,583],{"class":57},[47,1567,586],{"class":57},[47,1569,1570],{"class":57}," {",[47,1572,1573],{"class":53}," log",[47,1575,58],{"class":57},[47,1577,599],{"class":61},[47,1579,65],{"class":57},[47,1581,604],{"class":53},[47,1583,382],{"class":57},[47,1585,1586],{"class":57}," }\n",[47,1588,1590,1593],{"class":49,"line":1589},42,[47,1591,1592],{"class":151},"    return",[47,1594,1595],{"class":53}," b\n",[47,1597,1599],{"class":49,"line":1598},43,[47,1600,685],{"class":57},[18,1602,1603,1604,1607,1608,1610,1611,1613],{},"顺便说一句，Noto Sans JP 官方发行版其实没有斜体（slanted）字重——日文排版本来就很少用斜体——所以实际的日文文档大多数只注册 regular 和 bold，日文 span 上干脆不用 ",[33,1605,1606],{},"template.Italic()","。这样没问题。规则是：某个字体族你从不调用 ",[33,1609,733],{},"，就不需要它的斜体变体。只有调用了 ",[33,1612,733],{}," 却没有注册对应文件时才会踩坑。",[14,1615,1616],{"id":1616},"在同一段中混合粗体和斜体",[18,1618,1619,1621,1622,1625],{},[33,1620,35],{}," 给整个字符串应用一种样式。想在句中局部强调用 ",[33,1623,1624],{},"c.RichText","：",[38,1627,1629],{"className":40,"code":1628,"language":42,"meta":43,"style":43},"c.RichText(func(rt *template.RichTextBuilder) {\n    rt.Span(\"The \")\n    rt.Span(\"quick brown fox\", template.Bold(), template.Italic())\n    rt.Span(\" jumps over the lazy dog.\")\n})\n",[33,1630,1631,1658,1679,1714,1733],{"__ignoreMap":43},[47,1632,1633,1635,1637,1640,1642,1645,1647,1649,1651,1654,1656],{"class":49,"line":50},[47,1634,54],{"class":53},[47,1636,58],{"class":57},[47,1638,1639],{"class":61},"RichText",[47,1641,364],{"class":57},[47,1643,1644],{"class":367},"rt",[47,1646,371],{"class":57},[47,1648,374],{"class":137},[47,1650,58],{"class":57},[47,1652,1653],{"class":137},"RichTextBuilder",[47,1655,382],{"class":57},[47,1657,238],{"class":57},[47,1659,1660,1663,1665,1668,1670,1672,1675,1677],{"class":49,"line":141},[47,1661,1662],{"class":53},"    rt",[47,1664,58],{"class":57},[47,1666,1667],{"class":61},"Span",[47,1669,65],{"class":57},[47,1671,68],{"class":57},[47,1673,1674],{"class":71},"The ",[47,1676,68],{"class":57},[47,1678,218],{"class":57},[47,1680,1681,1683,1685,1687,1689,1691,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712],{"class":49,"line":148},[47,1682,1662],{"class":53},[47,1684,58],{"class":57},[47,1686,1667],{"class":61},[47,1688,65],{"class":57},[47,1690,68],{"class":57},[47,1692,1693],{"class":71},"quick brown fox",[47,1695,68],{"class":57},[47,1697,77],{"class":57},[47,1699,80],{"class":53},[47,1701,58],{"class":57},[47,1703,85],{"class":61},[47,1705,88],{"class":57},[47,1707,80],{"class":53},[47,1709,58],{"class":57},[47,1711,95],{"class":61},[47,1713,98],{"class":57},[47,1715,1716,1718,1720,1722,1724,1726,1729,1731],{"class":49,"line":158},[47,1717,1662],{"class":53},[47,1719,58],{"class":57},[47,1721,1667],{"class":61},[47,1723,65],{"class":57},[47,1725,68],{"class":57},[47,1727,1728],{"class":71}," jumps over the lazy dog.",[47,1730,68],{"class":57},[47,1732,218],{"class":57},[47,1734,1735],{"class":49,"line":170},[47,1736,1737],{"class":57},"})\n",[18,1739,1740,1741,1744,1745,1747,1748,1750,1751,1753,1754,1756,1757,1759],{},"每个 ",[33,1742,1743],{},"rt.Span"," 有自己的样式标志，布局引擎会像字处理软件那样在 span 之间换行。在单个 ",[33,1746,1667],{}," 上同时给 ",[33,1749,728],{}," + ",[33,1752,733],{}," 和在 ",[33,1755,35],{}," 上一样，走同一个 ",[33,1758,108],{}," 变体查找——是同一套代码。",[18,1761,1762,1763,1765,1766,1768,1769,1765,1772,1775,1776,1779,1780,1765,1783,1786],{},"还有一点值得指出：",[33,1764,728],{}," 和 ",[33,1767,733],{}," 是可交换的。",[33,1770,1771],{},"template.Italic(), template.Bold()",[33,1773,1774],{},"template.Bold(), template.Italic()"," 输出完全相同。它们只是在同一个 ",[33,1777,1778],{},"document.Style"," 上设置两个不同字段（",[33,1781,1782],{},"FontWeight",[33,1784,1785],{},"FontStyle","），顺序无关紧要。",[14,1788,1789],{"id":1789},"相关食谱",[1791,1792,1793,1805,1812],"ul",{},[1794,1795,1796,1801,1802,1804],"li",{},[1797,1798,1800],"a",{"href":1799},"/zh/blog/embed-japanese-font","如何在 gpdf 中嵌入日文字体"," —— ",[33,1803,691],{}," 完整用法，包含 4 变体模式",[1794,1806,1807,1811],{},[1797,1808,1810],{"href":1809},"/zh/blog/tofu-boxes-japanese","为什么 PDF 中日文显示为空心方块（豆腐字）"," —— 基础字体也未注册时「静默回退」是什么样子",[1794,1813,1814,1818,1819,1822],{},[1797,1815,1817],{"href":1816},"/zh/blog/noto-sans-jp-with-gpdf","如何在 gpdf 中使用 Noto Sans JP"," —— 挑选哪个 Noto 文件，以及 ",[33,1820,1821],{},"go:embed"," 如何简化分发",[14,1824,1826],{"id":1825},"试试-gpdf","试试 gpdf",[18,1828,1829],{},"gpdf 是 Go 的 PDF 生成库。MIT 协议，零外部依赖，原生支持 CJK。",[38,1831,1835],{"className":1832,"code":1833,"language":1834,"meta":43,"style":43},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[33,1836,1837],{"__ignoreMap":43},[47,1838,1839,1841,1844],{"class":49,"line":50},[47,1840,42],{"class":137},[47,1842,1843],{"class":71}," get",[47,1845,1846],{"class":71}," github.com/gpdf-dev/gpdf\n",[18,1848,1849,1855,1856],{},[1797,1850,1854],{"href":1851,"rel":1852},"https://github.com/gpdf-dev/gpdf",[1853],"nofollow","⭐ Star on GitHub"," · ",[1797,1857,1860],{"href":1858,"rel":1859},"https://gpdf.dev/zh/docs/quickstart",[1853],"阅读文档",[1862,1863,1864],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":43,"searchDepth":141,"depth":141,"links":1866},[1867,1868,1869,1870,1871,1872,1873,1874],{"id":16,"depth":141,"text":16},{"id":28,"depth":141,"text":28},{"id":123,"depth":141,"text":124},{"id":709,"depth":141,"text":710},{"id":824,"depth":141,"text":825},{"id":1616,"depth":141,"text":1616},{"id":1789,"depth":141,"text":1789},{"id":1825,"depth":141,"text":1826},"2026-04-23","在同一个 span 上传入 template.Bold() 和 template.Italic() 即可。但是 TrueType 字体必须注册全部 4 个变体，否则 BoldItalic 查找会静默回退到基础字体。",false,"md",{"name":1880,"totalTime":1881,"tools":1882,"steps":1884},"在 gpdf 中同时应用粗体和斜体","PT10M",[1883],"Go 1.22+",[1885,1888,1891,1894],{"name":1886,"text":1887},"在同一个 c.Text 调用上同时传入 Bold() 和 Italic()","写 c.Text(\"注意\", template.Bold(), template.Italic())。gpdf 会拼出变体 ID Family-BoldItalic 并在已注册字体中查找。",{"name":1889,"text":1890},"让 Helvetica 和 Courier 使用内置别名","Helvetica-BoldItalic 和 Courier-BoldItalic 会自动别名到 Adobe 的 -BoldOblique 度量。Standard 14 字体族不需要 WithFont 调用。",{"name":1892,"text":1893},"为 TrueType 字体族注册全部 4 个变体","对 NotoSansJP 等 TTF，WithFont 要调用 4 次：NotoSansJP, NotoSansJP-Bold, NotoSansJP-Italic, NotoSansJP-BoldItalic。缺失的变体会回退到基础字体，而不是粗体。",{"name":1895,"text":1896},"在一段中混合粗体和斜体用 RichText","句中局部强调用 c.RichText(func(rt) { rt.Span(\"普通\") ; rt.Span(\"粗体斜体\", template.Bold(), template.Italic()) })。",null,{},"/zh/blog/bold-italic-together",{"title":5,"description":1876},"zh/blog/013.bold-italic-together",[1903,1904],"recipe","tutorial","RMXzbZYJd_yCL49PQi5Lnobp94HmjDjei0Tx9_TOUlM",1779199017967]