[{"data":1,"prerenderedAt":1543},["ShallowReactive",2],{"blog-ko-mix-two-fonts-in-paragraph":3},{"id":4,"title":5,"author":6,"body":10,"date":1508,"description":1509,"draft":1510,"extension":1511,"howTo":1512,"image":1533,"meta":1534,"navigation":226,"path":1535,"seo":1536,"stem":1537,"tags":1538,"updated":1533,"__hash__":1542},"blogKo/ko/blog/023.mix-two-fonts-in-paragraph.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":1498},"minimark",[13,18,22,26,41,185,188,205,209,1008,1022,1026,1044,1052,1067,1141,1151,1155,1158,1172,1372,1393,1397,1420,1424,1456,1460,1463,1480,1494],[14,15,17],"h2",{"id":16},"질문을-다시-말하면","질문을 다시 말하면",[19,20,21],"p",{},"한 단락 — 한 문장, 라벨, 표 셀 — 이 있고, 그 일부를 다른 글꼴로 쓰고 싶다. Helvetica 한 줄 안에 고정폭 코드 조각을. ASCII 주문 번호 옆에 일본어 이름을 Noto Sans JP로. 텍스트를 별도 블록으로 쪼개지 않고 단락 중간에 글꼴을 바꾸려면 어떻게 하나.",[14,23,25],{"id":24},"짧은-답","짧은 답",[19,27,28,32,33,36,37,40],{},[29,30,31],"code",{},"c.Text","는 여기서 맞는 도구가 아니다. 문자열 전체에 하나의 ",[29,34,35],{},"document.Style"," — 글꼴 패밀리도 하나 — 을 적용한다. 원하는 건 ",[29,38,39],{},"c.RichText","이고, 여기선 각 span이 자기 스타일을 갖는다:",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","c.RichText(func(rt *template.RichTextBuilder) {\n    rt.Span(\"Run \")\n    rt.Span(\"gofmt ./...\", template.FontFamily(\"Courier\"))\n    rt.Span(\" before you commit.\")\n})\n","go","",[29,49,50,92,118,159,179],{"__ignoreMap":47},[51,52,55,59,63,67,70,74,77,81,83,86,89],"span",{"class":53,"line":54},"line",1,[51,56,58],{"class":57},"sTEyZ","c",[51,60,62],{"class":61},"sMK4o",".",[51,64,66],{"class":65},"s2Zo4","RichText",[51,68,69],{"class":61},"(func(",[51,71,73],{"class":72},"sHdIc","rt",[51,75,76],{"class":61}," *",[51,78,80],{"class":79},"sBMFI","template",[51,82,62],{"class":61},[51,84,85],{"class":79},"RichTextBuilder",[51,87,88],{"class":61},")",[51,90,91],{"class":61}," {\n",[51,93,95,98,100,103,106,109,113,115],{"class":53,"line":94},2,[51,96,97],{"class":57},"    rt",[51,99,62],{"class":61},[51,101,102],{"class":65},"Span",[51,104,105],{"class":61},"(",[51,107,108],{"class":61},"\"",[51,110,112],{"class":111},"sfazB","Run ",[51,114,108],{"class":61},[51,116,117],{"class":61},")\n",[51,119,121,123,125,127,129,131,134,136,139,142,144,147,149,151,154,156],{"class":53,"line":120},3,[51,122,97],{"class":57},[51,124,62],{"class":61},[51,126,102],{"class":65},[51,128,105],{"class":61},[51,130,108],{"class":61},[51,132,133],{"class":111},"gofmt ./...",[51,135,108],{"class":61},[51,137,138],{"class":61},",",[51,140,141],{"class":57}," template",[51,143,62],{"class":61},[51,145,146],{"class":65},"FontFamily",[51,148,105],{"class":61},[51,150,108],{"class":61},[51,152,153],{"class":111},"Courier",[51,155,108],{"class":61},[51,157,158],{"class":61},"))\n",[51,160,162,164,166,168,170,172,175,177],{"class":53,"line":161},4,[51,163,97],{"class":57},[51,165,62],{"class":61},[51,167,102],{"class":65},[51,169,105],{"class":61},[51,171,108],{"class":61},[51,173,174],{"class":111}," before you commit.",[51,176,108],{"class":61},[51,178,117],{"class":61},[51,180,182],{"class":53,"line":181},5,[51,183,184],{"class":61},"})\n",[19,186,187],{},"span 3개, 글꼴 2개, 단락 1개. 레이아웃 엔진은 워드 프로세서처럼 span 경계를 넘나들며 줄을 바꾸므로, 고정폭 조각은 주변 Helvetica와 인라인으로 흐른다.",[19,189,190,192,193,196,197,200,201,204],{},[29,191,153],{},"가 ",[29,194,195],{},"WithFont"," 호출 없이 동작하는 건 PDF Standard 14 글꼴 중 하나이기 때문이다 — ",[29,198,199],{},"Helvetica",", ",[29,202,203],{},"Times-Roman","처럼 모든 뷰어가 이미 갖고 있다. 두 번째 글꼴이 직접 제공하는 TrueType 파일(브랜드 글꼴, CJK 글꼴)이라면 한 번 등록하고 이름으로 참조한다. 아래에서 더 다룬다.",[14,206,208],{"id":207},"동작하는-코드-helvetica-courier-글꼴-파일-없음","동작하는 코드 (Helvetica + Courier, 글꼴 파일 없음)",[42,210,212],{"className":44,"code":211,"language":46,"meta":47,"style":47},"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/pdf\"\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.RichText(func(rt *template.RichTextBuilder) {\n                rt.Span(\"Run \")\n                rt.Span(\"gofmt ./...\", template.FontFamily(\"Courier\"))\n                rt.Span(\" before every commit. \")\n                rt.Span(\"It is not optional\", template.Bold(), template.Italic())\n                rt.Span(\".\")\n            })\n            c.RichText(func(rt *template.RichTextBuilder) {\n                rt.Span(\"The field is \")\n                rt.Span(\"created_at\", template.FontFamily(\"Courier\"), template.TextColor(pdf.RGBHex(0xB00020)))\n                rt.Span(\" — not \")\n                rt.Span(\"createdAt\", template.FontFamily(\"Courier\"))\n                rt.Span(\".\")\n            })\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"mixed-fonts.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[29,213,214,222,228,237,248,257,262,272,282,292,302,307,312,326,346,370,408,414,419,438,467,503,529,549,584,604,644,663,669,694,714,776,796,832,851,856,862,868,873,895,911,929,935,982,997,1002],{"__ignoreMap":47},[51,215,216,219],{"class":53,"line":54},[51,217,218],{"class":61},"package",[51,220,221],{"class":79}," main\n",[51,223,224],{"class":53,"line":94},[51,225,227],{"emptyLinePlaceholder":226},true,"\n",[51,229,230,234],{"class":53,"line":120},[51,231,233],{"class":232},"s7zQu","import",[51,235,236],{"class":61}," (\n",[51,238,239,242,245],{"class":53,"line":161},[51,240,241],{"class":61},"    \"",[51,243,244],{"class":79},"log",[51,246,247],{"class":61},"\"\n",[51,249,250,252,255],{"class":53,"line":181},[51,251,241],{"class":61},[51,253,254],{"class":79},"os",[51,256,247],{"class":61},[51,258,260],{"class":53,"line":259},6,[51,261,227],{"emptyLinePlaceholder":226},[51,263,265,267,270],{"class":53,"line":264},7,[51,266,241],{"class":61},[51,268,269],{"class":79},"github.com/gpdf-dev/gpdf",[51,271,247],{"class":61},[51,273,275,277,280],{"class":53,"line":274},8,[51,276,241],{"class":61},[51,278,279],{"class":79},"github.com/gpdf-dev/gpdf/document",[51,281,247],{"class":61},[51,283,285,287,290],{"class":53,"line":284},9,[51,286,241],{"class":61},[51,288,289],{"class":79},"github.com/gpdf-dev/gpdf/pdf",[51,291,247],{"class":61},[51,293,295,297,300],{"class":53,"line":294},10,[51,296,241],{"class":61},[51,298,299],{"class":79},"github.com/gpdf-dev/gpdf/template",[51,301,247],{"class":61},[51,303,305],{"class":53,"line":304},11,[51,306,117],{"class":61},[51,308,310],{"class":53,"line":309},12,[51,311,227],{"emptyLinePlaceholder":226},[51,313,315,318,321,324],{"class":53,"line":314},13,[51,316,317],{"class":61},"func",[51,319,320],{"class":65}," main",[51,322,323],{"class":61},"()",[51,325,91],{"class":61},[51,327,329,332,335,338,340,343],{"class":53,"line":328},14,[51,330,331],{"class":57},"    doc ",[51,333,334],{"class":61},":=",[51,336,337],{"class":57}," gpdf",[51,339,62],{"class":61},[51,341,342],{"class":65},"NewDocument",[51,344,345],{"class":61},"(\n",[51,347,349,352,354,357,359,362,364,367],{"class":53,"line":348},15,[51,350,351],{"class":57},"        gpdf",[51,353,62],{"class":61},[51,355,356],{"class":65},"WithPageSize",[51,358,105],{"class":61},[51,360,361],{"class":57},"gpdf",[51,363,62],{"class":61},[51,365,366],{"class":57},"A4",[51,368,369],{"class":61},"),\n",[51,371,373,375,377,380,382,385,387,390,392,394,396,399,401,405],{"class":53,"line":372},16,[51,374,351],{"class":57},[51,376,62],{"class":61},[51,378,379],{"class":65},"WithMargins",[51,381,105],{"class":61},[51,383,384],{"class":57},"document",[51,386,62],{"class":61},[51,388,389],{"class":65},"UniformEdges",[51,391,105],{"class":61},[51,393,384],{"class":57},[51,395,62],{"class":61},[51,397,398],{"class":65},"Mm",[51,400,105],{"class":61},[51,402,404],{"class":403},"sbssI","20",[51,406,407],{"class":61},"))),\n",[51,409,411],{"class":53,"line":410},17,[51,412,413],{"class":61},"    )\n",[51,415,417],{"class":53,"line":416},18,[51,418,227],{"emptyLinePlaceholder":226},[51,420,422,425,427,430,432,435],{"class":53,"line":421},19,[51,423,424],{"class":57},"    page ",[51,426,334],{"class":61},[51,428,429],{"class":57}," doc",[51,431,62],{"class":61},[51,433,434],{"class":65},"AddPage",[51,436,437],{"class":61},"()\n",[51,439,441,444,446,449,451,454,456,458,460,463,465],{"class":53,"line":440},20,[51,442,443],{"class":57},"    page",[51,445,62],{"class":61},[51,447,448],{"class":65},"AutoRow",[51,450,69],{"class":61},[51,452,453],{"class":72},"r",[51,455,76],{"class":61},[51,457,80],{"class":79},[51,459,62],{"class":61},[51,461,462],{"class":79},"RowBuilder",[51,464,88],{"class":61},[51,466,91],{"class":61},[51,468,470,473,475,478,480,483,485,488,490,492,494,496,499,501],{"class":53,"line":469},21,[51,471,472],{"class":57},"        r",[51,474,62],{"class":61},[51,476,477],{"class":65},"Col",[51,479,105],{"class":61},[51,481,482],{"class":403},"12",[51,484,138],{"class":61},[51,486,487],{"class":61}," func(",[51,489,58],{"class":72},[51,491,76],{"class":61},[51,493,80],{"class":79},[51,495,62],{"class":61},[51,497,498],{"class":79},"ColBuilder",[51,500,88],{"class":61},[51,502,91],{"class":61},[51,504,506,509,511,513,515,517,519,521,523,525,527],{"class":53,"line":505},22,[51,507,508],{"class":57},"            c",[51,510,62],{"class":61},[51,512,66],{"class":65},[51,514,69],{"class":61},[51,516,73],{"class":72},[51,518,76],{"class":61},[51,520,80],{"class":79},[51,522,62],{"class":61},[51,524,85],{"class":79},[51,526,88],{"class":61},[51,528,91],{"class":61},[51,530,532,535,537,539,541,543,545,547],{"class":53,"line":531},23,[51,533,534],{"class":57},"                rt",[51,536,62],{"class":61},[51,538,102],{"class":65},[51,540,105],{"class":61},[51,542,108],{"class":61},[51,544,112],{"class":111},[51,546,108],{"class":61},[51,548,117],{"class":61},[51,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582],{"class":53,"line":551},24,[51,553,534],{"class":57},[51,555,62],{"class":61},[51,557,102],{"class":65},[51,559,105],{"class":61},[51,561,108],{"class":61},[51,563,133],{"class":111},[51,565,108],{"class":61},[51,567,138],{"class":61},[51,569,141],{"class":57},[51,571,62],{"class":61},[51,573,146],{"class":65},[51,575,105],{"class":61},[51,577,108],{"class":61},[51,579,153],{"class":111},[51,581,108],{"class":61},[51,583,158],{"class":61},[51,585,587,589,591,593,595,597,600,602],{"class":53,"line":586},25,[51,588,534],{"class":57},[51,590,62],{"class":61},[51,592,102],{"class":65},[51,594,105],{"class":61},[51,596,108],{"class":61},[51,598,599],{"class":111}," before every commit. ",[51,601,108],{"class":61},[51,603,117],{"class":61},[51,605,607,609,611,613,615,617,620,622,624,626,628,631,634,636,638,641],{"class":53,"line":606},26,[51,608,534],{"class":57},[51,610,62],{"class":61},[51,612,102],{"class":65},[51,614,105],{"class":61},[51,616,108],{"class":61},[51,618,619],{"class":111},"It is not optional",[51,621,108],{"class":61},[51,623,138],{"class":61},[51,625,141],{"class":57},[51,627,62],{"class":61},[51,629,630],{"class":65},"Bold",[51,632,633],{"class":61},"(),",[51,635,141],{"class":57},[51,637,62],{"class":61},[51,639,640],{"class":65},"Italic",[51,642,643],{"class":61},"())\n",[51,645,647,649,651,653,655,657,659,661],{"class":53,"line":646},27,[51,648,534],{"class":57},[51,650,62],{"class":61},[51,652,102],{"class":65},[51,654,105],{"class":61},[51,656,108],{"class":61},[51,658,62],{"class":111},[51,660,108],{"class":61},[51,662,117],{"class":61},[51,664,666],{"class":53,"line":665},28,[51,667,668],{"class":61},"            })\n",[51,670,672,674,676,678,680,682,684,686,688,690,692],{"class":53,"line":671},29,[51,673,508],{"class":57},[51,675,62],{"class":61},[51,677,66],{"class":65},[51,679,69],{"class":61},[51,681,73],{"class":72},[51,683,76],{"class":61},[51,685,80],{"class":79},[51,687,62],{"class":61},[51,689,85],{"class":79},[51,691,88],{"class":61},[51,693,91],{"class":61},[51,695,697,699,701,703,705,707,710,712],{"class":53,"line":696},30,[51,698,534],{"class":57},[51,700,62],{"class":61},[51,702,102],{"class":65},[51,704,105],{"class":61},[51,706,108],{"class":61},[51,708,709],{"class":111},"The field is ",[51,711,108],{"class":61},[51,713,117],{"class":61},[51,715,717,719,721,723,725,727,730,732,734,736,738,740,742,744,746,748,751,753,755,758,760,763,765,768,770,773],{"class":53,"line":716},31,[51,718,534],{"class":57},[51,720,62],{"class":61},[51,722,102],{"class":65},[51,724,105],{"class":61},[51,726,108],{"class":61},[51,728,729],{"class":111},"created_at",[51,731,108],{"class":61},[51,733,138],{"class":61},[51,735,141],{"class":57},[51,737,62],{"class":61},[51,739,146],{"class":65},[51,741,105],{"class":61},[51,743,108],{"class":61},[51,745,153],{"class":111},[51,747,108],{"class":61},[51,749,750],{"class":61},"),",[51,752,141],{"class":57},[51,754,62],{"class":61},[51,756,757],{"class":65},"TextColor",[51,759,105],{"class":61},[51,761,762],{"class":57},"pdf",[51,764,62],{"class":61},[51,766,767],{"class":65},"RGBHex",[51,769,105],{"class":61},[51,771,772],{"class":403},"0xB00020",[51,774,775],{"class":61},")))\n",[51,777,779,781,783,785,787,789,792,794],{"class":53,"line":778},32,[51,780,534],{"class":57},[51,782,62],{"class":61},[51,784,102],{"class":65},[51,786,105],{"class":61},[51,788,108],{"class":61},[51,790,791],{"class":111}," — not ",[51,793,108],{"class":61},[51,795,117],{"class":61},[51,797,799,801,803,805,807,809,812,814,816,818,820,822,824,826,828,830],{"class":53,"line":798},33,[51,800,534],{"class":57},[51,802,62],{"class":61},[51,804,102],{"class":65},[51,806,105],{"class":61},[51,808,108],{"class":61},[51,810,811],{"class":111},"createdAt",[51,813,108],{"class":61},[51,815,138],{"class":61},[51,817,141],{"class":57},[51,819,62],{"class":61},[51,821,146],{"class":65},[51,823,105],{"class":61},[51,825,108],{"class":61},[51,827,153],{"class":111},[51,829,108],{"class":61},[51,831,158],{"class":61},[51,833,835,837,839,841,843,845,847,849],{"class":53,"line":834},34,[51,836,534],{"class":57},[51,838,62],{"class":61},[51,840,102],{"class":65},[51,842,105],{"class":61},[51,844,108],{"class":61},[51,846,62],{"class":111},[51,848,108],{"class":61},[51,850,117],{"class":61},[51,852,854],{"class":53,"line":853},35,[51,855,668],{"class":61},[51,857,859],{"class":53,"line":858},36,[51,860,861],{"class":61},"        })\n",[51,863,865],{"class":53,"line":864},37,[51,866,867],{"class":61},"    })\n",[51,869,871],{"class":53,"line":870},38,[51,872,227],{"emptyLinePlaceholder":226},[51,874,876,879,881,884,886,888,890,893],{"class":53,"line":875},39,[51,877,878],{"class":57},"    data",[51,880,138],{"class":61},[51,882,883],{"class":57}," err ",[51,885,334],{"class":61},[51,887,429],{"class":57},[51,889,62],{"class":61},[51,891,892],{"class":65},"Generate",[51,894,437],{"class":61},[51,896,898,901,903,906,909],{"class":53,"line":897},40,[51,899,900],{"class":232},"    if",[51,902,883],{"class":57},[51,904,905],{"class":61},"!=",[51,907,908],{"class":61}," nil",[51,910,91],{"class":61},[51,912,914,917,919,922,924,927],{"class":53,"line":913},41,[51,915,916],{"class":57},"        log",[51,918,62],{"class":61},[51,920,921],{"class":65},"Fatal",[51,923,105],{"class":61},[51,925,926],{"class":57},"err",[51,928,117],{"class":61},[51,930,932],{"class":53,"line":931},42,[51,933,934],{"class":61},"    }\n",[51,936,938,940,942,944,947,949,952,954,956,959,961,963,966,968,971,974,976,978,980],{"class":53,"line":937},43,[51,939,900],{"class":232},[51,941,883],{"class":57},[51,943,334],{"class":61},[51,945,946],{"class":57}," os",[51,948,62],{"class":61},[51,950,951],{"class":65},"WriteFile",[51,953,105],{"class":61},[51,955,108],{"class":61},[51,957,958],{"class":111},"mixed-fonts.pdf",[51,960,108],{"class":61},[51,962,138],{"class":61},[51,964,965],{"class":57}," data",[51,967,138],{"class":61},[51,969,970],{"class":403}," 0o644",[51,972,973],{"class":61},");",[51,975,883],{"class":57},[51,977,905],{"class":61},[51,979,908],{"class":61},[51,981,91],{"class":61},[51,983,985,987,989,991,993,995],{"class":53,"line":984},44,[51,986,916],{"class":57},[51,988,62],{"class":61},[51,990,921],{"class":65},[51,992,105],{"class":61},[51,994,926],{"class":57},[51,996,117],{"class":61},[51,998,1000],{"class":53,"line":999},45,[51,1001,934],{"class":61},[51,1003,1005],{"class":53,"line":1004},46,[51,1006,1007],{"class":61},"}\n",[19,1009,1010,1011,1013,1014,200,1016,200,1019,1021],{},"본문은 Helvetica(기본값) 그대로, 인라인 식별자는 Courier로 바뀌고, 한 span은 기본 글꼴 위에 bold + italic을 얹는다. ",[29,1012,195],{}," 없음, 임베드 글꼴 데이터 없음 — PDF는 ",[29,1015,199],{},[29,1017,1018],{},"Helvetica-BoldOblique",[29,1020,153],{},"를 임베드되지 않은 Type 1 항목으로 참조하며, 모든 리더가 이미 갖고 있는 글꼴이다.",[14,1023,1025],{"id":1024},"richtext가-span들에-하는-일","RichText가 span들에 하는 일",[19,1027,1028,1029,1032,1033,1036,1037,1039,1040,1043],{},"각 ",[29,1030,1031],{},"rt.Span","은 자기 스타일 복사본을 가진 ",[29,1034,1035],{},"document.RichTextFragment","가 된다. 옵션 없이 호출한 span은 블록 스타일 — ",[29,1038,66],{},"에서는 열의 기본값, 즉 문서의 기본 글꼴과 크기 — 을 상속한다. ",[29,1041,1042],{},"template.FontFamily(\"Courier\")","로 호출한 span은 그 필드만 덮어쓰고 나머지는 그대로 둔다.",[19,1045,1046,1047,1051],{},"레이아웃 시 gpdf는 각 fragment를 단어 단위 run으로 나누고, 각 run을 ",[1048,1049,1050],"strong",{},"그 run 자신의 글꼴 메트릭","으로 측정한 다음 — 그래서 같은 줄의 Courier 단어와 Helvetica 단어가 올바른 폭이 된다 — 탐욕 알고리즘으로 run을 줄에 채운다. 한 줄의 run들은 베이스라인을 공유하므로, 24 pt span 옆에 12 pt span이 오면 아래쪽에서 정렬되고 줄 높이는 큰 쪽에 맞춰 늘어난다.",[19,1053,1054,1055,1057,1058,1062,1063,1066],{},"여기서 한 가지 헷갈리는 게 있다: ",[29,1056,39],{},"의 두 번째 인자는 ",[1059,1060,1061],"em",{},"단락 수준"," 스타일이고, span별 옵션은 ",[1059,1064,1065],{},"조각 수준","이다.",[1068,1069,1070,1083],"table",{},[1071,1072,1073],"thead",{},[1074,1075,1076,1080],"tr",{},[1077,1078,1079],"th",{},"옵션",[1077,1081,1082],{},"어디에 두나",[1084,1085,1086,1115],"tbody",{},[1074,1087,1088,1109],{},[1089,1090,1091,1093,1094,1093,1097,1093,1099,1093,1101,1093,1103,1093,1106],"td",{},[29,1092,146],{}," / ",[29,1095,1096],{},"FontSize",[29,1098,630],{},[29,1100,640],{},[29,1102,757],{},[29,1104,1105],{},"Underline",[29,1107,1108],{},"Strikethrough",[1089,1110,1111,1112,1114],{},"span별 — 각 ",[29,1113,1031],{},"에 전달",[1074,1116,1117,1135],{},[1089,1118,1119,1093,1122,1093,1125,1093,1128,1131,1132],{},[29,1120,1121],{},"AlignLeft",[29,1123,1124],{},"AlignCenter",[29,1126,1127],{},"AlignRight",[29,1129,1130],{},"AlignJustify",", 줄 높이, ",[29,1133,1134],{},"TextIndent",[1089,1136,1137,1138,1140],{},"단락 수준 — ",[29,1139,39],{},"의 두 번째 인자로 전달",[19,1142,1143,1144,1146,1147,1150],{},"개별 ",[29,1145,1031],{},"에 ",[29,1148,1149],{},"AlignRight()","를 붙여도 아무 일도 일어나지 않는다. 정렬은 줄의 속성이지 조각의 속성이 아니다.",[14,1152,1154],{"id":1153},"진짜-사례-라틴-글꼴-옆에-cjk-글꼴","진짜 사례: 라틴 글꼴 옆에 CJK 글꼴",[19,1156,1157],{},"문장 안 고정폭은 쉬운 버전이다. 사람들이 실제로 씨름하는 건 한 줄 안에서 서구 글꼴과 CJK 글꼴을 섞는 것 — 영어 라벨과 일본어 값, 제품 코드와 商品名. 두 가지를 알아야 한다.",[19,1159,1160,1161,1164,1165,1167,1168,1171],{},"첫째, ",[1048,1162,1163],{},"gpdf는 문자 체계로 글꼴을 고르지 않는다",". 어떤 span의 패밀리가 ",[29,1166,199],{},"인데 텍스트가 ",[29,1169,1170],{},"日本語","라면 두부 글자(□)가 나온다 — Helvetica에는 CJK 글리프가 없고, gpdf는 다른 등록된 글꼴을 몰래 끌어와 메우지 않는다. CJK span에는 직접 CJK 패밀리를 붙여야 한다:",[42,1173,1175],{"className":44,"code":1174,"language":46,"meta":47,"style":47},"ttf, _ := os.ReadFile(\"NotoSansJP-Regular.ttf\")\n\ndoc := gpdf.NewDocument(\n    gpdf.WithFont(\"NotoSansJP\", ttf),\n)\n// ...\nc.RichText(func(rt *template.RichTextBuilder) {\n    rt.Span(\"Customer: \")                                 // 기본값 → Helvetica\n    rt.Span(\"山田 太郎\", template.FontFamily(\"NotoSansJP\")) // CJK → Noto Sans JP\n    rt.Span(\"  (ID 10293)\")                               // 다시 Helvetica\n})\n",[29,1176,1177,1207,1211,1226,1251,1255,1261,1285,1307,1346,1368],{"__ignoreMap":47},[51,1178,1179,1182,1184,1187,1189,1191,1193,1196,1198,1200,1203,1205],{"class":53,"line":54},[51,1180,1181],{"class":57},"ttf",[51,1183,138],{"class":61},[51,1185,1186],{"class":57}," _ ",[51,1188,334],{"class":61},[51,1190,946],{"class":57},[51,1192,62],{"class":61},[51,1194,1195],{"class":65},"ReadFile",[51,1197,105],{"class":61},[51,1199,108],{"class":61},[51,1201,1202],{"class":111},"NotoSansJP-Regular.ttf",[51,1204,108],{"class":61},[51,1206,117],{"class":61},[51,1208,1209],{"class":53,"line":94},[51,1210,227],{"emptyLinePlaceholder":226},[51,1212,1213,1216,1218,1220,1222,1224],{"class":53,"line":120},[51,1214,1215],{"class":57},"doc ",[51,1217,334],{"class":61},[51,1219,337],{"class":57},[51,1221,62],{"class":61},[51,1223,342],{"class":65},[51,1225,345],{"class":61},[51,1227,1228,1231,1233,1235,1237,1239,1242,1244,1246,1249],{"class":53,"line":161},[51,1229,1230],{"class":57},"    gpdf",[51,1232,62],{"class":61},[51,1234,195],{"class":65},[51,1236,105],{"class":61},[51,1238,108],{"class":61},[51,1240,1241],{"class":111},"NotoSansJP",[51,1243,108],{"class":61},[51,1245,138],{"class":61},[51,1247,1248],{"class":57}," ttf",[51,1250,369],{"class":61},[51,1252,1253],{"class":53,"line":181},[51,1254,117],{"class":61},[51,1256,1257],{"class":53,"line":259},[51,1258,1260],{"class":1259},"sHwdD","// ...\n",[51,1262,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283],{"class":53,"line":264},[51,1264,58],{"class":57},[51,1266,62],{"class":61},[51,1268,66],{"class":65},[51,1270,69],{"class":61},[51,1272,73],{"class":72},[51,1274,76],{"class":61},[51,1276,80],{"class":79},[51,1278,62],{"class":61},[51,1280,85],{"class":79},[51,1282,88],{"class":61},[51,1284,91],{"class":61},[51,1286,1287,1289,1291,1293,1295,1297,1300,1302,1304],{"class":53,"line":274},[51,1288,97],{"class":57},[51,1290,62],{"class":61},[51,1292,102],{"class":65},[51,1294,105],{"class":61},[51,1296,108],{"class":61},[51,1298,1299],{"class":111},"Customer: ",[51,1301,108],{"class":61},[51,1303,88],{"class":61},[51,1305,1306],{"class":1259},"                                 // 기본값 → Helvetica\n",[51,1308,1309,1311,1313,1315,1317,1319,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1343],{"class":53,"line":284},[51,1310,97],{"class":57},[51,1312,62],{"class":61},[51,1314,102],{"class":65},[51,1316,105],{"class":61},[51,1318,108],{"class":61},[51,1320,1321],{"class":111},"山田 太郎",[51,1323,108],{"class":61},[51,1325,138],{"class":61},[51,1327,141],{"class":57},[51,1329,62],{"class":61},[51,1331,146],{"class":65},[51,1333,105],{"class":61},[51,1335,108],{"class":61},[51,1337,1241],{"class":111},[51,1339,108],{"class":61},[51,1341,1342],{"class":61},"))",[51,1344,1345],{"class":1259}," // CJK → Noto Sans JP\n",[51,1347,1348,1350,1352,1354,1356,1358,1361,1363,1365],{"class":53,"line":294},[51,1349,97],{"class":57},[51,1351,62],{"class":61},[51,1353,102],{"class":65},[51,1355,105],{"class":61},[51,1357,108],{"class":61},[51,1359,1360],{"class":111},"  (ID 10293)",[51,1362,108],{"class":61},[51,1364,88],{"class":61},[51,1366,1367],{"class":1259},"                               // 다시 Helvetica\n",[51,1369,1370],{"class":53,"line":304},[51,1371,184],{"class":61},[19,1373,1374,1375,1378,1379,1382,1383,1385,1386,1388,1389,1392],{},"둘째 — 그리고 이건 입 밖으로 말할 가치가 있는데 — 일본어 CJK 글꼴 대부분은 이미 쓸 만한 라틴 글리프를 갖고 있다. Noto Sans JP, IPAex, Source Han Sans, 전부 ",[29,1376,1377],{},"ID 10293","을 잘 그린다. 그러니 span별 혼용에 손대기 전에, 정말 두 글꼴이 필요한지 아니면 그냥 습관으로 여기까지 온 건지 따져 보라. 문서 전체가 \"일본어 + 약간의 ASCII\"라면 가장 간단한 건 ",[29,1380,1381],{},"gpdf.WithDefaultFont(\"NotoSansJP\", 11)","이고 아예 섞지 않는 것이다. ",[29,1384,66],{}," + ",[29,1387,146],{},"는 정말로 ",[1059,1390,1391],{},"다른 인상","을 원할 때 쓴다 — 숫자엔 깔끔한 기하학적 라틴체, 본문엔 휴머니스트 CJK체 — 단지 문자가 표시되게 하려는 게 아니라.",[14,1394,1396],{"id":1395},"ctext로-충분할-때","c.Text로 충분할 때",[19,1398,1399,1400,1402,1403,1406,1407,1409,1410,1412,1413,1416,1417,1419],{},"문자열 전체가 한 글꼴이면 ",[29,1401,31],{},"를 계속 써라 — 더 가볍고 읽기도 낫다. ",[29,1404,1405],{},"c.Text(\"発行日: 2026-05-11\", template.FontFamily(\"NotoSansJP\"))","은 줄 전체가 한 글꼴이고 ",[29,1408,31],{},"가 처리한다. ",[29,1411,66],{},"가 값을 하는 건 스타일이 문자열 ",[1059,1414,1415],{},"안에서"," 바뀔 때뿐이다. 단일 스타일 한 줄을 그저 할 수 있다는 이유로 ",[29,1418,66],{}," 콜백으로 감싸지 마라.",[14,1421,1423],{"id":1422},"관련-레시피","관련 레시피",[1425,1426,1427,1439,1446],"ul",{},[1428,1429,1430,1435,1436,1438],"li",{},[1431,1432,1434],"a",{"href":1433},"/ko/blog/bold-italic-together","gpdf에서 굵게와 기울임을 동시에 쓰는 방법"," — 같은 ",[29,1437,66],{}," span 메커니즘을 패밀리가 아니라 굵기와 기울기에 적용한 것",[1428,1440,1441,1445],{},[1431,1442,1444],{"href":1443},"/ko/blog/add-custom-truetype-font","gpdf에 커스텀 TrueType 글꼴을 추가하는 방법"," — 섞고 싶은 두 번째 글꼴 등록하기",[1428,1447,1448,1452,1453,1455],{},[1431,1449,1451],{"href":1450},"/ko/blog/embed-japanese-font","gpdf에서 일본어 글꼴을 임베드하는 방법"," — 혼용 줄의 CJK 쪽 ",[29,1454,195],{}," 사용법",[14,1457,1459],{"id":1458},"gpdf-써-보기","gpdf 써 보기",[19,1461,1462],{},"gpdf는 PDF를 생성하는 Go 라이브러리다. MIT 라이선스, 외부 의존성 제로, CJK 기본 지원.",[42,1464,1468],{"className":1465,"code":1466,"language":1467,"meta":47,"style":47},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[29,1469,1470],{"__ignoreMap":47},[51,1471,1472,1474,1477],{"class":53,"line":54},[51,1473,46],{"class":79},[51,1475,1476],{"class":111}," get",[51,1478,1479],{"class":111}," github.com/gpdf-dev/gpdf\n",[19,1481,1482,1488,1489],{},[1431,1483,1487],{"href":1484,"rel":1485},"https://github.com/gpdf-dev/gpdf",[1486],"nofollow","⭐ Star on GitHub"," · ",[1431,1490,1493],{"href":1491,"rel":1492},"https://gpdf.dev/ko/docs/quickstart",[1486],"문서 읽기",[1495,1496,1497],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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}",{"title":47,"searchDepth":94,"depth":94,"links":1499},[1500,1501,1502,1503,1504,1505,1506,1507],{"id":16,"depth":94,"text":17},{"id":24,"depth":94,"text":25},{"id":207,"depth":94,"text":208},{"id":1024,"depth":94,"text":1025},{"id":1153,"depth":94,"text":1154},{"id":1395,"depth":94,"text":1396},{"id":1422,"depth":94,"text":1423},{"id":1458,"depth":94,"text":1459},"2026-05-11","gpdf에서 한 단락 안에 여러 글꼴을 섞으려면 c.RichText를 쓰고 각 span에 template.FontFamily를 지정한다. c.Text는 문자열 전체에 한 글꼴만 적용한다.",false,"md",{"name":1513,"totalTime":1514,"tools":1515,"steps":1517},"gpdf 한 단락 안에서 두 글꼴 패밀리 섞기","PT10M",[1516],"Go 1.22+",[1518,1521,1524,1527,1530],{"name":1519,"text":1520},"c.Text가 아니라 c.RichText를 쓴다","c.Text는 문자열 전체에 하나의 Style을 적용한다. 단락 중간에 글꼴을 바꾸려면 c.RichText(func(rt) { ... })를 호출하고 각 조각을 별도의 rt.Span으로 추가한다.",{"name":1522,"text":1523},"바꾸려는 span에 template.FontFamily를 지정한다","rt.Span(\"gofmt ./...\", template.FontFamily(\"Courier\")) 처럼 쓴다. FontFamily가 없는 span은 문서의 기본 글꼴 패밀리를 상속한다.",{"name":1525,"text":1526},"Standard 14 이름을 쓰면 글꼴 등록이 필요 없다","Helvetica / Courier / Times (그리고 Bold / Oblique 변형)는 모든 PDF 뷰어에 들어 있어서, 이들을 섞을 때 WithFont 호출이 필요 없다.",{"name":1528,"text":1529},"두 번째 글꼴이 커스텀이거나 CJK라면 먼저 TTF를 등록한다","TrueType 패밀리는 생성 시 gpdf.WithFont(\"NotoSansJP\", ttfBytes)를 한 번 호출하고, span 안에서 \"NotoSansJP\"를 이름으로 참조한다. gpdf는 문자 체계 단위로 자동 폴백하지 않는다.",{"name":1531,"text":1532},"같은 span에 FontSize / Bold / TextColor를 겹쳐 쓴다","각 span은 자기 Style을 가지므로 rt.Span(\"BIG\", template.FontSize(24))는 크기만 바꾸고 이웃 span은 자기 크기를 유지한다. 줄 높이는 가장 큰 span을 따라간다.",null,{},"/ko/blog/mix-two-fonts-in-paragraph",{"title":5,"description":1509},"ko/blog/023.mix-two-fonts-in-paragraph",[1539,1540,1541],"recipe","tutorial","cjk","0OcU2S1uhz9B7KWHvteu4ZF19DCRB9S6oTnM3x5NqFQ",1779199026604]