[{"data":1,"prerenderedAt":1908},["ShallowReactive",2],{"blog-ja-bold-italic-together":3},{"id":4,"title":5,"author":6,"body":10,"date":1877,"description":1878,"draft":1879,"extension":1880,"howTo":1881,"image":1899,"meta":1900,"navigation":144,"path":1901,"seo":1902,"stem":1903,"tags":1904,"updated":1899,"__hash__":1907},"blogJa/ja/blog/013.bold-italic-together.md","gpdf で Bold と Italic を同時に指定する方法",{"name":7,"url":8,"avatar":9},"野田大貴","https://nadai.dev/ja/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":1867},"minimark",[13,17,26,29,37,99,118,121,125,686,707,711,714,791,823,827,834,981,991,994,1602,1615,1619,1628,1740,1762,1789,1792,1825,1829,1832,1849,1863],[14,15,16],"h2",{"id":16},"質問を言い換えると",[18,19,20,21,25],"p",{},"1 単語、あるいは 1 行だけを 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 は ",[33,103,104],{},"Family-BoldItalic"," というバリアント ID を組み立てて登録済みフォントを引く。Adobe Standard 14 ファミリー (Helvetica, Courier, Times) では何もせずに動く — gpdf が ",[33,107,108],{},"-BoldItalic"," を正式名の ",[33,111,112],{},"-BoldOblique"," に内部的にエイリアスし、ビルトインの AFM メトリクスを使うからだ。自分で登録する TrueType フォントの場合、",[22,115,116],{},"4 つのバリアントを全部登録","しないと、ルックアップは静かに base family にフォールバックする。",[18,119,120],{},"バグのほとんどはこの 2 点目で生まれる。",[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 は ",[33,694,695],{},"Helvetica",", ",[33,698,699],{},"Helvetica-Bold",[33,701,702],{},"Helvetica-Oblique",[33,704,705],{},"Helvetica-BoldOblique"," を未埋め込みの Type 1 エントリとして参照する。どの 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,778],"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,777],{},[33,772,773],{},"Helvetica-Italic"," → ",[33,776,702],{}," にエイリアス",[721,779,780,782,784],{},[743,781,756],{},[743,783,756],{},[743,785,786,774,789,777],{},[33,787,788],{},"Helvetica-BoldItalic",[33,790,705],{},[18,792,793,794,797,798,801,802,804,805,807,808,810,811,807,813,815,816,801,819,822],{},"エイリアスのステップが Helvetica の特殊なところ。",[33,795,796],{},"buildFontVariantID"," はファミリーに関係なく汎用の ",[33,799,800],{},"-Italic"," / ",[33,803,108],{}," サフィックスを常に出す。その後、Standard 14 の init フックが ",[33,806,773],{}," を ",[33,809,702],{}," に、",[33,812,788],{},[33,814,705],{}," にマップし直す。こうしてメトリクスがビューアの描画と一致する。Courier も同じ扱い。Times はエイリアスが不要で、正式名がそのまま ",[33,817,818],{},"Times-Italic",[33,820,821],{},"Times-BoldItalic"," になっている。",[14,824,826],{"id":825},"罠-truetype-フォントは-4-つ全部の登録が必要","罠: TrueType フォントは 4 つ全部の登録が必要",[18,828,829,830,833],{},"CJK 文書が静かに壊れるのはここ。Noto Sans JP を登録していても、どれかのバリアントを忘れると、欠けたスロットは Bold や Italic 経由では",[22,831,832],{},"なく","、直接 base family に落ちる。",[38,835,837],{"className":40,"code":836,"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,838,839,845,860,885,909,933,937,941,946],{"__ignoreMap":43},[47,840,841],{"class":49,"line":50},[47,842,844],{"class":843},"sHwdD","// 一見正しく見える。そうじゃない。\n",[47,846,847,850,852,854,856,858],{"class":49,"line":141},[47,848,849],{"class":53},"doc ",[47,851,247],{"class":57},[47,853,250],{"class":53},[47,855,58],{"class":57},[47,857,255],{"class":61},[47,859,258],{"class":57},[47,861,862,865,867,869,871,873,876,878,880,883],{"class":49,"line":148},[47,863,864],{"class":53},"    gpdf",[47,866,58],{"class":57},[47,868,691],{"class":61},[47,870,65],{"class":57},[47,872,68],{"class":57},[47,874,875],{"class":71},"NotoSansJP",[47,877,68],{"class":57},[47,879,77],{"class":57},[47,881,882],{"class":53}," regular",[47,884,282],{"class":57},[47,886,887,889,891,893,895,897,900,902,904,907],{"class":49,"line":158},[47,888,864],{"class":53},[47,890,58],{"class":57},[47,892,691],{"class":61},[47,894,65],{"class":57},[47,896,68],{"class":57},[47,898,899],{"class":71},"NotoSansJP-Bold",[47,901,68],{"class":57},[47,903,77],{"class":57},[47,905,906],{"class":53}," bold",[47,908,282],{"class":57},[47,910,911,913,915,918,920,922,924,926,928,931],{"class":49,"line":170},[47,912,864],{"class":53},[47,914,58],{"class":57},[47,916,917],{"class":61},"WithDefaultFont",[47,919,65],{"class":57},[47,921,68],{"class":57},[47,923,875],{"class":71},[47,925,68],{"class":57},[47,927,77],{"class":57},[47,929,930],{"class":316}," 12",[47,932,282],{"class":57},[47,934,935],{"class":49,"line":180},[47,936,218],{"class":57},[47,938,939],{"class":49,"line":185},[47,940,145],{"emptyLinePlaceholder":144},[47,942,943],{"class":49,"line":195},[47,944,945],{"class":843},"// ここは NotoSansJP (通常) で描画される — 太字でも斜体でもない。\n",[47,947,948,950,952,954,956,958,961,963,965,967,969,971,973,975,977,979],{"class":49,"line":205},[47,949,54],{"class":53},[47,951,58],{"class":57},[47,953,62],{"class":61},[47,955,65],{"class":57},[47,957,68],{"class":57},[47,959,960],{"class":71},"強調したい",[47,962,68],{"class":57},[47,964,77],{"class":57},[47,966,80],{"class":53},[47,968,58],{"class":57},[47,970,85],{"class":61},[47,972,88],{"class":57},[47,974,80],{"class":53},[47,976,58],{"class":57},[47,978,95],{"class":61},[47,980,98],{"class":57},[18,982,983,984,987,988,990],{},"理由はリゾルバの実装にある。まず ",[33,985,986],{},"NotoSansJP-BoldItalic"," を引き、ヒットしないと、ぴたり 1 つだけにフォールバックする: base family の ",[33,989,875],{},"。「せめて bold 版」という中間ステップは存在しない。bold-italic を頼んだのに通常が返ってきた、という出力になる。",[18,992,993],{},"対策は、使うバリアントを全部登録すること:",[38,995,997],{"className":40,"code":996,"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,998,999,1005,1009,1015,1023,1031,1035,1043,1051,1059,1063,1067,1077,1098,1118,1138,1158,1162,1176,1194,1216,1238,1262,1285,1307,1311,1315,1329,1353,1383,1402,1437,1441,1445,1449,1468,1497,1502,1507,1533,1558,1588,1597],{"__ignoreMap":43},[47,1000,1001,1003],{"class":49,"line":50},[47,1002,134],{"class":57},[47,1004,138],{"class":137},[47,1006,1007],{"class":49,"line":141},[47,1008,145],{"emptyLinePlaceholder":144},[47,1010,1011,1013],{"class":49,"line":148},[47,1012,152],{"class":151},[47,1014,155],{"class":57},[47,1016,1017,1019,1021],{"class":49,"line":158},[47,1018,161],{"class":57},[47,1020,164],{"class":137},[47,1022,167],{"class":57},[47,1024,1025,1027,1029],{"class":49,"line":170},[47,1026,161],{"class":57},[47,1028,175],{"class":137},[47,1030,167],{"class":57},[47,1032,1033],{"class":49,"line":180},[47,1034,145],{"emptyLinePlaceholder":144},[47,1036,1037,1039,1041],{"class":49,"line":185},[47,1038,161],{"class":57},[47,1040,190],{"class":137},[47,1042,167],{"class":57},[47,1044,1045,1047,1049],{"class":49,"line":195},[47,1046,161],{"class":57},[47,1048,200],{"class":137},[47,1050,167],{"class":57},[47,1052,1053,1055,1057],{"class":49,"line":205},[47,1054,161],{"class":57},[47,1056,210],{"class":137},[47,1058,167],{"class":57},[47,1060,1061],{"class":49,"line":215},[47,1062,218],{"class":57},[47,1064,1065],{"class":49,"line":221},[47,1066,145],{"emptyLinePlaceholder":144},[47,1068,1069,1071,1073,1075],{"class":49,"line":226},[47,1070,229],{"class":57},[47,1072,232],{"class":61},[47,1074,235],{"class":57},[47,1076,238],{"class":57},[47,1078,1079,1082,1084,1087,1089,1091,1094,1096],{"class":49,"line":241},[47,1080,1081],{"class":53},"    regular ",[47,1083,247],{"class":57},[47,1085,1086],{"class":61}," mustRead",[47,1088,65],{"class":57},[47,1090,68],{"class":57},[47,1092,1093],{"class":71},"NotoSansJP-Regular.ttf",[47,1095,68],{"class":57},[47,1097,218],{"class":57},[47,1099,1100,1103,1105,1107,1109,1111,1114,1116],{"class":49,"line":261},[47,1101,1102],{"class":53},"    bold ",[47,1104,247],{"class":57},[47,1106,1086],{"class":61},[47,1108,65],{"class":57},[47,1110,68],{"class":57},[47,1112,1113],{"class":71},"NotoSansJP-Bold.ttf",[47,1115,68],{"class":57},[47,1117,218],{"class":57},[47,1119,1120,1123,1125,1127,1129,1131,1134,1136],{"class":49,"line":285},[47,1121,1122],{"class":53},"    italic ",[47,1124,247],{"class":57},[47,1126,1086],{"class":61},[47,1128,65],{"class":57},[47,1130,68],{"class":57},[47,1132,1133],{"class":71},"NotoSansJP-Italic.ttf",[47,1135,68],{"class":57},[47,1137,218],{"class":57},[47,1139,1140,1143,1145,1147,1149,1151,1154,1156],{"class":49,"line":323},[47,1141,1142],{"class":53},"    boldItalic ",[47,1144,247],{"class":57},[47,1146,1086],{"class":61},[47,1148,65],{"class":57},[47,1150,68],{"class":57},[47,1152,1153],{"class":71},"NotoSansJP-BoldItalic.ttf",[47,1155,68],{"class":57},[47,1157,218],{"class":57},[47,1159,1160],{"class":49,"line":329},[47,1161,145],{"emptyLinePlaceholder":144},[47,1163,1164,1166,1168,1170,1172,1174],{"class":49,"line":334},[47,1165,244],{"class":53},[47,1167,247],{"class":57},[47,1169,250],{"class":53},[47,1171,58],{"class":57},[47,1173,255],{"class":61},[47,1175,258],{"class":57},[47,1177,1178,1180,1182,1184,1186,1188,1190,1192],{"class":49,"line":353},[47,1179,264],{"class":53},[47,1181,58],{"class":57},[47,1183,269],{"class":61},[47,1185,65],{"class":57},[47,1187,274],{"class":53},[47,1189,58],{"class":57},[47,1191,279],{"class":53},[47,1193,282],{"class":57},[47,1195,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214],{"class":49,"line":387},[47,1197,264],{"class":53},[47,1199,58],{"class":57},[47,1201,691],{"class":61},[47,1203,65],{"class":57},[47,1205,68],{"class":57},[47,1207,875],{"class":71},[47,1209,68],{"class":57},[47,1211,77],{"class":57},[47,1213,882],{"class":53},[47,1215,282],{"class":57},[47,1217,1218,1220,1222,1224,1226,1228,1230,1232,1234,1236],{"class":49,"line":423},[47,1219,264],{"class":53},[47,1221,58],{"class":57},[47,1223,691],{"class":61},[47,1225,65],{"class":57},[47,1227,68],{"class":57},[47,1229,899],{"class":71},[47,1231,68],{"class":57},[47,1233,77],{"class":57},[47,1235,906],{"class":53},[47,1237,282],{"class":57},[47,1239,1240,1242,1244,1246,1248,1250,1253,1255,1257,1260],{"class":49,"line":444},[47,1241,264],{"class":53},[47,1243,58],{"class":57},[47,1245,691],{"class":61},[47,1247,65],{"class":57},[47,1249,68],{"class":57},[47,1251,1252],{"class":71},"NotoSansJP-Italic",[47,1254,68],{"class":57},[47,1256,77],{"class":57},[47,1258,1259],{"class":53}," italic",[47,1261,282],{"class":57},[47,1263,1264,1266,1268,1270,1272,1274,1276,1278,1280,1283],{"class":49,"line":472},[47,1265,264],{"class":53},[47,1267,58],{"class":57},[47,1269,691],{"class":61},[47,1271,65],{"class":57},[47,1273,68],{"class":57},[47,1275,986],{"class":71},[47,1277,68],{"class":57},[47,1279,77],{"class":57},[47,1281,1282],{"class":53}," boldItalic",[47,1284,282],{"class":57},[47,1286,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305],{"class":49,"line":500},[47,1288,264],{"class":53},[47,1290,58],{"class":57},[47,1292,917],{"class":61},[47,1294,65],{"class":57},[47,1296,68],{"class":57},[47,1298,875],{"class":71},[47,1300,68],{"class":57},[47,1302,77],{"class":57},[47,1304,930],{"class":316},[47,1306,282],{"class":57},[47,1308,1309],{"class":49,"line":536},[47,1310,326],{"class":57},[47,1312,1313],{"class":49,"line":542},[47,1314,145],{"emptyLinePlaceholder":144},[47,1316,1317,1319,1321,1323,1325,1327],{"class":49,"line":548},[47,1318,337],{"class":53},[47,1320,247],{"class":57},[47,1322,342],{"class":53},[47,1324,58],{"class":57},[47,1326,347],{"class":61},[47,1328,350],{"class":57},[47,1330,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351],{"class":49,"line":553},[47,1332,356],{"class":53},[47,1334,58],{"class":57},[47,1336,361],{"class":61},[47,1338,364],{"class":57},[47,1340,368],{"class":367},[47,1342,371],{"class":57},[47,1344,374],{"class":137},[47,1346,58],{"class":57},[47,1348,379],{"class":137},[47,1350,382],{"class":57},[47,1352,238],{"class":57},[47,1354,1355,1357,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381],{"class":49,"line":575},[47,1356,390],{"class":53},[47,1358,58],{"class":57},[47,1360,395],{"class":61},[47,1362,65],{"class":57},[47,1364,400],{"class":316},[47,1366,77],{"class":57},[47,1368,405],{"class":57},[47,1370,54],{"class":367},[47,1372,371],{"class":57},[47,1374,374],{"class":137},[47,1376,58],{"class":57},[47,1378,416],{"class":137},[47,1380,382],{"class":57},[47,1382,238],{"class":57},[47,1384,1385,1387,1389,1391,1393,1395,1398,1400],{"class":49,"line":591},[47,1386,426],{"class":53},[47,1388,58],{"class":57},[47,1390,62],{"class":61},[47,1392,65],{"class":57},[47,1394,68],{"class":57},[47,1396,1397],{"class":71},"通常のテキスト",[47,1399,68],{"class":57},[47,1401,218],{"class":57},[47,1403,1404,1406,1408,1410,1412,1414,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435],{"class":49,"line":609},[47,1405,426],{"class":53},[47,1407,58],{"class":57},[47,1409,62],{"class":61},[47,1411,65],{"class":57},[47,1413,68],{"class":57},[47,1415,1416],{"class":71},"強調",[47,1418,68],{"class":57},[47,1420,77],{"class":57},[47,1422,80],{"class":53},[47,1424,58],{"class":57},[47,1426,85],{"class":61},[47,1428,88],{"class":57},[47,1430,80],{"class":53},[47,1432,58],{"class":57},[47,1434,95],{"class":61},[47,1436,98],{"class":57},[47,1438,1439],{"class":49,"line":615},[47,1440,539],{"class":57},[47,1442,1443],{"class":49,"line":662},[47,1444,545],{"class":57},[47,1446,1447],{"class":49,"line":677},[47,1448,145],{"emptyLinePlaceholder":144},[47,1450,1451,1453,1455,1458,1460,1462,1464,1466],{"class":49,"line":682},[47,1452,556],{"class":53},[47,1454,77],{"class":57},[47,1456,1457],{"class":53}," _ ",[47,1459,247],{"class":57},[47,1461,342],{"class":53},[47,1463,58],{"class":57},[47,1465,570],{"class":61},[47,1467,350],{"class":57},[47,1469,1471,1474,1476,1478,1480,1482,1485,1487,1489,1491,1493,1495],{"class":49,"line":1470},36,[47,1472,1473],{"class":53},"    os",[47,1475,58],{"class":57},[47,1477,629],{"class":61},[47,1479,65],{"class":57},[47,1481,68],{"class":57},[47,1483,1484],{"class":71},"jp-emphasis.pdf",[47,1486,68],{"class":57},[47,1488,77],{"class":57},[47,1490,643],{"class":53},[47,1492,77],{"class":57},[47,1494,648],{"class":316},[47,1496,218],{"class":57},[47,1498,1500],{"class":49,"line":1499},37,[47,1501,685],{"class":57},[47,1503,1505],{"class":49,"line":1504},38,[47,1506,145],{"emptyLinePlaceholder":144},[47,1508,1510,1512,1514,1516,1519,1523,1525,1528,1531],{"class":49,"line":1509},39,[47,1511,229],{"class":57},[47,1513,1086],{"class":61},[47,1515,65],{"class":57},[47,1517,1518],{"class":367},"path",[47,1520,1522],{"class":1521},"spNyl"," string",[47,1524,382],{"class":57},[47,1526,1527],{"class":57}," []",[47,1529,1530],{"class":1521},"byte",[47,1532,238],{"class":57},[47,1534,1536,1539,1541,1543,1545,1547,1549,1552,1554,1556],{"class":49,"line":1535},40,[47,1537,1538],{"class":53},"    b",[47,1540,77],{"class":57},[47,1542,561],{"class":53},[47,1544,247],{"class":57},[47,1546,624],{"class":53},[47,1548,58],{"class":57},[47,1550,1551],{"class":61},"ReadFile",[47,1553,65],{"class":57},[47,1555,1518],{"class":53},[47,1557,218],{"class":57},[47,1559,1561,1563,1565,1567,1569,1572,1575,1577,1579,1581,1583,1585],{"class":49,"line":1560},41,[47,1562,578],{"class":151},[47,1564,561],{"class":53},[47,1566,583],{"class":57},[47,1568,586],{"class":57},[47,1570,1571],{"class":57}," {",[47,1573,1574],{"class":53}," log",[47,1576,58],{"class":57},[47,1578,599],{"class":61},[47,1580,65],{"class":57},[47,1582,604],{"class":53},[47,1584,382],{"class":57},[47,1586,1587],{"class":57}," }\n",[47,1589,1591,1594],{"class":49,"line":1590},42,[47,1592,1593],{"class":151},"    return",[47,1595,1596],{"class":53}," b\n",[47,1598,1600],{"class":49,"line":1599},43,[47,1601,685],{"class":57},[18,1603,1604,1605,1608,1609,1611,1612,1614],{},"ちなみに Noto Sans JP の公式配布には実は斜体 (slanted) のカットが存在しない — 和文の斜体組版はそもそも珍しい — ので、実際の日本語文書では regular と bold だけ登録して ",[33,1606,1607],{},"template.Italic()"," は日本語 span には使わない、という運用がほとんど。それで問題ない。ルールはこうだ: そのファミリーで ",[33,1610,733],{}," を一度も呼ばないなら、italic バリアントは不要。",[33,1613,733],{}," を呼ぶのにファイルを登録していない時だけ、罠になる。",[14,1616,1618],{"id":1617},"一段落の中で-bold-と-italic-を混ぜる","一段落の中で Bold と Italic を混ぜる",[18,1620,1621,1623,1624,1627],{},[33,1622,35],{}," は文字列全体に 1 つのスタイルを当てる。文中で一部だけ強調するには ",[33,1625,1626],{},"c.RichText",":",[38,1629,1631],{"className":40,"code":1630,"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,1632,1633,1660,1681,1716,1735],{"__ignoreMap":43},[47,1634,1635,1637,1639,1642,1644,1647,1649,1651,1653,1656,1658],{"class":49,"line":50},[47,1636,54],{"class":53},[47,1638,58],{"class":57},[47,1640,1641],{"class":61},"RichText",[47,1643,364],{"class":57},[47,1645,1646],{"class":367},"rt",[47,1648,371],{"class":57},[47,1650,374],{"class":137},[47,1652,58],{"class":57},[47,1654,1655],{"class":137},"RichTextBuilder",[47,1657,382],{"class":57},[47,1659,238],{"class":57},[47,1661,1662,1665,1667,1670,1672,1674,1677,1679],{"class":49,"line":141},[47,1663,1664],{"class":53},"    rt",[47,1666,58],{"class":57},[47,1668,1669],{"class":61},"Span",[47,1671,65],{"class":57},[47,1673,68],{"class":57},[47,1675,1676],{"class":71},"The ",[47,1678,68],{"class":57},[47,1680,218],{"class":57},[47,1682,1683,1685,1687,1689,1691,1693,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714],{"class":49,"line":148},[47,1684,1664],{"class":53},[47,1686,58],{"class":57},[47,1688,1669],{"class":61},[47,1690,65],{"class":57},[47,1692,68],{"class":57},[47,1694,1695],{"class":71},"quick brown fox",[47,1697,68],{"class":57},[47,1699,77],{"class":57},[47,1701,80],{"class":53},[47,1703,58],{"class":57},[47,1705,85],{"class":61},[47,1707,88],{"class":57},[47,1709,80],{"class":53},[47,1711,58],{"class":57},[47,1713,95],{"class":61},[47,1715,98],{"class":57},[47,1717,1718,1720,1722,1724,1726,1728,1731,1733],{"class":49,"line":158},[47,1719,1664],{"class":53},[47,1721,58],{"class":57},[47,1723,1669],{"class":61},[47,1725,65],{"class":57},[47,1727,68],{"class":57},[47,1729,1730],{"class":71}," jumps over the lazy dog.",[47,1732,68],{"class":57},[47,1734,218],{"class":57},[47,1736,1737],{"class":49,"line":170},[47,1738,1739],{"class":57},"})\n",[18,1741,1742,1743,1746,1747,1749,1750,1752,1753,1755,1756,1758,1759,1761],{},"各 ",[33,1744,1745],{},"rt.Span"," が独自のスタイルフラグを持ち、レイアウトエンジンはワードプロセッサと同じ要領で span 間の改行を処理する。",[33,1748,728],{}," + ",[33,1751,733],{}," を 1 つの ",[33,1754,1669],{}," に付けた場合、",[33,1757,35],{}," と同じ ",[33,1760,108],{}," バリアントのルックアップに行く — コードパスは共通だ。",[18,1763,1764,1765,1767,1768,1770,1771,1767,1774,1777,1778,1781,1782,1767,1785,1788],{},"もう 1 つ書いておく: ",[33,1766,728],{}," と ",[33,1769,733],{}," は可換 (commutative)。",[33,1772,1773],{},"template.Italic(), template.Bold()",[33,1775,1776],{},"template.Bold(), template.Italic()"," は同じ出力になる。同じ ",[33,1779,1780],{},"document.Style"," の別々のフィールド (",[33,1783,1784],{},"FontWeight",[33,1786,1787],{},"FontStyle",") をセットしているだけなので、順序は関係ない。",[14,1790,1791],{"id":1791},"関連レシピ",[1793,1794,1795,1807,1814],"ul",{},[1796,1797,1798,1803,1804,1806],"li",{},[1799,1800,1802],"a",{"href":1801},"/ja/blog/embed-japanese-font","gpdf で日本語フォントを埋め込む方法"," — ",[33,1805,691],{}," の完全な使い方、4 バリアントパターン込み",[1796,1808,1809,1813],{},[1799,1810,1812],{"href":1811},"/ja/blog/tofu-boxes-japanese","PDF に豆腐 (□) が出るのはなぜか"," — base family も未登録だった場合の「静かなフォールバック」がどう見えるか",[1796,1815,1816,1820,1821,1824],{},[1799,1817,1819],{"href":1818},"/ja/blog/noto-sans-jp-with-gpdf","gpdf で Noto Sans JP を使う方法"," — どの Noto ファイルを選ぶか、",[33,1822,1823],{},"go:embed"," での配布",[14,1826,1828],{"id":1827},"gpdf-を使ってみる","gpdf を使ってみる",[18,1830,1831],{},"gpdf は Go の PDF 生成ライブラリ。MIT、ゼロ依存、CJK 対応。",[38,1833,1837],{"className":1834,"code":1835,"language":1836,"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,1838,1839],{"__ignoreMap":43},[47,1840,1841,1843,1846],{"class":49,"line":50},[47,1842,42],{"class":137},[47,1844,1845],{"class":71}," get",[47,1847,1848],{"class":71}," github.com/gpdf-dev/gpdf\n",[18,1850,1851,1857,1858],{},[1799,1852,1856],{"href":1853,"rel":1854},"https://github.com/gpdf-dev/gpdf",[1855],"nofollow","⭐ Star on GitHub"," · ",[1799,1859,1862],{"href":1860,"rel":1861},"https://gpdf.dev/ja/docs/quickstart",[1855],"ドキュメントを読む",[1864,1865,1866],"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":1868},[1869,1870,1871,1872,1873,1874,1875,1876],{"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":825,"depth":141,"text":826},{"id":1617,"depth":141,"text":1618},{"id":1791,"depth":141,"text":1791},{"id":1827,"depth":141,"text":1828},"2026-04-23","template.Bold() と template.Italic() を同じ span に渡すだけ。ただし TrueType フォントは 4 バリアント全部を登録しないと BoldItalic のルックアップが base family に静かにフォールバックする。",false,"md",{"name":1882,"totalTime":1883,"tools":1884,"steps":1886},"gpdf で太字と斜体を同時に適用する","PT10M",[1885],"Go 1.22+",[1887,1890,1893,1896],{"name":1888,"text":1889},"同じ c.Text 呼び出しに Bold() と Italic() を両方渡す","c.Text(\"注意\", template.Bold(), template.Italic()) と書くと、gpdf は Family-BoldItalic というバリアント ID を組み立てて登録フォントを引く。",{"name":1891,"text":1892},"Helvetica / Courier はビルトインエイリアスに任せる","Helvetica-BoldItalic と Courier-BoldItalic は Adobe の -BoldOblique メトリクスに自動でエイリアスされる。Standard 14 ファミリーなら WithFont 呼び出しは不要。",{"name":1894,"text":1895},"TrueType フォントは 4 バリアント全部を登録する","NotoSansJP などの TTF は WithFont を 4 回呼ぶ: NotoSansJP, NotoSansJP-Bold, NotoSansJP-Italic, NotoSansJP-BoldItalic。未登録のバリアントは bold ではなく base family にフォールバックする。",{"name":1897,"text":1898},"一段落の中で太字と斜体を混ぜるときは RichText","文中の一部だけ強調するなら c.RichText(func(rt) { rt.Span(\"通常\") ; rt.Span(\"強調\", template.Bold(), template.Italic()) }) を使う。",null,{},"/ja/blog/bold-italic-together",{"title":5,"description":1878},"ja/blog/013.bold-italic-together",[1905,1906],"recipe","tutorial","86oUpSYaBkQGii8_p4wtQZspOzRJT6KD0oe-lYt4umc",1779199022199]