[{"data":1,"prerenderedAt":2297},["ShallowReactive",2],{"blog-zh-nest-row-in-col":3},{"id":4,"title":5,"author":6,"body":10,"date":880,"description":2263,"draft":2264,"extension":2265,"howTo":2266,"image":2287,"meta":2288,"navigation":464,"path":2289,"seo":2290,"stem":2291,"tags":2292,"updated":2287,"__hash__":2296},"blogZh/zh/blog/025.nest-row-in-col.md","如何在 gpdf 的 Col 中嵌套一个 Row？",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/zh/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":2250},"minimark",[13,17,49,52,95,99,108,415,440,444,447,1149,1166,1173,1179,1602,1621,1625,1636,1853,1866,1869,1884,1940,1957,1961,1967,2174,2181,2184,2210,2214,2217,2234,2246],[14,15,16],"h2",{"id":16},"换种问法",[18,19,20,21,25,26,29,30,32,33,40,41,44,45,48],"p",{},"你习惯了 Bootstrap 或 Tailwind，",[22,23,24],"code",{},".row"," 里面套 ",[22,27,28],{},".col","，再套 ",[22,31,24],{},"，网格可以一直级联。坐下来用 ",[34,35,39],"a",{"href":36,"rel":37},"https://github.com/gpdf-dev/gpdf",[38],"nofollow","gpdf","，看到同样的 ",[22,42,43],{},"r.Col(span, fn)"," 语法，就在列回调里去找 ",[22,46,47],{},"c.Row(...)","。补全没出来。这是漏写吗？",[14,50,51],{"id":51},"一句话回答",[18,53,54,55,59,60,63,64,67,68,67,71,67,74,67,77,67,80,83,84,67,87,90,91,94],{},"不是。",[56,57,58],"strong",{},"gpdf 的 12 列网格是有意保持扁平的。"," ",[22,61,62],{},"ColBuilder"," 只接受内容 — ",[22,65,66],{},"Text"," / ",[22,69,70],{},"Image",[22,72,73],{},"Table",[22,75,76],{},"Box",[22,78,79],{},"List",[22,81,82],{},"Spacer"," — 而 ",[22,85,86],{},"Row",[22,88,89],{},"AutoRow"," 只在 ",[22,92,93],{},"PageBuilder"," 上。如果你来这里找语法，答案是没有。下面给你三种替代。",[14,96,98],{"id":97},"api-的实际样子","API 的实际样子",[18,100,101,103,104,107],{},[22,102,62],{}," 的方法集（来自 ",[22,105,106],{},"gpdf/template/grid.go","）：",[109,110,115],"pre",{"className":111,"code":112,"language":113,"meta":114,"style":114},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func (c *ColBuilder) Text(text string, opts ...TextOption)\nfunc (c *ColBuilder) Image(src []byte, opts ...ImageOption)\nfunc (c *ColBuilder) Box(fn func(c *ColBuilder), opts ...BoxOption)\nfunc (c *ColBuilder) Table(header []string, rows [][]string, opts ...TableOption)\nfunc (c *ColBuilder) Line(opts ...LineOption)\nfunc (c *ColBuilder) List(items []string, opts ...ListOption)\nfunc (c *ColBuilder) Spacer(height document.Value)\n// …PageNumber, TotalPages, RichText, QRCode, Barcode\n","go","",[22,116,117,171,211,257,306,336,374,408],{"__ignoreMap":114},[118,119,122,126,129,133,136,139,142,146,149,152,156,159,162,165,168],"span",{"class":120,"line":121},"line",1,[118,123,125],{"class":124},"sMK4o","func",[118,127,128],{"class":124}," (",[118,130,132],{"class":131},"sHdIc","c ",[118,134,135],{"class":124},"*",[118,137,62],{"class":138},"sBMFI",[118,140,141],{"class":124},")",[118,143,145],{"class":144},"s2Zo4"," Text",[118,147,148],{"class":124},"(",[118,150,151],{"class":131},"text",[118,153,155],{"class":154},"spNyl"," string",[118,157,158],{"class":124},",",[118,160,161],{"class":131}," opts",[118,163,164],{"class":124}," ...",[118,166,167],{"class":138},"TextOption",[118,169,170],{"class":124},")\n",[118,172,174,176,178,180,182,184,186,189,191,194,197,200,202,204,206,209],{"class":120,"line":173},2,[118,175,125],{"class":124},[118,177,128],{"class":124},[118,179,132],{"class":131},[118,181,135],{"class":124},[118,183,62],{"class":138},[118,185,141],{"class":124},[118,187,188],{"class":144}," Image",[118,190,148],{"class":124},[118,192,193],{"class":131},"src",[118,195,196],{"class":124}," []",[118,198,199],{"class":154},"byte",[118,201,158],{"class":124},[118,203,161],{"class":131},[118,205,164],{"class":124},[118,207,208],{"class":138},"ImageOption",[118,210,170],{"class":124},[118,212,214,216,218,220,222,224,226,229,231,234,237,240,243,245,248,250,252,255],{"class":120,"line":213},3,[118,215,125],{"class":124},[118,217,128],{"class":124},[118,219,132],{"class":131},[118,221,135],{"class":124},[118,223,62],{"class":138},[118,225,141],{"class":124},[118,227,228],{"class":144}," Box",[118,230,148],{"class":124},[118,232,233],{"class":131},"fn",[118,235,236],{"class":124}," func(",[118,238,239],{"class":131},"c",[118,241,242],{"class":124}," *",[118,244,62],{"class":138},[118,246,247],{"class":124},"),",[118,249,161],{"class":131},[118,251,164],{"class":124},[118,253,254],{"class":138},"BoxOption",[118,256,170],{"class":124},[118,258,260,262,264,266,268,270,272,275,277,280,282,285,287,290,293,295,297,299,301,304],{"class":120,"line":259},4,[118,261,125],{"class":124},[118,263,128],{"class":124},[118,265,132],{"class":131},[118,267,135],{"class":124},[118,269,62],{"class":138},[118,271,141],{"class":124},[118,273,274],{"class":144}," Table",[118,276,148],{"class":124},[118,278,279],{"class":131},"header",[118,281,196],{"class":124},[118,283,284],{"class":154},"string",[118,286,158],{"class":124},[118,288,289],{"class":131}," rows",[118,291,292],{"class":124}," [][]",[118,294,284],{"class":154},[118,296,158],{"class":124},[118,298,161],{"class":131},[118,300,164],{"class":124},[118,302,303],{"class":138},"TableOption",[118,305,170],{"class":124},[118,307,309,311,313,315,317,319,321,324,326,329,331,334],{"class":120,"line":308},5,[118,310,125],{"class":124},[118,312,128],{"class":124},[118,314,132],{"class":131},[118,316,135],{"class":124},[118,318,62],{"class":138},[118,320,141],{"class":124},[118,322,323],{"class":144}," Line",[118,325,148],{"class":124},[118,327,328],{"class":131},"opts",[118,330,164],{"class":124},[118,332,333],{"class":138},"LineOption",[118,335,170],{"class":124},[118,337,339,341,343,345,347,349,351,354,356,359,361,363,365,367,369,372],{"class":120,"line":338},6,[118,340,125],{"class":124},[118,342,128],{"class":124},[118,344,132],{"class":131},[118,346,135],{"class":124},[118,348,62],{"class":138},[118,350,141],{"class":124},[118,352,353],{"class":144}," List",[118,355,148],{"class":124},[118,357,358],{"class":131},"items",[118,360,196],{"class":124},[118,362,284],{"class":154},[118,364,158],{"class":124},[118,366,161],{"class":131},[118,368,164],{"class":124},[118,370,371],{"class":138},"ListOption",[118,373,170],{"class":124},[118,375,377,379,381,383,385,387,389,392,394,397,400,403,406],{"class":120,"line":376},7,[118,378,125],{"class":124},[118,380,128],{"class":124},[118,382,132],{"class":131},[118,384,135],{"class":124},[118,386,62],{"class":138},[118,388,141],{"class":124},[118,390,391],{"class":144}," Spacer",[118,393,148],{"class":124},[118,395,396],{"class":131},"height",[118,398,399],{"class":138}," document",[118,401,402],{"class":124},".",[118,404,405],{"class":138},"Value",[118,407,170],{"class":124},[118,409,411],{"class":120,"line":410},8,[118,412,414],{"class":413},"sHwdD","// …PageNumber, TotalPages, RichText, QRCode, Barcode\n",[18,416,417,418,420,421,423,424,427,428,431,432,435,436,439],{},"没有 ",[22,419,86],{},"，没有 ",[22,422,89],{},"，也没有 ",[22,425,426],{},"Col","。Col → Row 这条路径作为方法不存在，最接近的是 ",[22,429,430],{},"c.Box(fn, ...)","，但它接收的还是一个 ",[22,433,434],{},"*ColBuilder","，不是 Row。",[56,437,438],{},"你可以把列套进列里","（通过 Box 半模拟），但你不能在一列里打开一行新的横向布局。这就是约束。",[14,441,443],{"id":442},"惯用写法-1-页面层的兄弟-row","惯用写法 1 — 页面层的兄弟 Row",[18,445,446],{},"写下\"嵌套 Row\"的场合，90% 实际上要的是这个。",[109,448,450],{"className":111,"code":449,"language":113,"meta":114,"style":114},"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(document.A4),\n        gpdf.WithMargins(document.UniformEdges(document.Mm(15))),\n    )\n    page := doc.AddPage()\n\n    // 想写但写不了：\n    //\n    //   page.AutoRow(func(r *template.RowBuilder) {\n    //       r.Col(8, func(c *template.ColBuilder) {\n    //           c.Row(...) ❌ 不存在\n    //       })\n    //   })\n\n    // 实际这么写：\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(8, func(c *template.ColBuilder) {\n            c.Text(\"文章标题\", template.FontSize(18), template.Bold())\n        })\n        r.Col(4, func(c *template.ColBuilder) {\n            c.Text(\"2026-05-16\")\n        })\n    })\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(8, func(c *template.ColBuilder) {\n            c.Text(\"导语段落占据同样 8 宽的列。\")\n        })\n        r.Col(4, func(c *template.ColBuilder) {\n            c.Text(\"作者：Taiki Noda\")\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    _ = os.WriteFile(\"flat.pdf\", data, 0o644)\n}\n",[22,451,452,460,466,475,486,495,499,508,517,527,532,537,551,572,596,633,639,658,663,669,675,681,687,693,699,705,710,716,746,779,827,833,865,885,890,896,921,952,972,977,1008,1028,1033,1038,1043,1065,1081,1099,1105,1143],{"__ignoreMap":114},[118,453,454,457],{"class":120,"line":121},[118,455,456],{"class":124},"package",[118,458,459],{"class":138}," main\n",[118,461,462],{"class":120,"line":173},[118,463,465],{"emptyLinePlaceholder":464},true,"\n",[118,467,468,472],{"class":120,"line":213},[118,469,471],{"class":470},"s7zQu","import",[118,473,474],{"class":124}," (\n",[118,476,477,480,483],{"class":120,"line":259},[118,478,479],{"class":124},"    \"",[118,481,482],{"class":138},"log",[118,484,485],{"class":124},"\"\n",[118,487,488,490,493],{"class":120,"line":308},[118,489,479],{"class":124},[118,491,492],{"class":138},"os",[118,494,485],{"class":124},[118,496,497],{"class":120,"line":338},[118,498,465],{"emptyLinePlaceholder":464},[118,500,501,503,506],{"class":120,"line":376},[118,502,479],{"class":124},[118,504,505],{"class":138},"github.com/gpdf-dev/gpdf",[118,507,485],{"class":124},[118,509,510,512,515],{"class":120,"line":410},[118,511,479],{"class":124},[118,513,514],{"class":138},"github.com/gpdf-dev/gpdf/document",[118,516,485],{"class":124},[118,518,520,522,525],{"class":120,"line":519},9,[118,521,479],{"class":124},[118,523,524],{"class":138},"github.com/gpdf-dev/gpdf/template",[118,526,485],{"class":124},[118,528,530],{"class":120,"line":529},10,[118,531,170],{"class":124},[118,533,535],{"class":120,"line":534},11,[118,536,465],{"emptyLinePlaceholder":464},[118,538,540,542,545,548],{"class":120,"line":539},12,[118,541,125],{"class":124},[118,543,544],{"class":144}," main",[118,546,547],{"class":124},"()",[118,549,550],{"class":124}," {\n",[118,552,554,558,561,564,566,569],{"class":120,"line":553},13,[118,555,557],{"class":556},"sTEyZ","    doc ",[118,559,560],{"class":124},":=",[118,562,563],{"class":556}," gpdf",[118,565,402],{"class":124},[118,567,568],{"class":144},"NewDocument",[118,570,571],{"class":124},"(\n",[118,573,575,578,580,583,585,588,590,593],{"class":120,"line":574},14,[118,576,577],{"class":556},"        gpdf",[118,579,402],{"class":124},[118,581,582],{"class":144},"WithPageSize",[118,584,148],{"class":124},[118,586,587],{"class":556},"document",[118,589,402],{"class":124},[118,591,592],{"class":556},"A4",[118,594,595],{"class":124},"),\n",[118,597,599,601,603,606,608,610,612,615,617,619,621,624,626,630],{"class":120,"line":598},15,[118,600,577],{"class":556},[118,602,402],{"class":124},[118,604,605],{"class":144},"WithMargins",[118,607,148],{"class":124},[118,609,587],{"class":556},[118,611,402],{"class":124},[118,613,614],{"class":144},"UniformEdges",[118,616,148],{"class":124},[118,618,587],{"class":556},[118,620,402],{"class":124},[118,622,623],{"class":144},"Mm",[118,625,148],{"class":124},[118,627,629],{"class":628},"sbssI","15",[118,631,632],{"class":124},"))),\n",[118,634,636],{"class":120,"line":635},16,[118,637,638],{"class":124},"    )\n",[118,640,642,645,647,650,652,655],{"class":120,"line":641},17,[118,643,644],{"class":556},"    page ",[118,646,560],{"class":124},[118,648,649],{"class":556}," doc",[118,651,402],{"class":124},[118,653,654],{"class":144},"AddPage",[118,656,657],{"class":124},"()\n",[118,659,661],{"class":120,"line":660},18,[118,662,465],{"emptyLinePlaceholder":464},[118,664,666],{"class":120,"line":665},19,[118,667,668],{"class":413},"    // 想写但写不了：\n",[118,670,672],{"class":120,"line":671},20,[118,673,674],{"class":413},"    //\n",[118,676,678],{"class":120,"line":677},21,[118,679,680],{"class":413},"    //   page.AutoRow(func(r *template.RowBuilder) {\n",[118,682,684],{"class":120,"line":683},22,[118,685,686],{"class":413},"    //       r.Col(8, func(c *template.ColBuilder) {\n",[118,688,690],{"class":120,"line":689},23,[118,691,692],{"class":413},"    //           c.Row(...) ❌ 不存在\n",[118,694,696],{"class":120,"line":695},24,[118,697,698],{"class":413},"    //       })\n",[118,700,702],{"class":120,"line":701},25,[118,703,704],{"class":413},"    //   })\n",[118,706,708],{"class":120,"line":707},26,[118,709,465],{"emptyLinePlaceholder":464},[118,711,713],{"class":120,"line":712},27,[118,714,715],{"class":413},"    // 实际这么写：\n",[118,717,719,722,724,726,729,732,734,737,739,742,744],{"class":120,"line":718},28,[118,720,721],{"class":556},"    page",[118,723,402],{"class":124},[118,725,89],{"class":144},[118,727,728],{"class":124},"(func(",[118,730,731],{"class":131},"r",[118,733,242],{"class":124},[118,735,736],{"class":138},"template",[118,738,402],{"class":124},[118,740,741],{"class":138},"RowBuilder",[118,743,141],{"class":124},[118,745,550],{"class":124},[118,747,749,752,754,756,758,761,763,765,767,769,771,773,775,777],{"class":120,"line":748},29,[118,750,751],{"class":556},"        r",[118,753,402],{"class":124},[118,755,426],{"class":144},[118,757,148],{"class":124},[118,759,760],{"class":628},"8",[118,762,158],{"class":124},[118,764,236],{"class":124},[118,766,239],{"class":131},[118,768,242],{"class":124},[118,770,736],{"class":138},[118,772,402],{"class":124},[118,774,62],{"class":138},[118,776,141],{"class":124},[118,778,550],{"class":124},[118,780,782,785,787,789,791,794,798,800,802,805,807,810,812,815,817,819,821,824],{"class":120,"line":781},30,[118,783,784],{"class":556},"            c",[118,786,402],{"class":124},[118,788,66],{"class":144},[118,790,148],{"class":124},[118,792,793],{"class":124},"\"",[118,795,797],{"class":796},"sfazB","文章标题",[118,799,793],{"class":124},[118,801,158],{"class":124},[118,803,804],{"class":556}," template",[118,806,402],{"class":124},[118,808,809],{"class":144},"FontSize",[118,811,148],{"class":124},[118,813,814],{"class":628},"18",[118,816,247],{"class":124},[118,818,804],{"class":556},[118,820,402],{"class":124},[118,822,823],{"class":144},"Bold",[118,825,826],{"class":124},"())\n",[118,828,830],{"class":120,"line":829},31,[118,831,832],{"class":124},"        })\n",[118,834,836,838,840,842,844,847,849,851,853,855,857,859,861,863],{"class":120,"line":835},32,[118,837,751],{"class":556},[118,839,402],{"class":124},[118,841,426],{"class":144},[118,843,148],{"class":124},[118,845,846],{"class":628},"4",[118,848,158],{"class":124},[118,850,236],{"class":124},[118,852,239],{"class":131},[118,854,242],{"class":124},[118,856,736],{"class":138},[118,858,402],{"class":124},[118,860,62],{"class":138},[118,862,141],{"class":124},[118,864,550],{"class":124},[118,866,868,870,872,874,876,878,881,883],{"class":120,"line":867},33,[118,869,784],{"class":556},[118,871,402],{"class":124},[118,873,66],{"class":144},[118,875,148],{"class":124},[118,877,793],{"class":124},[118,879,880],{"class":796},"2026-05-16",[118,882,793],{"class":124},[118,884,170],{"class":124},[118,886,888],{"class":120,"line":887},34,[118,889,832],{"class":124},[118,891,893],{"class":120,"line":892},35,[118,894,895],{"class":124},"    })\n",[118,897,899,901,903,905,907,909,911,913,915,917,919],{"class":120,"line":898},36,[118,900,721],{"class":556},[118,902,402],{"class":124},[118,904,89],{"class":144},[118,906,728],{"class":124},[118,908,731],{"class":131},[118,910,242],{"class":124},[118,912,736],{"class":138},[118,914,402],{"class":124},[118,916,741],{"class":138},[118,918,141],{"class":124},[118,920,550],{"class":124},[118,922,924,926,928,930,932,934,936,938,940,942,944,946,948,950],{"class":120,"line":923},37,[118,925,751],{"class":556},[118,927,402],{"class":124},[118,929,426],{"class":144},[118,931,148],{"class":124},[118,933,760],{"class":628},[118,935,158],{"class":124},[118,937,236],{"class":124},[118,939,239],{"class":131},[118,941,242],{"class":124},[118,943,736],{"class":138},[118,945,402],{"class":124},[118,947,62],{"class":138},[118,949,141],{"class":124},[118,951,550],{"class":124},[118,953,955,957,959,961,963,965,968,970],{"class":120,"line":954},38,[118,956,784],{"class":556},[118,958,402],{"class":124},[118,960,66],{"class":144},[118,962,148],{"class":124},[118,964,793],{"class":124},[118,966,967],{"class":796},"导语段落占据同样 8 宽的列。",[118,969,793],{"class":124},[118,971,170],{"class":124},[118,973,975],{"class":120,"line":974},39,[118,976,832],{"class":124},[118,978,980,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006],{"class":120,"line":979},40,[118,981,751],{"class":556},[118,983,402],{"class":124},[118,985,426],{"class":144},[118,987,148],{"class":124},[118,989,846],{"class":628},[118,991,158],{"class":124},[118,993,236],{"class":124},[118,995,239],{"class":131},[118,997,242],{"class":124},[118,999,736],{"class":138},[118,1001,402],{"class":124},[118,1003,62],{"class":138},[118,1005,141],{"class":124},[118,1007,550],{"class":124},[118,1009,1011,1013,1015,1017,1019,1021,1024,1026],{"class":120,"line":1010},41,[118,1012,784],{"class":556},[118,1014,402],{"class":124},[118,1016,66],{"class":144},[118,1018,148],{"class":124},[118,1020,793],{"class":124},[118,1022,1023],{"class":796},"作者：Taiki Noda",[118,1025,793],{"class":124},[118,1027,170],{"class":124},[118,1029,1031],{"class":120,"line":1030},42,[118,1032,832],{"class":124},[118,1034,1036],{"class":120,"line":1035},43,[118,1037,895],{"class":124},[118,1039,1041],{"class":120,"line":1040},44,[118,1042,465],{"emptyLinePlaceholder":464},[118,1044,1046,1049,1051,1054,1056,1058,1060,1063],{"class":120,"line":1045},45,[118,1047,1048],{"class":556},"    data",[118,1050,158],{"class":124},[118,1052,1053],{"class":556}," err ",[118,1055,560],{"class":124},[118,1057,649],{"class":556},[118,1059,402],{"class":124},[118,1061,1062],{"class":144},"Generate",[118,1064,657],{"class":124},[118,1066,1068,1071,1073,1076,1079],{"class":120,"line":1067},46,[118,1069,1070],{"class":470},"    if",[118,1072,1053],{"class":556},[118,1074,1075],{"class":124},"!=",[118,1077,1078],{"class":124}," nil",[118,1080,550],{"class":124},[118,1082,1084,1087,1089,1092,1094,1097],{"class":120,"line":1083},47,[118,1085,1086],{"class":556},"        log",[118,1088,402],{"class":124},[118,1090,1091],{"class":144},"Fatal",[118,1093,148],{"class":124},[118,1095,1096],{"class":556},"err",[118,1098,170],{"class":124},[118,1100,1102],{"class":120,"line":1101},48,[118,1103,1104],{"class":124},"    }\n",[118,1106,1108,1111,1114,1117,1119,1122,1124,1126,1129,1131,1133,1136,1138,1141],{"class":120,"line":1107},49,[118,1109,1110],{"class":556},"    _ ",[118,1112,1113],{"class":124},"=",[118,1115,1116],{"class":556}," os",[118,1118,402],{"class":124},[118,1120,1121],{"class":144},"WriteFile",[118,1123,148],{"class":124},[118,1125,793],{"class":124},[118,1127,1128],{"class":796},"flat.pdf",[118,1130,793],{"class":124},[118,1132,158],{"class":124},[118,1134,1135],{"class":556}," data",[118,1137,158],{"class":124},[118,1139,1140],{"class":628}," 0o644",[118,1142,170],{"class":124},[118,1144,1146],{"class":120,"line":1145},50,[118,1147,1148],{"class":124},"}\n",[18,1150,1151,1152,1154,1155,1158,1159,1162,1163,1165],{},"两个 ",[22,1153,89],{}," 共享同样的 ",[22,1156,1157],{},"8+4"," 跨度，所以视觉上列是对齐的。这不是子网格，而是两行扁平 Row 用了同样的分割。和 CSS 里 ",[22,1160,1161],{},".col-8"," 内嵌 ",[22,1164,24],{}," 渲染出来的输出是一样的 — 因为嵌套原本买到的只是语法上的局部性，gpdf 把这份预算用在了\"列宽一致性\"上。",[14,1167,1169,1170],{"id":1168},"惯用写法-2-视觉分组用-cbox","惯用写法 2 — 视觉分组用 ",[22,1171,1172],{},"c.Box",[18,1174,1175,1176,1178],{},"如果真实动机是\"在这列里画一个带边框的卡片，里面叠两行内容\"，那你要的是 ",[22,1177,76],{},"，不是子 Row：",[109,1180,1182],{"className":111,"code":1181,"language":113,"meta":114,"style":114},"page.AutoRow(func(r *template.RowBuilder) {\n    r.Col(6, func(c *template.ColBuilder) {\n        c.Box(func(c *template.ColBuilder) {\n            c.Text(\"账单地址\", template.Bold())\n            c.Text(\"艾克姆有限公司\")\n            c.Text(\"上海市浦东新区\")\n        },\n            template.WithBoxBorder(template.Border(\n                template.BorderWidth(document.Pt(1)),\n                template.BorderColor(pdf.RGBHex(0xBDBDBD)),\n            )),\n            template.WithBoxPadding(document.UniformEdges(document.Mm(4))),\n        )\n    })\n    r.Col(6, func(c *template.ColBuilder) {\n        c.Box(func(c *template.ColBuilder) {\n            c.Text(\"收货地址\", template.Bold())\n            c.Text(\"同账单地址\")\n        },\n            template.WithBoxPadding(document.UniformEdges(document.Mm(4))),\n        )\n    })\n})\n",[22,1183,1184,1209,1241,1266,1293,1312,1331,1336,1357,1384,1410,1415,1446,1451,1455,1485,1509,1536,1555,1559,1589,1593,1597],{"__ignoreMap":114},[118,1185,1186,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207],{"class":120,"line":121},[118,1187,1188],{"class":556},"page",[118,1190,402],{"class":124},[118,1192,89],{"class":144},[118,1194,728],{"class":124},[118,1196,731],{"class":131},[118,1198,242],{"class":124},[118,1200,736],{"class":138},[118,1202,402],{"class":124},[118,1204,741],{"class":138},[118,1206,141],{"class":124},[118,1208,550],{"class":124},[118,1210,1211,1214,1216,1218,1220,1223,1225,1227,1229,1231,1233,1235,1237,1239],{"class":120,"line":173},[118,1212,1213],{"class":556},"    r",[118,1215,402],{"class":124},[118,1217,426],{"class":144},[118,1219,148],{"class":124},[118,1221,1222],{"class":628},"6",[118,1224,158],{"class":124},[118,1226,236],{"class":124},[118,1228,239],{"class":131},[118,1230,242],{"class":124},[118,1232,736],{"class":138},[118,1234,402],{"class":124},[118,1236,62],{"class":138},[118,1238,141],{"class":124},[118,1240,550],{"class":124},[118,1242,1243,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264],{"class":120,"line":213},[118,1244,1245],{"class":556},"        c",[118,1247,402],{"class":124},[118,1249,76],{"class":144},[118,1251,728],{"class":124},[118,1253,239],{"class":131},[118,1255,242],{"class":124},[118,1257,736],{"class":138},[118,1259,402],{"class":124},[118,1261,62],{"class":138},[118,1263,141],{"class":124},[118,1265,550],{"class":124},[118,1267,1268,1270,1272,1274,1276,1278,1281,1283,1285,1287,1289,1291],{"class":120,"line":259},[118,1269,784],{"class":556},[118,1271,402],{"class":124},[118,1273,66],{"class":144},[118,1275,148],{"class":124},[118,1277,793],{"class":124},[118,1279,1280],{"class":796},"账单地址",[118,1282,793],{"class":124},[118,1284,158],{"class":124},[118,1286,804],{"class":556},[118,1288,402],{"class":124},[118,1290,823],{"class":144},[118,1292,826],{"class":124},[118,1294,1295,1297,1299,1301,1303,1305,1308,1310],{"class":120,"line":308},[118,1296,784],{"class":556},[118,1298,402],{"class":124},[118,1300,66],{"class":144},[118,1302,148],{"class":124},[118,1304,793],{"class":124},[118,1306,1307],{"class":796},"艾克姆有限公司",[118,1309,793],{"class":124},[118,1311,170],{"class":124},[118,1313,1314,1316,1318,1320,1322,1324,1327,1329],{"class":120,"line":338},[118,1315,784],{"class":556},[118,1317,402],{"class":124},[118,1319,66],{"class":144},[118,1321,148],{"class":124},[118,1323,793],{"class":124},[118,1325,1326],{"class":796},"上海市浦东新区",[118,1328,793],{"class":124},[118,1330,170],{"class":124},[118,1332,1333],{"class":120,"line":376},[118,1334,1335],{"class":124},"        },\n",[118,1337,1338,1341,1343,1346,1348,1350,1352,1355],{"class":120,"line":410},[118,1339,1340],{"class":556},"            template",[118,1342,402],{"class":124},[118,1344,1345],{"class":144},"WithBoxBorder",[118,1347,148],{"class":124},[118,1349,736],{"class":556},[118,1351,402],{"class":124},[118,1353,1354],{"class":144},"Border",[118,1356,571],{"class":124},[118,1358,1359,1362,1364,1367,1369,1371,1373,1376,1378,1381],{"class":120,"line":519},[118,1360,1361],{"class":556},"                template",[118,1363,402],{"class":124},[118,1365,1366],{"class":144},"BorderWidth",[118,1368,148],{"class":124},[118,1370,587],{"class":556},[118,1372,402],{"class":124},[118,1374,1375],{"class":144},"Pt",[118,1377,148],{"class":124},[118,1379,1380],{"class":628},"1",[118,1382,1383],{"class":124},")),\n",[118,1385,1386,1388,1390,1393,1395,1398,1400,1403,1405,1408],{"class":120,"line":529},[118,1387,1361],{"class":556},[118,1389,402],{"class":124},[118,1391,1392],{"class":144},"BorderColor",[118,1394,148],{"class":124},[118,1396,1397],{"class":556},"pdf",[118,1399,402],{"class":124},[118,1401,1402],{"class":144},"RGBHex",[118,1404,148],{"class":124},[118,1406,1407],{"class":628},"0xBDBDBD",[118,1409,1383],{"class":124},[118,1411,1412],{"class":120,"line":534},[118,1413,1414],{"class":124},"            )),\n",[118,1416,1417,1419,1421,1424,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444],{"class":120,"line":539},[118,1418,1340],{"class":556},[118,1420,402],{"class":124},[118,1422,1423],{"class":144},"WithBoxPadding",[118,1425,148],{"class":124},[118,1427,587],{"class":556},[118,1429,402],{"class":124},[118,1431,614],{"class":144},[118,1433,148],{"class":124},[118,1435,587],{"class":556},[118,1437,402],{"class":124},[118,1439,623],{"class":144},[118,1441,148],{"class":124},[118,1443,846],{"class":628},[118,1445,632],{"class":124},[118,1447,1448],{"class":120,"line":553},[118,1449,1450],{"class":124},"        )\n",[118,1452,1453],{"class":120,"line":574},[118,1454,895],{"class":124},[118,1456,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483],{"class":120,"line":598},[118,1458,1213],{"class":556},[118,1460,402],{"class":124},[118,1462,426],{"class":144},[118,1464,148],{"class":124},[118,1466,1222],{"class":628},[118,1468,158],{"class":124},[118,1470,236],{"class":124},[118,1472,239],{"class":131},[118,1474,242],{"class":124},[118,1476,736],{"class":138},[118,1478,402],{"class":124},[118,1480,62],{"class":138},[118,1482,141],{"class":124},[118,1484,550],{"class":124},[118,1486,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507],{"class":120,"line":635},[118,1488,1245],{"class":556},[118,1490,402],{"class":124},[118,1492,76],{"class":144},[118,1494,728],{"class":124},[118,1496,239],{"class":131},[118,1498,242],{"class":124},[118,1500,736],{"class":138},[118,1502,402],{"class":124},[118,1504,62],{"class":138},[118,1506,141],{"class":124},[118,1508,550],{"class":124},[118,1510,1511,1513,1515,1517,1519,1521,1524,1526,1528,1530,1532,1534],{"class":120,"line":641},[118,1512,784],{"class":556},[118,1514,402],{"class":124},[118,1516,66],{"class":144},[118,1518,148],{"class":124},[118,1520,793],{"class":124},[118,1522,1523],{"class":796},"收货地址",[118,1525,793],{"class":124},[118,1527,158],{"class":124},[118,1529,804],{"class":556},[118,1531,402],{"class":124},[118,1533,823],{"class":144},[118,1535,826],{"class":124},[118,1537,1538,1540,1542,1544,1546,1548,1551,1553],{"class":120,"line":660},[118,1539,784],{"class":556},[118,1541,402],{"class":124},[118,1543,66],{"class":144},[118,1545,148],{"class":124},[118,1547,793],{"class":124},[118,1549,1550],{"class":796},"同账单地址",[118,1552,793],{"class":124},[118,1554,170],{"class":124},[118,1556,1557],{"class":120,"line":665},[118,1558,1335],{"class":124},[118,1560,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587],{"class":120,"line":671},[118,1562,1340],{"class":556},[118,1564,402],{"class":124},[118,1566,1423],{"class":144},[118,1568,148],{"class":124},[118,1570,587],{"class":556},[118,1572,402],{"class":124},[118,1574,614],{"class":144},[118,1576,148],{"class":124},[118,1578,587],{"class":556},[118,1580,402],{"class":124},[118,1582,623],{"class":144},[118,1584,148],{"class":124},[118,1586,846],{"class":628},[118,1588,632],{"class":124},[118,1590,1591],{"class":120,"line":677},[118,1592,1450],{"class":124},[118,1594,1595],{"class":120,"line":683},[118,1596,895],{"class":124},[118,1598,1599],{"class":120,"line":689},[118,1600,1601],{"class":124},"})\n",[18,1603,1604,1606,1607,1609,1610,1613,1614,1617,1618,1620],{},[22,1605,76],{}," 接收的 ",[22,1608,434],{}," 内部是",[56,1611,1612],{},"纵向堆叠","。Box 不能水平拆分 — 要水平拆，回到惯用写法 1。但对\"卡片\"模式来说，这就是正确工具。",[22,1615,1616],{},"grid.go:246"," 的 ",[22,1619,1172],{}," 是网格允许的唯一一种嵌套，而且它是有意的一维。",[14,1622,1624],{"id":1623},"惯用写法-3-把子网格直接展平到-12-列","惯用写法 3 — 把子网格直接展平到 12 列",[18,1626,1627,1628,1631,1632,1635],{},"有时你真的想在\"页面左半\"里做 2 列：缩略图 + 说明放左半，正文放右半。直觉是 ",[22,1629,1630],{},"Col(6) > Row > Col(6) + Col(6)","。展平等价就是 ",[22,1633,1634],{},"Col(3) + Col(3) + Col(6)","：",[109,1637,1639],{"className":111,"code":1638,"language":113,"meta":114,"style":114},"page.AutoRow(func(r *template.RowBuilder) {\n    r.Col(3, func(c *template.ColBuilder) {\n        c.Image(thumbBytes)\n    })\n    r.Col(3, func(c *template.ColBuilder) {\n        c.Text(\"Photo by Ansel Adams\", template.Italic())\n        c.Text(\"1942\")\n    })\n    r.Col(6, func(c *template.ColBuilder) {\n        c.Text(\"正文段落占据页面的右半。\")\n    })\n})\n",[22,1640,1641,1665,1696,1711,1715,1745,1773,1792,1796,1826,1845,1849],{"__ignoreMap":114},[118,1642,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663],{"class":120,"line":121},[118,1644,1188],{"class":556},[118,1646,402],{"class":124},[118,1648,89],{"class":144},[118,1650,728],{"class":124},[118,1652,731],{"class":131},[118,1654,242],{"class":124},[118,1656,736],{"class":138},[118,1658,402],{"class":124},[118,1660,741],{"class":138},[118,1662,141],{"class":124},[118,1664,550],{"class":124},[118,1666,1667,1669,1671,1673,1675,1678,1680,1682,1684,1686,1688,1690,1692,1694],{"class":120,"line":173},[118,1668,1213],{"class":556},[118,1670,402],{"class":124},[118,1672,426],{"class":144},[118,1674,148],{"class":124},[118,1676,1677],{"class":628},"3",[118,1679,158],{"class":124},[118,1681,236],{"class":124},[118,1683,239],{"class":131},[118,1685,242],{"class":124},[118,1687,736],{"class":138},[118,1689,402],{"class":124},[118,1691,62],{"class":138},[118,1693,141],{"class":124},[118,1695,550],{"class":124},[118,1697,1698,1700,1702,1704,1706,1709],{"class":120,"line":213},[118,1699,1245],{"class":556},[118,1701,402],{"class":124},[118,1703,70],{"class":144},[118,1705,148],{"class":124},[118,1707,1708],{"class":556},"thumbBytes",[118,1710,170],{"class":124},[118,1712,1713],{"class":120,"line":259},[118,1714,895],{"class":124},[118,1716,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743],{"class":120,"line":308},[118,1718,1213],{"class":556},[118,1720,402],{"class":124},[118,1722,426],{"class":144},[118,1724,148],{"class":124},[118,1726,1677],{"class":628},[118,1728,158],{"class":124},[118,1730,236],{"class":124},[118,1732,239],{"class":131},[118,1734,242],{"class":124},[118,1736,736],{"class":138},[118,1738,402],{"class":124},[118,1740,62],{"class":138},[118,1742,141],{"class":124},[118,1744,550],{"class":124},[118,1746,1747,1749,1751,1753,1755,1757,1760,1762,1764,1766,1768,1771],{"class":120,"line":338},[118,1748,1245],{"class":556},[118,1750,402],{"class":124},[118,1752,66],{"class":144},[118,1754,148],{"class":124},[118,1756,793],{"class":124},[118,1758,1759],{"class":796},"Photo by Ansel Adams",[118,1761,793],{"class":124},[118,1763,158],{"class":124},[118,1765,804],{"class":556},[118,1767,402],{"class":124},[118,1769,1770],{"class":144},"Italic",[118,1772,826],{"class":124},[118,1774,1775,1777,1779,1781,1783,1785,1788,1790],{"class":120,"line":376},[118,1776,1245],{"class":556},[118,1778,402],{"class":124},[118,1780,66],{"class":144},[118,1782,148],{"class":124},[118,1784,793],{"class":124},[118,1786,1787],{"class":796},"1942",[118,1789,793],{"class":124},[118,1791,170],{"class":124},[118,1793,1794],{"class":120,"line":410},[118,1795,895],{"class":124},[118,1797,1798,1800,1802,1804,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824],{"class":120,"line":519},[118,1799,1213],{"class":556},[118,1801,402],{"class":124},[118,1803,426],{"class":144},[118,1805,148],{"class":124},[118,1807,1222],{"class":628},[118,1809,158],{"class":124},[118,1811,236],{"class":124},[118,1813,239],{"class":131},[118,1815,242],{"class":124},[118,1817,736],{"class":138},[118,1819,402],{"class":124},[118,1821,62],{"class":138},[118,1823,141],{"class":124},[118,1825,550],{"class":124},[118,1827,1828,1830,1832,1834,1836,1838,1841,1843],{"class":120,"line":529},[118,1829,1245],{"class":556},[118,1831,402],{"class":124},[118,1833,66],{"class":144},[118,1835,148],{"class":124},[118,1837,793],{"class":124},[118,1839,1840],{"class":796},"正文段落占据页面的右半。",[118,1842,793],{"class":124},[118,1844,170],{"class":124},[118,1846,1847],{"class":120,"line":534},[118,1848,895],{"class":124},[118,1850,1851],{"class":120,"line":539},[118,1852,1601],{"class":124},[18,1854,1855,1858,1859,1861,1862,1865],{},[22,1856,1857],{},"3 + 3"," 加起来等于 ",[22,1860,1222],{},"，缩略图 + 说明刚好占左半。12 能整除 2、3、4、6，所以嵌套网格几乎总能干净展平。如果你的嵌套是 ",[22,1863,1864],{},"Col(8) > Row > Col(7) + Col(5)","，那确实展不平 — 但这些数在真实文档里也没什么意义。选能展平的版本。",[14,1867,1868],{"id":1868},"为什么不让嵌套",[18,1870,1871,1872,1875,1876,1879,1880,1883],{},"扁平网格一次解析宽度。Row 是 (页宽 − 边距) 的百分比，每个 ",[22,1873,1874],{},"Col(span)"," 是它的 ",[22,1877,1878],{},"span / 12","。就这样。没有递归，没有宽中宽中宽，不用把父上下文穿过整个布局引擎。",[22,1881,1882],{},"grid.go"," 里计算列宽的那行字面上只有一行：",[109,1885,1887],{"className":111,"code":1886,"language":113,"meta":114,"style":114},"Width: document.Pct(float64(col.span) / float64(gridColumns) * 100),\n",[22,1888,1889],{"__ignoreMap":114},[118,1890,1891,1894,1897,1899,1901,1904,1906,1909,1911,1914,1916,1918,1920,1923,1926,1928,1931,1933,1935,1938],{"class":120,"line":121},[118,1892,1893],{"class":556},"Width",[118,1895,1896],{"class":124},":",[118,1898,399],{"class":556},[118,1900,402],{"class":124},[118,1902,1903],{"class":144},"Pct",[118,1905,148],{"class":124},[118,1907,1908],{"class":154},"float64",[118,1910,148],{"class":124},[118,1912,1913],{"class":556},"col",[118,1915,402],{"class":124},[118,1917,118],{"class":556},[118,1919,141],{"class":124},[118,1921,1922],{"class":124}," /",[118,1924,1925],{"class":154}," float64",[118,1927,148],{"class":124},[118,1929,1930],{"class":556},"gridColumns",[118,1932,141],{"class":124},[118,1934,242],{"class":124},[118,1936,1937],{"class":628}," 100",[118,1939,595],{"class":124},[18,1941,1942,1943,1946,1947,1946,1950,1953,1954,1956],{},"加上嵌套，这行就变成树遍历。",[22,1944,1945],{},"Col(12)"," 里的 ",[22,1948,1949],{},"Col(8)",[22,1951,1952],{},"Col(6)","，那个 ",[22,1955,1222],{}," 是父列的 50%、Row 的 50%、还是页面的 50%？Bootstrap 选了\"父的 50%\"，然后为了能用，加了断点和槽宽 (gutter)。PDF 没有断点。PDF 也没有流式容器。借嵌套语法等于把三个我们本来不需要解决的问题引进来，换的只是用不上的语法糖。",[14,1958,1960],{"id":1959},"我就是想要语法局部性","\"我就是想要语法局部性\"",[18,1962,1963,1964,1966],{},"合理。展平的副作用是：两个概念上属于一起的 ",[22,1965,89],{},"，改着改着会在源码里漂开。一个小辅助函数就能补上：",[109,1968,1970],{"className":111,"code":1969,"language":113,"meta":114,"style":114},"func card(page *template.PageBuilder, title, body string) {\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(title, template.Bold())\n        })\n    })\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(body)\n        })\n    })\n}\n",[22,1971,1972,2007,2031,2062,2085,2089,2093,2117,2147,2162,2166,2170],{"__ignoreMap":114},[118,1973,1974,1976,1979,1981,1983,1985,1987,1989,1991,1993,1996,1998,2001,2003,2005],{"class":120,"line":121},[118,1975,125],{"class":124},[118,1977,1978],{"class":144}," card",[118,1980,148],{"class":124},[118,1982,1188],{"class":131},[118,1984,242],{"class":124},[118,1986,736],{"class":138},[118,1988,402],{"class":124},[118,1990,93],{"class":138},[118,1992,158],{"class":124},[118,1994,1995],{"class":131}," title",[118,1997,158],{"class":124},[118,1999,2000],{"class":131}," body",[118,2002,155],{"class":154},[118,2004,141],{"class":124},[118,2006,550],{"class":124},[118,2008,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029],{"class":120,"line":173},[118,2010,721],{"class":556},[118,2012,402],{"class":124},[118,2014,89],{"class":144},[118,2016,728],{"class":124},[118,2018,731],{"class":131},[118,2020,242],{"class":124},[118,2022,736],{"class":138},[118,2024,402],{"class":124},[118,2026,741],{"class":138},[118,2028,141],{"class":124},[118,2030,550],{"class":124},[118,2032,2033,2035,2037,2039,2041,2044,2046,2048,2050,2052,2054,2056,2058,2060],{"class":120,"line":213},[118,2034,751],{"class":556},[118,2036,402],{"class":124},[118,2038,426],{"class":144},[118,2040,148],{"class":124},[118,2042,2043],{"class":628},"12",[118,2045,158],{"class":124},[118,2047,236],{"class":124},[118,2049,239],{"class":131},[118,2051,242],{"class":124},[118,2053,736],{"class":138},[118,2055,402],{"class":124},[118,2057,62],{"class":138},[118,2059,141],{"class":124},[118,2061,550],{"class":124},[118,2063,2064,2066,2068,2070,2072,2075,2077,2079,2081,2083],{"class":120,"line":259},[118,2065,784],{"class":556},[118,2067,402],{"class":124},[118,2069,66],{"class":144},[118,2071,148],{"class":124},[118,2073,2074],{"class":556},"title",[118,2076,158],{"class":124},[118,2078,804],{"class":556},[118,2080,402],{"class":124},[118,2082,823],{"class":144},[118,2084,826],{"class":124},[118,2086,2087],{"class":120,"line":308},[118,2088,832],{"class":124},[118,2090,2091],{"class":120,"line":338},[118,2092,895],{"class":124},[118,2094,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115],{"class":120,"line":376},[118,2096,721],{"class":556},[118,2098,402],{"class":124},[118,2100,89],{"class":144},[118,2102,728],{"class":124},[118,2104,731],{"class":131},[118,2106,242],{"class":124},[118,2108,736],{"class":138},[118,2110,402],{"class":124},[118,2112,741],{"class":138},[118,2114,141],{"class":124},[118,2116,550],{"class":124},[118,2118,2119,2121,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145],{"class":120,"line":410},[118,2120,751],{"class":556},[118,2122,402],{"class":124},[118,2124,426],{"class":144},[118,2126,148],{"class":124},[118,2128,2043],{"class":628},[118,2130,158],{"class":124},[118,2132,236],{"class":124},[118,2134,239],{"class":131},[118,2136,242],{"class":124},[118,2138,736],{"class":138},[118,2140,402],{"class":124},[118,2142,62],{"class":138},[118,2144,141],{"class":124},[118,2146,550],{"class":124},[118,2148,2149,2151,2153,2155,2157,2160],{"class":120,"line":519},[118,2150,784],{"class":556},[118,2152,402],{"class":124},[118,2154,66],{"class":144},[118,2156,148],{"class":124},[118,2158,2159],{"class":556},"body",[118,2161,170],{"class":124},[118,2163,2164],{"class":120,"line":529},[118,2165,832],{"class":124},[118,2167,2168],{"class":120,"line":534},[118,2169,895],{"class":124},[118,2171,2172],{"class":120,"line":539},[118,2173,1148],{"class":124},[18,2175,2176,2177,2180],{},"局部性在你的函数里，不在 API 里。gpdf 不内置 ",[22,2178,2179],{},"card","，因为它只有三行，而你自己写的版本一定比我们准备的更贴合你的文档。",[14,2182,2183],{"id":2183},"相关菜谱",[2185,2186,2187,2195,2202],"ul",{},[2188,2189,2190,2194],"li",{},[34,2191,2193],{"href":2192},"/zh/blog/12-column-grid","gpdf 的 12 列网格如何工作？"," — 网格本身的详细说明",[2188,2196,2197,2201],{},[34,2198,2200],{"href":2199},"/zh/blog/invoice-pdf-go-under-50-lines","50 行以内用 Go 生成发票 PDF"," — 用扁平网格组一份完整文档",[2188,2203,2204,2209],{},[34,2205,2208],{"href":2206,"rel":2207},"https://gpdf.dev/docs/guide/layout",[38],"Layout guide"," — Row / Col / Box 的完整参考",[14,2211,2213],{"id":2212},"试用-gpdf","试用 gpdf",[18,2215,2216],{},"gpdf 是一个 Go PDF 生成库。MIT 许可、零外部依赖、原生 CJK 支持。",[109,2218,2222],{"className":2219,"code":2220,"language":2221,"meta":114,"style":114},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[22,2223,2224],{"__ignoreMap":114},[118,2225,2226,2228,2231],{"class":120,"line":121},[118,2227,113],{"class":138},[118,2229,2230],{"class":796}," get",[118,2232,2233],{"class":796}," github.com/gpdf-dev/gpdf\n",[18,2235,2236,2240,2241],{},[34,2237,2239],{"href":36,"rel":2238},[38],"⭐ 在 GitHub 上 Star"," · ",[34,2242,2245],{"href":2243,"rel":2244},"https://gpdf.dev/zh/docs/quickstart",[38],"阅读文档",[2247,2248,2249],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":114,"searchDepth":173,"depth":173,"links":2251},[2252,2253,2254,2255,2256,2258,2259,2260,2261,2262],{"id":16,"depth":173,"text":16},{"id":51,"depth":173,"text":51},{"id":97,"depth":173,"text":98},{"id":442,"depth":173,"text":443},{"id":1168,"depth":173,"text":2257},"惯用写法 2 — 视觉分组用 c.Box",{"id":1623,"depth":173,"text":1624},{"id":1868,"depth":173,"text":1868},{"id":1959,"depth":173,"text":1960},{"id":2183,"depth":173,"text":2183},{"id":2212,"depth":173,"text":2213},"不能。ColBuilder 上没有 Row 方法，gpdf 的 12 列网格刻意保持扁平。这里给出替代嵌套 Row 的三种惯用写法。",false,"md",{"name":2267,"totalTime":2268,"tools":2269,"steps":2271},"用扁平网格惯用写法替代 gpdf 中嵌套 Row-in-Col 布局","PT10M",[2270,505],"Go 1.22+",[2272,2275,2278,2281,2284],{"name":2273,"text":2274},"别再找 c.Row","ColBuilder 没有 Row，也没有 AutoRow。page.AutoRow 和 page.Row 只存在于 PageBuilder。如果编辑器补全里看不到 c.Row，那是 API 在说不，不是少了 import。",{"name":2276,"text":2277},"确认你真正想要的是什么","三类情况几乎覆盖全部。(1) 两行共享列边界 — 你想要子布局。(2) 卡片里的标题和正文 — 你想要视觉分组。(3) 单列中的 2×2 — 你想要子网格。",{"name":2279,"text":2280},"子布局：在页面层叠两个 AutoRow","两个 page.AutoRow 使用相同的 Col 跨度，列宽自然对齐。Row 本来就是独立单元，扁平化不会丢失任何东西。",{"name":2282,"text":2283},"视觉分组：使用 c.Box","c.Box(fn, WithBoxBorder, WithBoxBackground, WithBoxPadding) 把内部纵向堆叠包成带样式容器。它不是子网格 — 只接受 Text / Image / Table — 但八成的嵌套 Row 要的就是这个。",{"name":2285,"text":2286},"子网格：直接用更细的 12 列拆分","与其在 Col(6) 中再嵌 6+6，不如在顶层写 3+3+6。12 能整除 2、3、4、6，绝大多数嵌套模式可以干净地展平。",null,{},"/zh/blog/nest-row-in-col",{"title":5,"description":2263},"zh/blog/025.nest-row-in-col",[2293,2294,2295],"recipe","tutorial","templates","_SLIKhXgfvcsE2ftKAoen4-ro-UPsngk-fPv7u1VuBk",1779199016552]