[{"data":1,"prerenderedAt":1910},["ShallowReactive",2],{"blog-en-bold-italic-together":3},{"id":4,"title":5,"author":6,"body":10,"date":1879,"description":1880,"draft":1881,"extension":1882,"howTo":1883,"image":1901,"meta":1902,"navigation":146,"path":1903,"seo":1904,"stem":1905,"tags":1906,"updated":1901,"__hash__":1909},"blog/blog/013.bold-italic-together.md","How do I use bold and italic together in 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":1869},"minimark",[13,18,27,31,39,101,120,123,127,688,710,714,717,793,825,829,836,983,993,996,1604,1617,1621,1630,1742,1764,1790,1794,1827,1831,1834,1851,1865],[14,15,17],"h2",{"id":16},"the-question-in-other-words","The question, in other words",[19,20,21,22,26],"p",{},"I want a single word — or a whole line — to be both ",[23,24,25],"strong",{},"bold and italic"," in the same PDF. How do I set both at once, and why does it sometimes come out looking like neither?",[14,28,30],{"id":29},"the-quick-answer","The quick answer",[19,32,33,34,38],{},"Pass both options on the same ",[35,36,37],"code",{},"c.Text"," call:",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","c.Text(\"WARNING\", template.Bold(), template.Italic())\n","go","",[35,47,48],{"__ignoreMap":45},[49,50,53,57,61,65,68,71,75,77,80,83,85,88,91,93,95,98],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"sTEyZ","c",[49,58,60],{"class":59},"sMK4o",".",[49,62,64],{"class":63},"s2Zo4","Text",[49,66,67],{"class":59},"(",[49,69,70],{"class":59},"\"",[49,72,74],{"class":73},"sfazB","WARNING",[49,76,70],{"class":59},[49,78,79],{"class":59},",",[49,81,82],{"class":55}," template",[49,84,60],{"class":59},[49,86,87],{"class":63},"Bold",[49,89,90],{"class":59},"(),",[49,92,82],{"class":55},[49,94,60],{"class":59},[49,96,97],{"class":63},"Italic",[49,99,100],{"class":59},"())\n",[19,102,103,104,107,108,111,112,115,116,119],{},"gpdf builds the variant ID ",[35,105,106],{},"Family-BoldItalic"," and looks it up in the registered fonts. For the Adobe Standard 14 families (Helvetica, Courier, Times) this just works — gpdf aliases ",[35,109,110],{},"-BoldItalic"," to the canonical ",[35,113,114],{},"-BoldOblique"," internally and uses the built-in AFM metrics. For a TrueType font you register yourself, ",[23,117,118],{},"you have to register all four variants"," or the lookup silently falls back to the base family.",[19,121,122],{},"That second point is where most of the bugs live.",[14,124,126],{"id":125},"working-code-helvetica-no-font-registration","Working code (Helvetica, no font registration)",[40,128,130],{"className":42,"code":129,"language":44,"meta":45,"style":45},"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",[35,131,132,141,148,158,170,180,185,195,205,215,221,226,241,261,285,323,329,334,353,387,423,444,472,500,536,542,548,553,575,591,609,615,662,677,682],{"__ignoreMap":45},[49,133,134,137],{"class":51,"line":52},[49,135,136],{"class":59},"package",[49,138,140],{"class":139},"sBMFI"," main\n",[49,142,144],{"class":51,"line":143},2,[49,145,147],{"emptyLinePlaceholder":146},true,"\n",[49,149,151,155],{"class":51,"line":150},3,[49,152,154],{"class":153},"s7zQu","import",[49,156,157],{"class":59}," (\n",[49,159,161,164,167],{"class":51,"line":160},4,[49,162,163],{"class":59},"    \"",[49,165,166],{"class":139},"log",[49,168,169],{"class":59},"\"\n",[49,171,173,175,178],{"class":51,"line":172},5,[49,174,163],{"class":59},[49,176,177],{"class":139},"os",[49,179,169],{"class":59},[49,181,183],{"class":51,"line":182},6,[49,184,147],{"emptyLinePlaceholder":146},[49,186,188,190,193],{"class":51,"line":187},7,[49,189,163],{"class":59},[49,191,192],{"class":139},"github.com/gpdf-dev/gpdf",[49,194,169],{"class":59},[49,196,198,200,203],{"class":51,"line":197},8,[49,199,163],{"class":59},[49,201,202],{"class":139},"github.com/gpdf-dev/gpdf/document",[49,204,169],{"class":59},[49,206,208,210,213],{"class":51,"line":207},9,[49,209,163],{"class":59},[49,211,212],{"class":139},"github.com/gpdf-dev/gpdf/template",[49,214,169],{"class":59},[49,216,218],{"class":51,"line":217},10,[49,219,220],{"class":59},")\n",[49,222,224],{"class":51,"line":223},11,[49,225,147],{"emptyLinePlaceholder":146},[49,227,229,232,235,238],{"class":51,"line":228},12,[49,230,231],{"class":59},"func",[49,233,234],{"class":63}," main",[49,236,237],{"class":59},"()",[49,239,240],{"class":59}," {\n",[49,242,244,247,250,253,255,258],{"class":51,"line":243},13,[49,245,246],{"class":55},"    doc ",[49,248,249],{"class":59},":=",[49,251,252],{"class":55}," gpdf",[49,254,60],{"class":59},[49,256,257],{"class":63},"NewDocument",[49,259,260],{"class":59},"(\n",[49,262,264,267,269,272,274,277,279,282],{"class":51,"line":263},14,[49,265,266],{"class":55},"        gpdf",[49,268,60],{"class":59},[49,270,271],{"class":63},"WithPageSize",[49,273,67],{"class":59},[49,275,276],{"class":55},"gpdf",[49,278,60],{"class":59},[49,280,281],{"class":55},"A4",[49,283,284],{"class":59},"),\n",[49,286,288,290,292,295,297,300,302,305,307,309,311,314,316,320],{"class":51,"line":287},15,[49,289,266],{"class":55},[49,291,60],{"class":59},[49,293,294],{"class":63},"WithMargins",[49,296,67],{"class":59},[49,298,299],{"class":55},"document",[49,301,60],{"class":59},[49,303,304],{"class":63},"UniformEdges",[49,306,67],{"class":59},[49,308,299],{"class":55},[49,310,60],{"class":59},[49,312,313],{"class":63},"Mm",[49,315,67],{"class":59},[49,317,319],{"class":318},"sbssI","20",[49,321,322],{"class":59},"))),\n",[49,324,326],{"class":51,"line":325},16,[49,327,328],{"class":59},"    )\n",[49,330,332],{"class":51,"line":331},17,[49,333,147],{"emptyLinePlaceholder":146},[49,335,337,340,342,345,347,350],{"class":51,"line":336},18,[49,338,339],{"class":55},"    page ",[49,341,249],{"class":59},[49,343,344],{"class":55}," doc",[49,346,60],{"class":59},[49,348,349],{"class":63},"AddPage",[49,351,352],{"class":59},"()\n",[49,354,356,359,361,364,367,371,374,377,379,382,385],{"class":51,"line":355},19,[49,357,358],{"class":55},"    page",[49,360,60],{"class":59},[49,362,363],{"class":63},"AutoRow",[49,365,366],{"class":59},"(func(",[49,368,370],{"class":369},"sHdIc","r",[49,372,373],{"class":59}," *",[49,375,376],{"class":139},"template",[49,378,60],{"class":59},[49,380,381],{"class":139},"RowBuilder",[49,383,384],{"class":59},")",[49,386,240],{"class":59},[49,388,390,393,395,398,400,403,405,408,410,412,414,416,419,421],{"class":51,"line":389},20,[49,391,392],{"class":55},"        r",[49,394,60],{"class":59},[49,396,397],{"class":63},"Col",[49,399,67],{"class":59},[49,401,402],{"class":318},"12",[49,404,79],{"class":59},[49,406,407],{"class":59}," func(",[49,409,56],{"class":369},[49,411,373],{"class":59},[49,413,376],{"class":139},[49,415,60],{"class":59},[49,417,418],{"class":139},"ColBuilder",[49,420,384],{"class":59},[49,422,240],{"class":59},[49,424,426,429,431,433,435,437,440,442],{"class":51,"line":425},21,[49,427,428],{"class":55},"            c",[49,430,60],{"class":59},[49,432,64],{"class":63},[49,434,67],{"class":59},[49,436,70],{"class":59},[49,438,439],{"class":73},"Regular Helvetica.",[49,441,70],{"class":59},[49,443,220],{"class":59},[49,445,447,449,451,453,455,457,460,462,464,466,468,470],{"class":51,"line":446},22,[49,448,428],{"class":55},[49,450,60],{"class":59},[49,452,64],{"class":63},[49,454,67],{"class":59},[49,456,70],{"class":59},[49,458,459],{"class":73},"Bold only.",[49,461,70],{"class":59},[49,463,79],{"class":59},[49,465,82],{"class":55},[49,467,60],{"class":59},[49,469,87],{"class":63},[49,471,100],{"class":59},[49,473,475,477,479,481,483,485,488,490,492,494,496,498],{"class":51,"line":474},23,[49,476,428],{"class":55},[49,478,60],{"class":59},[49,480,64],{"class":63},[49,482,67],{"class":59},[49,484,70],{"class":59},[49,486,487],{"class":73},"Italic only.",[49,489,70],{"class":59},[49,491,79],{"class":59},[49,493,82],{"class":55},[49,495,60],{"class":59},[49,497,97],{"class":63},[49,499,100],{"class":59},[49,501,503,505,507,509,511,513,516,518,520,522,524,526,528,530,532,534],{"class":51,"line":502},24,[49,504,428],{"class":55},[49,506,60],{"class":59},[49,508,64],{"class":63},[49,510,67],{"class":59},[49,512,70],{"class":59},[49,514,515],{"class":73},"Bold and italic.",[49,517,70],{"class":59},[49,519,79],{"class":59},[49,521,82],{"class":55},[49,523,60],{"class":59},[49,525,87],{"class":63},[49,527,90],{"class":59},[49,529,82],{"class":55},[49,531,60],{"class":59},[49,533,97],{"class":63},[49,535,100],{"class":59},[49,537,539],{"class":51,"line":538},25,[49,540,541],{"class":59},"        })\n",[49,543,545],{"class":51,"line":544},26,[49,546,547],{"class":59},"    })\n",[49,549,551],{"class":51,"line":550},27,[49,552,147],{"emptyLinePlaceholder":146},[49,554,556,559,561,564,566,568,570,573],{"class":51,"line":555},28,[49,557,558],{"class":55},"    data",[49,560,79],{"class":59},[49,562,563],{"class":55}," err ",[49,565,249],{"class":59},[49,567,344],{"class":55},[49,569,60],{"class":59},[49,571,572],{"class":63},"Generate",[49,574,352],{"class":59},[49,576,578,581,583,586,589],{"class":51,"line":577},29,[49,579,580],{"class":153},"    if",[49,582,563],{"class":55},[49,584,585],{"class":59},"!=",[49,587,588],{"class":59}," nil",[49,590,240],{"class":59},[49,592,594,597,599,602,604,607],{"class":51,"line":593},30,[49,595,596],{"class":55},"        log",[49,598,60],{"class":59},[49,600,601],{"class":63},"Fatal",[49,603,67],{"class":59},[49,605,606],{"class":55},"err",[49,608,220],{"class":59},[49,610,612],{"class":51,"line":611},31,[49,613,614],{"class":59},"    }\n",[49,616,618,620,622,624,627,629,632,634,636,639,641,643,646,648,651,654,656,658,660],{"class":51,"line":617},32,[49,619,580],{"class":153},[49,621,563],{"class":55},[49,623,249],{"class":59},[49,625,626],{"class":55}," os",[49,628,60],{"class":59},[49,630,631],{"class":63},"WriteFile",[49,633,67],{"class":59},[49,635,70],{"class":59},[49,637,638],{"class":73},"emphasis.pdf",[49,640,70],{"class":59},[49,642,79],{"class":59},[49,644,645],{"class":55}," data",[49,647,79],{"class":59},[49,649,650],{"class":318}," 0o644",[49,652,653],{"class":59},");",[49,655,563],{"class":55},[49,657,585],{"class":59},[49,659,588],{"class":59},[49,661,240],{"class":59},[49,663,665,667,669,671,673,675],{"class":51,"line":664},33,[49,666,596],{"class":55},[49,668,60],{"class":59},[49,670,601],{"class":63},[49,672,67],{"class":59},[49,674,606],{"class":55},[49,676,220],{"class":59},[49,678,680],{"class":51,"line":679},34,[49,681,614],{"class":59},[49,683,685],{"class":51,"line":684},35,[49,686,687],{"class":59},"}\n",[19,689,690,691,694,695,698,699,698,702,705,706,709],{},"Four lines, four visible styles. No ",[35,692,693],{},"WithFont"," calls at all. The PDF ends up referencing ",[35,696,697],{},"Helvetica",", ",[35,700,701],{},"Helvetica-Bold",[35,703,704],{},"Helvetica-Oblique",", and ",[35,707,708],{},"Helvetica-BoldOblique"," as non-embedded Type 1 entries, which every PDF viewer already has.",[14,711,713],{"id":712},"what-gpdf-actually-does","What gpdf actually does",[19,715,716],{},"The resolver builds a variant ID from the style flags:",[718,719,720,740],"table",{},[721,722,723],"thead",{},[724,725,726,732,737],"tr",{},[727,728,729],"th",{},[35,730,731],{},"Bold()",[727,733,734],{},[35,735,736],{},"Italic()",[727,738,739],{},"Variant ID looked up",[741,742,743,755,766,780],"tbody",{},[724,744,745,749,751],{},[746,747,748],"td",{},"no",[746,750,748],{},[746,752,753],{},[35,754,697],{},[724,756,757,760,762],{},[746,758,759],{},"yes",[746,761,748],{},[746,763,764],{},[35,765,701],{},[724,767,768,770,772],{},[746,769,748],{},[746,771,759],{},[746,773,774,777,778],{},[35,775,776],{},"Helvetica-Italic"," → aliased to ",[35,779,704],{},[724,781,782,784,786],{},[746,783,759],{},[746,785,759],{},[746,787,788,777,791],{},[35,789,790],{},"Helvetica-BoldItalic",[35,792,708],{},[19,794,795,796,799,800,803,804,806,807,809,810,812,813,809,815,817,818,803,821,824],{},"The alias step is the only thing that makes Helvetica special. ",[35,797,798],{},"buildFontVariantID"," always emits the generic ",[35,801,802],{},"-Italic"," / ",[35,805,110],{}," suffixes regardless of family; the Standard 14 init hook then points ",[35,808,776],{}," at ",[35,811,704],{}," and ",[35,814,790],{},[35,816,708],{}," so the metrics match what the viewer draws. Courier gets the same treatment. Times doesn't need the alias because its upright form is already called ",[35,819,820],{},"Times-Italic",[35,822,823],{},"Times-BoldItalic"," in the canonical Adobe names.",[14,826,828],{"id":827},"the-trap-truetype-fonts-need-all-four-registrations","The trap: TrueType fonts need all four registrations",[19,830,831,832,835],{},"This is where CJK documents silently break. If you register Noto Sans JP but forget one of the variants, the missing slot does ",[23,833,834],{},"not"," fall through to Bold or Italic — it falls through straight to the base family.",[40,837,839],{"className":42,"code":838,"language":44,"meta":45,"style":45},"// Looks fine. Isn't.\ndoc := gpdf.NewDocument(\n    gpdf.WithFont(\"NotoSansJP\", regular),\n    gpdf.WithFont(\"NotoSansJP-Bold\", bold),\n    gpdf.WithDefaultFont(\"NotoSansJP\", 12),\n)\n\n// This renders in plain NotoSansJP — not bold, not italic.\nc.Text(\"強調したい\", template.Bold(), template.Italic())\n",[35,840,841,847,862,887,911,935,939,943,948],{"__ignoreMap":45},[49,842,843],{"class":51,"line":52},[49,844,846],{"class":845},"sHwdD","// Looks fine. Isn't.\n",[49,848,849,852,854,856,858,860],{"class":51,"line":143},[49,850,851],{"class":55},"doc ",[49,853,249],{"class":59},[49,855,252],{"class":55},[49,857,60],{"class":59},[49,859,257],{"class":63},[49,861,260],{"class":59},[49,863,864,867,869,871,873,875,878,880,882,885],{"class":51,"line":150},[49,865,866],{"class":55},"    gpdf",[49,868,60],{"class":59},[49,870,693],{"class":63},[49,872,67],{"class":59},[49,874,70],{"class":59},[49,876,877],{"class":73},"NotoSansJP",[49,879,70],{"class":59},[49,881,79],{"class":59},[49,883,884],{"class":55}," regular",[49,886,284],{"class":59},[49,888,889,891,893,895,897,899,902,904,906,909],{"class":51,"line":160},[49,890,866],{"class":55},[49,892,60],{"class":59},[49,894,693],{"class":63},[49,896,67],{"class":59},[49,898,70],{"class":59},[49,900,901],{"class":73},"NotoSansJP-Bold",[49,903,70],{"class":59},[49,905,79],{"class":59},[49,907,908],{"class":55}," bold",[49,910,284],{"class":59},[49,912,913,915,917,920,922,924,926,928,930,933],{"class":51,"line":172},[49,914,866],{"class":55},[49,916,60],{"class":59},[49,918,919],{"class":63},"WithDefaultFont",[49,921,67],{"class":59},[49,923,70],{"class":59},[49,925,877],{"class":73},[49,927,70],{"class":59},[49,929,79],{"class":59},[49,931,932],{"class":318}," 12",[49,934,284],{"class":59},[49,936,937],{"class":51,"line":182},[49,938,220],{"class":59},[49,940,941],{"class":51,"line":187},[49,942,147],{"emptyLinePlaceholder":146},[49,944,945],{"class":51,"line":197},[49,946,947],{"class":845},"// This renders in plain NotoSansJP — not bold, not italic.\n",[49,949,950,952,954,956,958,960,963,965,967,969,971,973,975,977,979,981],{"class":51,"line":207},[49,951,56],{"class":55},[49,953,60],{"class":59},[49,955,64],{"class":63},[49,957,67],{"class":59},[49,959,70],{"class":59},[49,961,962],{"class":73},"強調したい",[49,964,70],{"class":59},[49,966,79],{"class":59},[49,968,82],{"class":55},[49,970,60],{"class":59},[49,972,87],{"class":63},[49,974,90],{"class":59},[49,976,82],{"class":55},[49,978,60],{"class":59},[49,980,97],{"class":63},[49,982,100],{"class":59},[19,984,985,986,989,990,992],{},"The reason is in the resolver. It tries ",[35,987,988],{},"NotoSansJP-BoldItalic"," first, misses, then falls back to exactly one thing: the base family ",[35,991,877],{},". There's no intermediate step that tries the bold version as a consolation prize. You asked for bold-italic, you got regular.",[19,994,995],{},"The fix is to register every variant you intend to use:",[40,997,999],{"className":42,"code":998,"language":44,"meta":45,"style":45},"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",[35,1000,1001,1007,1011,1017,1025,1033,1037,1045,1053,1061,1065,1069,1079,1100,1120,1140,1160,1164,1178,1196,1218,1240,1264,1287,1309,1313,1317,1331,1355,1385,1404,1439,1443,1447,1451,1470,1499,1504,1509,1535,1560,1590,1599],{"__ignoreMap":45},[49,1002,1003,1005],{"class":51,"line":52},[49,1004,136],{"class":59},[49,1006,140],{"class":139},[49,1008,1009],{"class":51,"line":143},[49,1010,147],{"emptyLinePlaceholder":146},[49,1012,1013,1015],{"class":51,"line":150},[49,1014,154],{"class":153},[49,1016,157],{"class":59},[49,1018,1019,1021,1023],{"class":51,"line":160},[49,1020,163],{"class":59},[49,1022,166],{"class":139},[49,1024,169],{"class":59},[49,1026,1027,1029,1031],{"class":51,"line":172},[49,1028,163],{"class":59},[49,1030,177],{"class":139},[49,1032,169],{"class":59},[49,1034,1035],{"class":51,"line":182},[49,1036,147],{"emptyLinePlaceholder":146},[49,1038,1039,1041,1043],{"class":51,"line":187},[49,1040,163],{"class":59},[49,1042,192],{"class":139},[49,1044,169],{"class":59},[49,1046,1047,1049,1051],{"class":51,"line":197},[49,1048,163],{"class":59},[49,1050,202],{"class":139},[49,1052,169],{"class":59},[49,1054,1055,1057,1059],{"class":51,"line":207},[49,1056,163],{"class":59},[49,1058,212],{"class":139},[49,1060,169],{"class":59},[49,1062,1063],{"class":51,"line":217},[49,1064,220],{"class":59},[49,1066,1067],{"class":51,"line":223},[49,1068,147],{"emptyLinePlaceholder":146},[49,1070,1071,1073,1075,1077],{"class":51,"line":228},[49,1072,231],{"class":59},[49,1074,234],{"class":63},[49,1076,237],{"class":59},[49,1078,240],{"class":59},[49,1080,1081,1084,1086,1089,1091,1093,1096,1098],{"class":51,"line":243},[49,1082,1083],{"class":55},"    regular ",[49,1085,249],{"class":59},[49,1087,1088],{"class":63}," mustRead",[49,1090,67],{"class":59},[49,1092,70],{"class":59},[49,1094,1095],{"class":73},"NotoSansJP-Regular.ttf",[49,1097,70],{"class":59},[49,1099,220],{"class":59},[49,1101,1102,1105,1107,1109,1111,1113,1116,1118],{"class":51,"line":263},[49,1103,1104],{"class":55},"    bold ",[49,1106,249],{"class":59},[49,1108,1088],{"class":63},[49,1110,67],{"class":59},[49,1112,70],{"class":59},[49,1114,1115],{"class":73},"NotoSansJP-Bold.ttf",[49,1117,70],{"class":59},[49,1119,220],{"class":59},[49,1121,1122,1125,1127,1129,1131,1133,1136,1138],{"class":51,"line":287},[49,1123,1124],{"class":55},"    italic ",[49,1126,249],{"class":59},[49,1128,1088],{"class":63},[49,1130,67],{"class":59},[49,1132,70],{"class":59},[49,1134,1135],{"class":73},"NotoSansJP-Italic.ttf",[49,1137,70],{"class":59},[49,1139,220],{"class":59},[49,1141,1142,1145,1147,1149,1151,1153,1156,1158],{"class":51,"line":325},[49,1143,1144],{"class":55},"    boldItalic ",[49,1146,249],{"class":59},[49,1148,1088],{"class":63},[49,1150,67],{"class":59},[49,1152,70],{"class":59},[49,1154,1155],{"class":73},"NotoSansJP-BoldItalic.ttf",[49,1157,70],{"class":59},[49,1159,220],{"class":59},[49,1161,1162],{"class":51,"line":331},[49,1163,147],{"emptyLinePlaceholder":146},[49,1165,1166,1168,1170,1172,1174,1176],{"class":51,"line":336},[49,1167,246],{"class":55},[49,1169,249],{"class":59},[49,1171,252],{"class":55},[49,1173,60],{"class":59},[49,1175,257],{"class":63},[49,1177,260],{"class":59},[49,1179,1180,1182,1184,1186,1188,1190,1192,1194],{"class":51,"line":355},[49,1181,266],{"class":55},[49,1183,60],{"class":59},[49,1185,271],{"class":63},[49,1187,67],{"class":59},[49,1189,276],{"class":55},[49,1191,60],{"class":59},[49,1193,281],{"class":55},[49,1195,284],{"class":59},[49,1197,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216],{"class":51,"line":389},[49,1199,266],{"class":55},[49,1201,60],{"class":59},[49,1203,693],{"class":63},[49,1205,67],{"class":59},[49,1207,70],{"class":59},[49,1209,877],{"class":73},[49,1211,70],{"class":59},[49,1213,79],{"class":59},[49,1215,884],{"class":55},[49,1217,284],{"class":59},[49,1219,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238],{"class":51,"line":425},[49,1221,266],{"class":55},[49,1223,60],{"class":59},[49,1225,693],{"class":63},[49,1227,67],{"class":59},[49,1229,70],{"class":59},[49,1231,901],{"class":73},[49,1233,70],{"class":59},[49,1235,79],{"class":59},[49,1237,908],{"class":55},[49,1239,284],{"class":59},[49,1241,1242,1244,1246,1248,1250,1252,1255,1257,1259,1262],{"class":51,"line":446},[49,1243,266],{"class":55},[49,1245,60],{"class":59},[49,1247,693],{"class":63},[49,1249,67],{"class":59},[49,1251,70],{"class":59},[49,1253,1254],{"class":73},"NotoSansJP-Italic",[49,1256,70],{"class":59},[49,1258,79],{"class":59},[49,1260,1261],{"class":55}," italic",[49,1263,284],{"class":59},[49,1265,1266,1268,1270,1272,1274,1276,1278,1280,1282,1285],{"class":51,"line":474},[49,1267,266],{"class":55},[49,1269,60],{"class":59},[49,1271,693],{"class":63},[49,1273,67],{"class":59},[49,1275,70],{"class":59},[49,1277,988],{"class":73},[49,1279,70],{"class":59},[49,1281,79],{"class":59},[49,1283,1284],{"class":55}," boldItalic",[49,1286,284],{"class":59},[49,1288,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307],{"class":51,"line":502},[49,1290,266],{"class":55},[49,1292,60],{"class":59},[49,1294,919],{"class":63},[49,1296,67],{"class":59},[49,1298,70],{"class":59},[49,1300,877],{"class":73},[49,1302,70],{"class":59},[49,1304,79],{"class":59},[49,1306,932],{"class":318},[49,1308,284],{"class":59},[49,1310,1311],{"class":51,"line":538},[49,1312,328],{"class":59},[49,1314,1315],{"class":51,"line":544},[49,1316,147],{"emptyLinePlaceholder":146},[49,1318,1319,1321,1323,1325,1327,1329],{"class":51,"line":550},[49,1320,339],{"class":55},[49,1322,249],{"class":59},[49,1324,344],{"class":55},[49,1326,60],{"class":59},[49,1328,349],{"class":63},[49,1330,352],{"class":59},[49,1332,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353],{"class":51,"line":555},[49,1334,358],{"class":55},[49,1336,60],{"class":59},[49,1338,363],{"class":63},[49,1340,366],{"class":59},[49,1342,370],{"class":369},[49,1344,373],{"class":59},[49,1346,376],{"class":139},[49,1348,60],{"class":59},[49,1350,381],{"class":139},[49,1352,384],{"class":59},[49,1354,240],{"class":59},[49,1356,1357,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383],{"class":51,"line":577},[49,1358,392],{"class":55},[49,1360,60],{"class":59},[49,1362,397],{"class":63},[49,1364,67],{"class":59},[49,1366,402],{"class":318},[49,1368,79],{"class":59},[49,1370,407],{"class":59},[49,1372,56],{"class":369},[49,1374,373],{"class":59},[49,1376,376],{"class":139},[49,1378,60],{"class":59},[49,1380,418],{"class":139},[49,1382,384],{"class":59},[49,1384,240],{"class":59},[49,1386,1387,1389,1391,1393,1395,1397,1400,1402],{"class":51,"line":593},[49,1388,428],{"class":55},[49,1390,60],{"class":59},[49,1392,64],{"class":63},[49,1394,67],{"class":59},[49,1396,70],{"class":59},[49,1398,1399],{"class":73},"通常のテキスト",[49,1401,70],{"class":59},[49,1403,220],{"class":59},[49,1405,1406,1408,1410,1412,1414,1416,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437],{"class":51,"line":611},[49,1407,428],{"class":55},[49,1409,60],{"class":59},[49,1411,64],{"class":63},[49,1413,67],{"class":59},[49,1415,70],{"class":59},[49,1417,1418],{"class":73},"強調",[49,1420,70],{"class":59},[49,1422,79],{"class":59},[49,1424,82],{"class":55},[49,1426,60],{"class":59},[49,1428,87],{"class":63},[49,1430,90],{"class":59},[49,1432,82],{"class":55},[49,1434,60],{"class":59},[49,1436,97],{"class":63},[49,1438,100],{"class":59},[49,1440,1441],{"class":51,"line":617},[49,1442,541],{"class":59},[49,1444,1445],{"class":51,"line":664},[49,1446,547],{"class":59},[49,1448,1449],{"class":51,"line":679},[49,1450,147],{"emptyLinePlaceholder":146},[49,1452,1453,1455,1457,1460,1462,1464,1466,1468],{"class":51,"line":684},[49,1454,558],{"class":55},[49,1456,79],{"class":59},[49,1458,1459],{"class":55}," _ ",[49,1461,249],{"class":59},[49,1463,344],{"class":55},[49,1465,60],{"class":59},[49,1467,572],{"class":63},[49,1469,352],{"class":59},[49,1471,1473,1476,1478,1480,1482,1484,1487,1489,1491,1493,1495,1497],{"class":51,"line":1472},36,[49,1474,1475],{"class":55},"    os",[49,1477,60],{"class":59},[49,1479,631],{"class":63},[49,1481,67],{"class":59},[49,1483,70],{"class":59},[49,1485,1486],{"class":73},"jp-emphasis.pdf",[49,1488,70],{"class":59},[49,1490,79],{"class":59},[49,1492,645],{"class":55},[49,1494,79],{"class":59},[49,1496,650],{"class":318},[49,1498,220],{"class":59},[49,1500,1502],{"class":51,"line":1501},37,[49,1503,687],{"class":59},[49,1505,1507],{"class":51,"line":1506},38,[49,1508,147],{"emptyLinePlaceholder":146},[49,1510,1512,1514,1516,1518,1521,1525,1527,1530,1533],{"class":51,"line":1511},39,[49,1513,231],{"class":59},[49,1515,1088],{"class":63},[49,1517,67],{"class":59},[49,1519,1520],{"class":369},"path",[49,1522,1524],{"class":1523},"spNyl"," string",[49,1526,384],{"class":59},[49,1528,1529],{"class":59}," []",[49,1531,1532],{"class":1523},"byte",[49,1534,240],{"class":59},[49,1536,1538,1541,1543,1545,1547,1549,1551,1554,1556,1558],{"class":51,"line":1537},40,[49,1539,1540],{"class":55},"    b",[49,1542,79],{"class":59},[49,1544,563],{"class":55},[49,1546,249],{"class":59},[49,1548,626],{"class":55},[49,1550,60],{"class":59},[49,1552,1553],{"class":63},"ReadFile",[49,1555,67],{"class":59},[49,1557,1520],{"class":55},[49,1559,220],{"class":59},[49,1561,1563,1565,1567,1569,1571,1574,1577,1579,1581,1583,1585,1587],{"class":51,"line":1562},41,[49,1564,580],{"class":153},[49,1566,563],{"class":55},[49,1568,585],{"class":59},[49,1570,588],{"class":59},[49,1572,1573],{"class":59}," {",[49,1575,1576],{"class":55}," log",[49,1578,60],{"class":59},[49,1580,601],{"class":63},[49,1582,67],{"class":59},[49,1584,606],{"class":55},[49,1586,384],{"class":59},[49,1588,1589],{"class":59}," }\n",[49,1591,1593,1596],{"class":51,"line":1592},42,[49,1594,1595],{"class":153},"    return",[49,1597,1598],{"class":55}," b\n",[49,1600,1602],{"class":51,"line":1601},43,[49,1603,687],{"class":59},[19,1605,1606,1607,1610,1611,1613,1614,1616],{},"Noto Sans JP's official distribution doesn't actually ship a slanted italic cut — italic Japanese typography is unusual — so in practice most Japanese documents register only regular and bold and simply don't use ",[35,1608,1609],{},"template.Italic()"," on Japanese spans. That's fine. The rule is: if you never call ",[35,1612,736],{}," on a family, you don't need its italic variant. The trap is only when you call ",[35,1615,736],{}," and haven't registered the file.",[14,1618,1620],{"id":1619},"mixing-bold-and-italic-in-the-same-paragraph","Mixing bold and italic in the same paragraph",[19,1622,1623,1625,1626,1629],{},[35,1624,37],{}," applies one style to the whole string. For mid-sentence emphasis use ",[35,1627,1628],{},"c.RichText",":",[40,1631,1633],{"className":42,"code":1632,"language":44,"meta":45,"style":45},"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",[35,1634,1635,1662,1683,1718,1737],{"__ignoreMap":45},[49,1636,1637,1639,1641,1644,1646,1649,1651,1653,1655,1658,1660],{"class":51,"line":52},[49,1638,56],{"class":55},[49,1640,60],{"class":59},[49,1642,1643],{"class":63},"RichText",[49,1645,366],{"class":59},[49,1647,1648],{"class":369},"rt",[49,1650,373],{"class":59},[49,1652,376],{"class":139},[49,1654,60],{"class":59},[49,1656,1657],{"class":139},"RichTextBuilder",[49,1659,384],{"class":59},[49,1661,240],{"class":59},[49,1663,1664,1667,1669,1672,1674,1676,1679,1681],{"class":51,"line":143},[49,1665,1666],{"class":55},"    rt",[49,1668,60],{"class":59},[49,1670,1671],{"class":63},"Span",[49,1673,67],{"class":59},[49,1675,70],{"class":59},[49,1677,1678],{"class":73},"The ",[49,1680,70],{"class":59},[49,1682,220],{"class":59},[49,1684,1685,1687,1689,1691,1693,1695,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716],{"class":51,"line":150},[49,1686,1666],{"class":55},[49,1688,60],{"class":59},[49,1690,1671],{"class":63},[49,1692,67],{"class":59},[49,1694,70],{"class":59},[49,1696,1697],{"class":73},"quick brown fox",[49,1699,70],{"class":59},[49,1701,79],{"class":59},[49,1703,82],{"class":55},[49,1705,60],{"class":59},[49,1707,87],{"class":63},[49,1709,90],{"class":59},[49,1711,82],{"class":55},[49,1713,60],{"class":59},[49,1715,97],{"class":63},[49,1717,100],{"class":59},[49,1719,1720,1722,1724,1726,1728,1730,1733,1735],{"class":51,"line":160},[49,1721,1666],{"class":55},[49,1723,60],{"class":59},[49,1725,1671],{"class":63},[49,1727,67],{"class":59},[49,1729,70],{"class":59},[49,1731,1732],{"class":73}," jumps over the lazy dog.",[49,1734,70],{"class":59},[49,1736,220],{"class":59},[49,1738,1739],{"class":51,"line":172},[49,1740,1741],{"class":59},"})\n",[19,1743,1744,1745,1748,1749,1751,1752,1754,1755,1757,1758,1760,1761,1763],{},"Each ",[35,1746,1747],{},"rt.Span"," gets its own style flags, and the layout engine line-breaks across spans the way a word processor would. ",[35,1750,731],{}," + ",[35,1753,736],{}," on a single ",[35,1756,1671],{}," hits the same ",[35,1759,110],{}," variant lookup as ",[35,1762,37],{}," — it's the same code path.",[19,1765,1766,1767,812,1769,1771,1772,812,1775,1778,1779,812,1782,1785,1786,1789],{},"One thing worth naming: ",[35,1768,731],{},[35,1770,736],{}," are commutative. ",[35,1773,1774],{},"template.Italic(), template.Bold()",[35,1776,1777],{},"template.Bold(), template.Italic()"," produce identical output. They're setting two different fields (",[35,1780,1781],{},"FontWeight",[35,1783,1784],{},"FontStyle",") on the same ",[35,1787,1788],{},"document.Style",", so ordering doesn't matter.",[14,1791,1793],{"id":1792},"related-recipes","Related recipes",[1795,1796,1797,1809,1816],"ul",{},[1798,1799,1800,1805,1806,1808],"li",{},[1801,1802,1804],"a",{"href":1803},"/blog/embed-japanese-font","How do I embed a Japanese font in gpdf?"," — full ",[35,1807,693],{}," walkthrough including the four-variant pattern",[1798,1810,1811,1815],{},[1801,1812,1814],{"href":1813},"/blog/tofu-boxes-japanese","Why does my PDF show tofu boxes for Japanese?"," — what \"silent fallback\" looks like when the base family also isn't registered",[1798,1817,1818,1822,1823,1826],{},[1801,1819,1821],{"href":1820},"/blog/noto-sans-jp-with-gpdf","How do I use Noto Sans JP with gpdf?"," — which Noto files to pick and how ",[35,1824,1825],{},"go:embed"," simplifies distribution",[14,1828,1830],{"id":1829},"try-gpdf","Try gpdf",[19,1832,1833],{},"gpdf is a Go library for generating PDFs. MIT licensed, zero external dependencies, native CJK support.",[40,1835,1839],{"className":1836,"code":1837,"language":1838,"meta":45,"style":45},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[35,1840,1841],{"__ignoreMap":45},[49,1842,1843,1845,1848],{"class":51,"line":52},[49,1844,44],{"class":139},[49,1846,1847],{"class":73}," get",[49,1849,1850],{"class":73}," github.com/gpdf-dev/gpdf\n",[19,1852,1853,1859,1860],{},[1801,1854,1858],{"href":1855,"rel":1856},"https://github.com/gpdf-dev/gpdf",[1857],"nofollow","⭐ Star on GitHub"," · ",[1801,1861,1864],{"href":1862,"rel":1863},"https://gpdf.dev/docs/quickstart",[1857],"Read the docs",[1866,1867,1868],"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":45,"searchDepth":143,"depth":143,"links":1870},[1871,1872,1873,1874,1875,1876,1877,1878],{"id":16,"depth":143,"text":17},{"id":29,"depth":143,"text":30},{"id":125,"depth":143,"text":126},{"id":712,"depth":143,"text":713},{"id":827,"depth":143,"text":828},{"id":1619,"depth":143,"text":1620},{"id":1792,"depth":143,"text":1793},{"id":1829,"depth":143,"text":1830},"2026-04-23","Bold and italic on the same span work via template.Bold() and template.Italic(). For TrueType fonts you must register all four variants or the BoldItalic lookup silently falls back to the base family.",false,"md",{"name":1884,"totalTime":1885,"tools":1886,"steps":1888},"Apply combined bold and italic to text in gpdf","PT10M",[1887],"Go 1.22+",[1889,1892,1895,1898],{"name":1890,"text":1891},"Pass both Bold() and Italic() on the same c.Text call","Call c.Text(\"caution\", template.Bold(), template.Italic()). gpdf builds the variant ID Family-BoldItalic and looks that up in the registered fonts.",{"name":1893,"text":1894},"Rely on the built-in alias for Helvetica and Courier","For Helvetica-BoldItalic and Courier-BoldItalic, gpdf aliases to the Adobe -BoldOblique metrics automatically. No WithFont call is needed for these Standard 14 families.",{"name":1896,"text":1897},"Register all four variants for a TrueType family","For NotoSansJP or any other TTF, call WithFont four times: NotoSansJP, NotoSansJP-Bold, NotoSansJP-Italic, and NotoSansJP-BoldItalic. Missing variants fall back to the base family, not to the bold one.",{"name":1899,"text":1900},"Mix bold and italic inside one paragraph with RichText","For emphasis inside a sentence, use c.RichText(func(rt) { rt.Span(\"plain\") ; rt.Span(\"bold-italic\", template.Bold(), template.Italic()) }).",null,{},"/blog/bold-italic-together",{"title":5,"description":1880},"blog/013.bold-italic-together",[1907,1908],"recipe","tutorial","cOdahIAusF814yYx6jo1B3H78ZH1qyl_dByGYNVo9gA",1779199010350]