[{"data":1,"prerenderedAt":1911},["ShallowReactive",2],{"blog-ko-bold-italic-together":3},{"id":4,"title":5,"author":6,"body":10,"date":1880,"description":1881,"draft":1882,"extension":1883,"howTo":1884,"image":1902,"meta":1903,"navigation":146,"path":1904,"seo":1905,"stem":1906,"tags":1907,"updated":1902,"__hash__":1910},"blogKo/ko/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":1870},"minimark",[13,18,27,31,39,101,120,123,127,688,709,713,716,793,825,829,836,983,993,996,1604,1617,1621,1630,1742,1764,1791,1795,1828,1832,1835,1852,1866],[14,15,17],"h2",{"id":16},"질문을-다시-쓰면","질문을 다시 쓰면",[19,20,21,22,26],"p",{},"PDF 속 단어 하나 또는 한 줄을 ",[23,24,25],"strong",{},"굵게이면서 기울임","으로 만들고 싶다. 둘을 한 번에 지정하려면 어떻게 쓰며, 왜 가끔 둘 다 아닌 것처럼 보이는 출력이 나오는가?",[14,28,30],{"id":29},"짧은-답","짧은 답",[19,32,33,34,38],{},"같은 ",[35,36,37],"code",{},"c.Text"," 호출에 두 옵션을 모두 전달한다:",[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는 변형 ID ",[35,105,106],{},"Family-BoldItalic","을 만들어 등록된 글꼴에서 찾는다. Adobe Standard 14 패밀리(Helvetica, Courier, Times)는 이대로 동작한다—gpdf가 ",[35,109,110],{},"-BoldItalic","을 정식 이름 ",[35,113,114],{},"-BoldOblique","로 내부 별칭 처리하고 내장 AFM 지표를 쓴다. 직접 등록하는 TrueType 글꼴의 경우 ",[23,117,118],{},"네 변형을 모두 등록","해야 하며, 그렇지 않으면 조회가 조용히 기본 패밀리로 폴백한다.",[19,121,122],{},"버그 대부분은 두 번째 지점에서 생긴다.",[14,124,126],{"id":125},"동작하는-코드-helvetica-글꼴-등록-없음","동작하는 코드 (Helvetica, 글꼴 등록 없음)",[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,698,705,708],{},"네 줄에 네 스타일. ",[35,692,693],{},"WithFont"," 호출은 전혀 없다. 생성된 PDF는 ",[35,696,697],{},"Helvetica",", ",[35,700,701],{},"Helvetica-Bold",[35,703,704],{},"Helvetica-Oblique",[35,706,707],{},"Helvetica-BoldOblique","를 비임베드 Type 1 항목으로 참조한다. 모든 PDF 뷰어가 이미 가지고 있는 글꼴들이다.",[14,710,712],{"id":711},"gpdf가-실제로-하는-일","gpdf가 실제로 하는 일",[19,714,715],{},"리졸버는 스타일 플래그에서 변형 ID를 만든다:",[717,718,719,739],"table",{},[720,721,722],"thead",{},[723,724,725,731,736],"tr",{},[726,727,728],"th",{},[35,729,730],{},"Bold()",[726,732,733],{},[35,734,735],{},"Italic()",[726,737,738],{},"조회하는 변형 ID",[740,741,742,754,765,780],"tbody",{},[723,743,744,748,750],{},[745,746,747],"td",{},"아니오",[745,749,747],{},[745,751,752],{},[35,753,697],{},[723,755,756,759,761],{},[745,757,758],{},"예",[745,760,747],{},[745,762,763],{},[35,764,701],{},[723,766,767,769,771],{},[745,768,747],{},[745,770,758],{},[745,772,773,776,777,779],{},[35,774,775],{},"Helvetica-Italic"," → ",[35,778,704],{},"로 별칭",[723,781,782,784,786],{},[745,783,758],{},[745,785,758],{},[745,787,788,776,791,779],{},[35,789,790],{},"Helvetica-BoldItalic",[35,792,707],{},[19,794,795,796,799,800,803,804,806,807,809,810,812,813,809,815,817,818,803,821,824],{},"별칭 단계가 Helvetica의 유일한 특수 처리다. ",[35,797,798],{},"buildFontVariantID","는 패밀리와 무관하게 일반 ",[35,801,802],{},"-Italic"," / ",[35,805,110],{}," 접미사를 항상 붙이고, 이후 Standard 14의 init 훅이 ",[35,808,775],{},"을 ",[35,811,704],{},"로, ",[35,814,790],{},[35,816,707],{},"로 매핑하여 지표가 뷰어의 출력과 일치하도록 한다. Courier도 같은 방식. Times는 정식 이름 자체가 ",[35,819,820],{},"Times-Italic",[35,822,823],{},"Times-BoldItalic","이라 별칭이 필요 없다.",[14,826,828],{"id":827},"함정-truetype-글꼴은-네-개를-모두-등록해야-한다","함정: TrueType 글꼴은 네 개를 모두 등록해야 한다",[19,830,831,832,835],{},"CJK 문서가 조용히 깨지는 지점이 여기다. Noto Sans JP를 등록해도 변형 중 하나를 빼먹으면, 빠진 슬롯은 Bold나 Italic을 ",[23,833,834],{},"거치지 않고"," 곧바로 기본 패밀리로 떨어진다.",[40,837,839],{"className":42,"code":838,"language":44,"meta":45,"style":45},"// 그럴싸해 보이지만 아니다.\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",[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","// 그럴싸해 보이지만 아니다.\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},"// 여기는 평범한 NotoSansJP로 렌더링된다 — 굵지도 기울지도 않다.\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],{},"이유는 리졸버 구현에 있다. 먼저 ",[35,987,988],{},"NotoSansJP-BoldItalic","을 찾고, 없으면 딱 한 가지, 기본 패밀리 ",[35,991,877],{},"로만 떨어진다. \"아쉬운 대로 Bold 버전\"이라는 중간 단계가 존재하지 않는다. bold-italic을 요청했지만 일반을 받게 된다.",[19,994,995],{},"해결은 쓸 변형을 전부 등록하는 것이다:",[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 공식 배포에는 기울임(slanted) 컷이 애초에 없다—일본어 조판에서 기울임 자체가 흔치 않다—그래서 실제 일본어 문서 대부분은 regular와 bold만 등록하고 일본어 span에는 ",[35,1608,1609],{},"template.Italic()","을 쓰지 않는다. 그래도 아무 문제 없다. 규칙은 이렇다: 그 패밀리에 한 번도 ",[35,1612,735],{},"을 호출하지 않는다면 기울임 변형은 등록할 필요가 없다. ",[35,1615,735],{},"을 호출하면서 파일을 등록하지 않았을 때만 함정이 된다.",[14,1618,1620],{"id":1619},"한-문단-안에서-굵게와-기울임-섞기","한 문단 안에서 굵게와 기울임 섞기",[19,1622,1623,1625,1626,1629],{},[35,1624,37],{},"는 문자열 전체에 하나의 스타일을 적용한다. 문장 가운데를 강조하려면 ",[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],{},"각 ",[35,1746,1747],{},"rt.Span","은 고유 스타일 플래그를 갖고, 레이아웃 엔진은 워드 프로세서처럼 span 간 줄바꿈을 처리한다. 하나의 ",[35,1750,1671],{},"에 ",[35,1753,730],{}," + ",[35,1756,735],{},"을 함께 주는 것은 ",[35,1759,37],{},"에서와 동일한 ",[35,1762,110],{}," 변형 조회를 거친다 — 같은 코드 경로다.",[19,1765,1766,1767,1769,1770,1772,1773,1769,1776,1779,1780,1783,1784,1769,1787,1790],{},"짚어둘 점 하나: ",[35,1768,730],{},"와 ",[35,1771,735],{},"은 가환(commutative)이다. ",[35,1774,1775],{},"template.Italic(), template.Bold()",[35,1777,1778],{},"template.Bold(), template.Italic()","은 동일한 출력을 낸다. 같은 ",[35,1781,1782],{},"document.Style","의 서로 다른 필드(",[35,1785,1786],{},"FontWeight",[35,1788,1789],{},"FontStyle",")를 설정하는 것뿐이라 순서는 영향이 없다.",[14,1792,1794],{"id":1793},"관련-레시피","관련 레시피",[1796,1797,1798,1810,1817],"ul",{},[1799,1800,1801,1806,1807,1809],"li",{},[1802,1803,1805],"a",{"href":1804},"/ko/blog/embed-japanese-font","gpdf에서 일본어 글꼴을 임베드하는 방법"," — ",[35,1808,693],{}," 전체 사용법, 네 변형 패턴 포함",[1799,1811,1812,1816],{},[1802,1813,1815],{"href":1814},"/ko/blog/tofu-boxes-japanese","PDF에 일본어가 네모(豆腐)로 나오는 이유"," — 기본 패밀리마저 등록되지 않았을 때 \"조용한 폴백\"이 어떻게 보이는지",[1799,1818,1819,1823,1824,1827],{},[1802,1820,1822],{"href":1821},"/ko/blog/noto-sans-jp-with-gpdf","gpdf에서 Noto Sans JP 사용하기"," — 어떤 Noto 파일을 고르고 ",[35,1825,1826],{},"go:embed","로 어떻게 배포하는지",[14,1829,1831],{"id":1830},"gpdf-써보기","gpdf 써보기",[19,1833,1834],{},"gpdf는 Go용 PDF 생성 라이브러리다. MIT 라이선스, 외부 의존성 없음, CJK 네이티브 지원.",[40,1836,1840],{"className":1837,"code":1838,"language":1839,"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,1841,1842],{"__ignoreMap":45},[49,1843,1844,1846,1849],{"class":51,"line":52},[49,1845,44],{"class":139},[49,1847,1848],{"class":73}," get",[49,1850,1851],{"class":73}," github.com/gpdf-dev/gpdf\n",[19,1853,1854,1860,1861],{},[1802,1855,1859],{"href":1856,"rel":1857},"https://github.com/gpdf-dev/gpdf",[1858],"nofollow","⭐ Star on GitHub"," · ",[1802,1862,1865],{"href":1863,"rel":1864},"https://gpdf.dev/ko/docs/quickstart",[1858],"문서 읽기",[1867,1868,1869],"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":1871},[1872,1873,1874,1875,1876,1877,1878,1879],{"id":16,"depth":143,"text":17},{"id":29,"depth":143,"text":30},{"id":125,"depth":143,"text":126},{"id":711,"depth":143,"text":712},{"id":827,"depth":143,"text":828},{"id":1619,"depth":143,"text":1620},{"id":1793,"depth":143,"text":1794},{"id":1830,"depth":143,"text":1831},"2026-04-23","같은 span에 template.Bold()와 template.Italic()을 함께 전달하면 된다. 다만 TrueType 글꼴은 네 개 변형을 모두 등록하지 않으면 BoldItalic 조회가 조용히 기본 패밀리로 폴백한다.",false,"md",{"name":1885,"totalTime":1886,"tools":1887,"steps":1889},"gpdf에서 굵게와 기울임을 함께 적용하기","PT10M",[1888],"Go 1.22+",[1890,1893,1896,1899],{"name":1891,"text":1892},"같은 c.Text 호출에 Bold()와 Italic()을 함께 전달","c.Text(\"주의\", template.Bold(), template.Italic())처럼 쓰면 gpdf가 변형 ID Family-BoldItalic을 만들어 등록된 글꼴에서 찾는다.",{"name":1894,"text":1895},"Helvetica와 Courier는 내장 별칭에 맡기기","Helvetica-BoldItalic과 Courier-BoldItalic은 Adobe의 -BoldOblique 지표로 자동 별칭된다. Standard 14 패밀리는 WithFont 호출이 필요 없다.",{"name":1897,"text":1898},"TrueType 글꼴은 네 변형을 모두 등록","NotoSansJP 같은 TTF는 WithFont를 네 번 호출해야 한다: NotoSansJP, NotoSansJP-Bold, NotoSansJP-Italic, NotoSansJP-BoldItalic. 누락된 변형은 Bold가 아니라 기본 패밀리로 폴백한다.",{"name":1900,"text":1901},"한 문단 안에서 굵게와 기울임을 섞으려면 RichText","문장 중 강조는 c.RichText(func(rt) { rt.Span(\"일반\") ; rt.Span(\"굵게 기울임\", template.Bold(), template.Italic()) })로.",null,{},"/ko/blog/bold-italic-together",{"title":5,"description":1881},"ko/blog/013.bold-italic-together",[1908,1909],"recipe","tutorial","CcWWp_5hcXdYoSO-5SD6qsiZnSzhBa45UQj_Z3VN4QU",1779199026965]