[{"data":1,"prerenderedAt":2125},["ShallowReactive",2],{"blog-ja-align-column-right-edge":3},{"id":4,"title":5,"author":6,"body":10,"date":2089,"description":2090,"draft":2091,"extension":2092,"howTo":2093,"image":2115,"meta":2116,"navigation":261,"path":2117,"seo":2118,"stem":2119,"tags":2120,"updated":2115,"__hash__":2124},"blogJa/ja/blog/028.align-column-right-edge.md","Col を行の右端に寄せるには?",{"name":7,"url":8,"avatar":9},"Taiki Noda","https://nadai.dev/ja/about","https://nadai.dev/og-default.png",{"type":11,"value":12,"toc":2078},"minimark",[13,17,33,36,64,238,241,244,1292,1295,1298,1309,1429,1484,1490,1497,1513,1517,1520,1611,1619,1639,1643,1646,1789,1807,1810,1813,1982,1985,1999,2002,2038,2042,2045,2062,2074],[14,15,16],"h2",{"id":16},"質問を別の言葉で",[18,19,20,24,25,32],"p",{},[21,22,23],"code",{},"r.Col(4, ...)"," を 1 つだけ書いた行を作って、その列がページの右側に来ることを期待した。実際には左に描画され、幅は 3 分の 1、右側には大きな余白が空いた。あるいは列は右に寄せられたのに、中のテキストは左端に張り付いたまま。",[26,27,31],"a",{"href":28,"rel":29},"https://github.com/gpdf-dev/gpdf",[30],"nofollow","gpdf"," での正しい書き方は?",[14,34,35],{"id":35},"結論",[18,37,38,39,42,43,46,47,50,51,63],{},"gpdf に ",[21,40,41],{},"Offset"," も ",[21,44,45],{},"Push"," も、行レベルの ",[21,48,49],{},"Justify"," もありません。",[52,53,54,55,58,59,62],"strong",{},"列を右に押し出すのは空の埋め草 ",[21,56,57],{},"Col","、中のテキストを右に寄せるのは ",[21,60,61],{},"template.AlignRight()","。"," この 2 つは別物で、ほぼ常に両方要ります。",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","page.AutoRow(func(r *template.RowBuilder) {\n    r.Col(8, func(c *template.ColBuilder) {}) // 埋め草\n    r.Col(4, func(c *template.ColBuilder) {\n        c.Text(\"合計: ¥25,575\", template.AlignRight())\n    })\n})\n","go","",[21,72,73,115,159,191,226,232],{"__ignoreMap":70},[74,75,78,82,86,90,93,97,100,104,106,109,112],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"sTEyZ","page",[74,83,85],{"class":84},"sMK4o",".",[74,87,89],{"class":88},"s2Zo4","AutoRow",[74,91,92],{"class":84},"(func(",[74,94,96],{"class":95},"sHdIc","r",[74,98,99],{"class":84}," *",[74,101,103],{"class":102},"sBMFI","template",[74,105,85],{"class":84},[74,107,108],{"class":102},"RowBuilder",[74,110,111],{"class":84},")",[74,113,114],{"class":84}," {\n",[74,116,118,121,123,125,128,132,135,138,141,143,145,147,150,152,155],{"class":76,"line":117},2,[74,119,120],{"class":80},"    r",[74,122,85],{"class":84},[74,124,57],{"class":88},[74,126,127],{"class":84},"(",[74,129,131],{"class":130},"sbssI","8",[74,133,134],{"class":84},",",[74,136,137],{"class":84}," func(",[74,139,140],{"class":95},"c",[74,142,99],{"class":84},[74,144,103],{"class":102},[74,146,85],{"class":84},[74,148,149],{"class":102},"ColBuilder",[74,151,111],{"class":84},[74,153,154],{"class":84}," {})",[74,156,158],{"class":157},"sHwdD"," // 埋め草\n",[74,160,162,164,166,168,170,173,175,177,179,181,183,185,187,189],{"class":76,"line":161},3,[74,163,120],{"class":80},[74,165,85],{"class":84},[74,167,57],{"class":88},[74,169,127],{"class":84},[74,171,172],{"class":130},"4",[74,174,134],{"class":84},[74,176,137],{"class":84},[74,178,140],{"class":95},[74,180,99],{"class":84},[74,182,103],{"class":102},[74,184,85],{"class":84},[74,186,149],{"class":102},[74,188,111],{"class":84},[74,190,114],{"class":84},[74,192,194,197,199,202,204,207,211,213,215,218,220,223],{"class":76,"line":193},4,[74,195,196],{"class":80},"        c",[74,198,85],{"class":84},[74,200,201],{"class":88},"Text",[74,203,127],{"class":84},[74,205,206],{"class":84},"\"",[74,208,210],{"class":209},"sfazB","合計: ¥25,575",[74,212,206],{"class":84},[74,214,134],{"class":84},[74,216,217],{"class":80}," template",[74,219,85],{"class":84},[74,221,222],{"class":88},"AlignRight",[74,224,225],{"class":84},"())\n",[74,227,229],{"class":76,"line":228},5,[74,230,231],{"class":84},"    })\n",[74,233,235],{"class":76,"line":234},6,[74,236,237],{"class":84},"})\n",[14,239,240],{"id":240},"コード",[18,242,243],{},"完全なプログラム。多くの人がこの疑問に行き着く、請求書ヘッダーの形です。",[65,245,247],{"className":67,"code":246,"language":69,"meta":70,"style":70},"package main\n\nimport (\n    \"log\"\n    \"os\"\n\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 := template.New(\n        template.WithPageSize(document.A4),\n        template.WithMargins(document.UniformEdges(document.Mm(20))),\n    )\n\n    page := doc.AddPage()\n\n    // 左ブロックと右ブロックを 1 行に: 8 + 4 = 12。\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(8, func(c *template.ColBuilder) {\n            c.Text(\"株式会社アクメ\", template.Bold(), template.FontSize(16))\n            c.Text(\"東京都渋谷区渋谷 1-2-3\", template.TextColor(pdf.Gray(0.4)))\n        })\n        r.Col(4, func(c *template.ColBuilder) {\n            c.Text(\"請求書 No.1042\", template.AlignRight(), template.Bold())\n            c.Text(\"発行日 2026-09-02\", template.AlignRight(),\n                template.TextColor(pdf.Gray(0.4)))\n        })\n    })\n\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Spacer(document.Mm(10))\n        })\n    })\n\n    // 合計ブロック: 8 スパンの空白のあと、4 スパンをマージンに密着させる。\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(8, func(c *template.ColBuilder) {})\n        r.Col(4, func(c *template.ColBuilder) {\n            c.Text(\"小計:      ¥23,250\", template.AlignRight())\n            c.Text(\"消費税 10%:  ¥2,325\", template.AlignRight())\n            c.Spacer(document.Mm(2))\n            c.Line(template.LineThickness(document.Pt(1)))\n            c.Spacer(document.Mm(2))\n            c.Text(\"合計:      ¥25,575\", template.AlignRight(),\n                template.Bold(), template.FontSize(14))\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"right_aligned.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n",[21,248,249,257,263,272,283,292,296,306,316,326,332,337,351,370,394,430,436,441,460,465,471,497,529,575,620,626,657,693,722,746,751,756,761,786,818,843,848,853,858,864,889,921,952,980,1008,1032,1067,1090,1118,1142,1147,1152,1157,1179,1195,1213,1219,1266,1281,1286],{"__ignoreMap":70},[74,250,251,254],{"class":76,"line":77},[74,252,253],{"class":84},"package",[74,255,256],{"class":102}," main\n",[74,258,259],{"class":76,"line":117},[74,260,262],{"emptyLinePlaceholder":261},true,"\n",[74,264,265,269],{"class":76,"line":161},[74,266,268],{"class":267},"s7zQu","import",[74,270,271],{"class":84}," (\n",[74,273,274,277,280],{"class":76,"line":193},[74,275,276],{"class":84},"    \"",[74,278,279],{"class":102},"log",[74,281,282],{"class":84},"\"\n",[74,284,285,287,290],{"class":76,"line":228},[74,286,276],{"class":84},[74,288,289],{"class":102},"os",[74,291,282],{"class":84},[74,293,294],{"class":76,"line":234},[74,295,262],{"emptyLinePlaceholder":261},[74,297,299,301,304],{"class":76,"line":298},7,[74,300,276],{"class":84},[74,302,303],{"class":102},"github.com/gpdf-dev/gpdf/document",[74,305,282],{"class":84},[74,307,309,311,314],{"class":76,"line":308},8,[74,310,276],{"class":84},[74,312,313],{"class":102},"github.com/gpdf-dev/gpdf/pdf",[74,315,282],{"class":84},[74,317,319,321,324],{"class":76,"line":318},9,[74,320,276],{"class":84},[74,322,323],{"class":102},"github.com/gpdf-dev/gpdf/template",[74,325,282],{"class":84},[74,327,329],{"class":76,"line":328},10,[74,330,331],{"class":84},")\n",[74,333,335],{"class":76,"line":334},11,[74,336,262],{"emptyLinePlaceholder":261},[74,338,340,343,346,349],{"class":76,"line":339},12,[74,341,342],{"class":84},"func",[74,344,345],{"class":88}," main",[74,347,348],{"class":84},"()",[74,350,114],{"class":84},[74,352,354,357,360,362,364,367],{"class":76,"line":353},13,[74,355,356],{"class":80},"    doc ",[74,358,359],{"class":84},":=",[74,361,217],{"class":80},[74,363,85],{"class":84},[74,365,366],{"class":88},"New",[74,368,369],{"class":84},"(\n",[74,371,373,376,378,381,383,386,388,391],{"class":76,"line":372},14,[74,374,375],{"class":80},"        template",[74,377,85],{"class":84},[74,379,380],{"class":88},"WithPageSize",[74,382,127],{"class":84},[74,384,385],{"class":80},"document",[74,387,85],{"class":84},[74,389,390],{"class":80},"A4",[74,392,393],{"class":84},"),\n",[74,395,397,399,401,404,406,408,410,413,415,417,419,422,424,427],{"class":76,"line":396},15,[74,398,375],{"class":80},[74,400,85],{"class":84},[74,402,403],{"class":88},"WithMargins",[74,405,127],{"class":84},[74,407,385],{"class":80},[74,409,85],{"class":84},[74,411,412],{"class":88},"UniformEdges",[74,414,127],{"class":84},[74,416,385],{"class":80},[74,418,85],{"class":84},[74,420,421],{"class":88},"Mm",[74,423,127],{"class":84},[74,425,426],{"class":130},"20",[74,428,429],{"class":84},"))),\n",[74,431,433],{"class":76,"line":432},16,[74,434,435],{"class":84},"    )\n",[74,437,439],{"class":76,"line":438},17,[74,440,262],{"emptyLinePlaceholder":261},[74,442,444,447,449,452,454,457],{"class":76,"line":443},18,[74,445,446],{"class":80},"    page ",[74,448,359],{"class":84},[74,450,451],{"class":80}," doc",[74,453,85],{"class":84},[74,455,456],{"class":88},"AddPage",[74,458,459],{"class":84},"()\n",[74,461,463],{"class":76,"line":462},19,[74,464,262],{"emptyLinePlaceholder":261},[74,466,468],{"class":76,"line":467},20,[74,469,470],{"class":157},"    // 左ブロックと右ブロックを 1 行に: 8 + 4 = 12。\n",[74,472,474,477,479,481,483,485,487,489,491,493,495],{"class":76,"line":473},21,[74,475,476],{"class":80},"    page",[74,478,85],{"class":84},[74,480,89],{"class":88},[74,482,92],{"class":84},[74,484,96],{"class":95},[74,486,99],{"class":84},[74,488,103],{"class":102},[74,490,85],{"class":84},[74,492,108],{"class":102},[74,494,111],{"class":84},[74,496,114],{"class":84},[74,498,500,503,505,507,509,511,513,515,517,519,521,523,525,527],{"class":76,"line":499},22,[74,501,502],{"class":80},"        r",[74,504,85],{"class":84},[74,506,57],{"class":88},[74,508,127],{"class":84},[74,510,131],{"class":130},[74,512,134],{"class":84},[74,514,137],{"class":84},[74,516,140],{"class":95},[74,518,99],{"class":84},[74,520,103],{"class":102},[74,522,85],{"class":84},[74,524,149],{"class":102},[74,526,111],{"class":84},[74,528,114],{"class":84},[74,530,532,535,537,539,541,543,546,548,550,552,554,557,560,562,564,567,569,572],{"class":76,"line":531},23,[74,533,534],{"class":80},"            c",[74,536,85],{"class":84},[74,538,201],{"class":88},[74,540,127],{"class":84},[74,542,206],{"class":84},[74,544,545],{"class":209},"株式会社アクメ",[74,547,206],{"class":84},[74,549,134],{"class":84},[74,551,217],{"class":80},[74,553,85],{"class":84},[74,555,556],{"class":88},"Bold",[74,558,559],{"class":84},"(),",[74,561,217],{"class":80},[74,563,85],{"class":84},[74,565,566],{"class":88},"FontSize",[74,568,127],{"class":84},[74,570,571],{"class":130},"16",[74,573,574],{"class":84},"))\n",[74,576,578,580,582,584,586,588,591,593,595,597,599,602,604,607,609,612,614,617],{"class":76,"line":577},24,[74,579,534],{"class":80},[74,581,85],{"class":84},[74,583,201],{"class":88},[74,585,127],{"class":84},[74,587,206],{"class":84},[74,589,590],{"class":209},"東京都渋谷区渋谷 1-2-3",[74,592,206],{"class":84},[74,594,134],{"class":84},[74,596,217],{"class":80},[74,598,85],{"class":84},[74,600,601],{"class":88},"TextColor",[74,603,127],{"class":84},[74,605,606],{"class":80},"pdf",[74,608,85],{"class":84},[74,610,611],{"class":88},"Gray",[74,613,127],{"class":84},[74,615,616],{"class":130},"0.4",[74,618,619],{"class":84},")))\n",[74,621,623],{"class":76,"line":622},25,[74,624,625],{"class":84},"        })\n",[74,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655],{"class":76,"line":628},26,[74,630,502],{"class":80},[74,632,85],{"class":84},[74,634,57],{"class":88},[74,636,127],{"class":84},[74,638,172],{"class":130},[74,640,134],{"class":84},[74,642,137],{"class":84},[74,644,140],{"class":95},[74,646,99],{"class":84},[74,648,103],{"class":102},[74,650,85],{"class":84},[74,652,149],{"class":102},[74,654,111],{"class":84},[74,656,114],{"class":84},[74,658,660,662,664,666,668,670,673,675,677,679,681,683,685,687,689,691],{"class":76,"line":659},27,[74,661,534],{"class":80},[74,663,85],{"class":84},[74,665,201],{"class":88},[74,667,127],{"class":84},[74,669,206],{"class":84},[74,671,672],{"class":209},"請求書 No.1042",[74,674,206],{"class":84},[74,676,134],{"class":84},[74,678,217],{"class":80},[74,680,85],{"class":84},[74,682,222],{"class":88},[74,684,559],{"class":84},[74,686,217],{"class":80},[74,688,85],{"class":84},[74,690,556],{"class":88},[74,692,225],{"class":84},[74,694,696,698,700,702,704,706,709,711,713,715,717,719],{"class":76,"line":695},28,[74,697,534],{"class":80},[74,699,85],{"class":84},[74,701,201],{"class":88},[74,703,127],{"class":84},[74,705,206],{"class":84},[74,707,708],{"class":209},"発行日 2026-09-02",[74,710,206],{"class":84},[74,712,134],{"class":84},[74,714,217],{"class":80},[74,716,85],{"class":84},[74,718,222],{"class":88},[74,720,721],{"class":84},"(),\n",[74,723,725,728,730,732,734,736,738,740,742,744],{"class":76,"line":724},29,[74,726,727],{"class":80},"                template",[74,729,85],{"class":84},[74,731,601],{"class":88},[74,733,127],{"class":84},[74,735,606],{"class":80},[74,737,85],{"class":84},[74,739,611],{"class":88},[74,741,127],{"class":84},[74,743,616],{"class":130},[74,745,619],{"class":84},[74,747,749],{"class":76,"line":748},30,[74,750,625],{"class":84},[74,752,754],{"class":76,"line":753},31,[74,755,231],{"class":84},[74,757,759],{"class":76,"line":758},32,[74,760,262],{"emptyLinePlaceholder":261},[74,762,764,766,768,770,772,774,776,778,780,782,784],{"class":76,"line":763},33,[74,765,476],{"class":80},[74,767,85],{"class":84},[74,769,89],{"class":88},[74,771,92],{"class":84},[74,773,96],{"class":95},[74,775,99],{"class":84},[74,777,103],{"class":102},[74,779,85],{"class":84},[74,781,108],{"class":102},[74,783,111],{"class":84},[74,785,114],{"class":84},[74,787,789,791,793,795,797,800,802,804,806,808,810,812,814,816],{"class":76,"line":788},34,[74,790,502],{"class":80},[74,792,85],{"class":84},[74,794,57],{"class":88},[74,796,127],{"class":84},[74,798,799],{"class":130},"12",[74,801,134],{"class":84},[74,803,137],{"class":84},[74,805,140],{"class":95},[74,807,99],{"class":84},[74,809,103],{"class":102},[74,811,85],{"class":84},[74,813,149],{"class":102},[74,815,111],{"class":84},[74,817,114],{"class":84},[74,819,821,823,825,828,830,832,834,836,838,841],{"class":76,"line":820},35,[74,822,534],{"class":80},[74,824,85],{"class":84},[74,826,827],{"class":88},"Spacer",[74,829,127],{"class":84},[74,831,385],{"class":80},[74,833,85],{"class":84},[74,835,421],{"class":88},[74,837,127],{"class":84},[74,839,840],{"class":130},"10",[74,842,574],{"class":84},[74,844,846],{"class":76,"line":845},36,[74,847,625],{"class":84},[74,849,851],{"class":76,"line":850},37,[74,852,231],{"class":84},[74,854,856],{"class":76,"line":855},38,[74,857,262],{"emptyLinePlaceholder":261},[74,859,861],{"class":76,"line":860},39,[74,862,863],{"class":157},"    // 合計ブロック: 8 スパンの空白のあと、4 スパンをマージンに密着させる。\n",[74,865,867,869,871,873,875,877,879,881,883,885,887],{"class":76,"line":866},40,[74,868,476],{"class":80},[74,870,85],{"class":84},[74,872,89],{"class":88},[74,874,92],{"class":84},[74,876,96],{"class":95},[74,878,99],{"class":84},[74,880,103],{"class":102},[74,882,85],{"class":84},[74,884,108],{"class":102},[74,886,111],{"class":84},[74,888,114],{"class":84},[74,890,892,894,896,898,900,902,904,906,908,910,912,914,916,918],{"class":76,"line":891},41,[74,893,502],{"class":80},[74,895,85],{"class":84},[74,897,57],{"class":88},[74,899,127],{"class":84},[74,901,131],{"class":130},[74,903,134],{"class":84},[74,905,137],{"class":84},[74,907,140],{"class":95},[74,909,99],{"class":84},[74,911,103],{"class":102},[74,913,85],{"class":84},[74,915,149],{"class":102},[74,917,111],{"class":84},[74,919,920],{"class":84}," {})\n",[74,922,924,926,928,930,932,934,936,938,940,942,944,946,948,950],{"class":76,"line":923},42,[74,925,502],{"class":80},[74,927,85],{"class":84},[74,929,57],{"class":88},[74,931,127],{"class":84},[74,933,172],{"class":130},[74,935,134],{"class":84},[74,937,137],{"class":84},[74,939,140],{"class":95},[74,941,99],{"class":84},[74,943,103],{"class":102},[74,945,85],{"class":84},[74,947,149],{"class":102},[74,949,111],{"class":84},[74,951,114],{"class":84},[74,953,955,957,959,961,963,965,968,970,972,974,976,978],{"class":76,"line":954},43,[74,956,534],{"class":80},[74,958,85],{"class":84},[74,960,201],{"class":88},[74,962,127],{"class":84},[74,964,206],{"class":84},[74,966,967],{"class":209},"小計:      ¥23,250",[74,969,206],{"class":84},[74,971,134],{"class":84},[74,973,217],{"class":80},[74,975,85],{"class":84},[74,977,222],{"class":88},[74,979,225],{"class":84},[74,981,983,985,987,989,991,993,996,998,1000,1002,1004,1006],{"class":76,"line":982},44,[74,984,534],{"class":80},[74,986,85],{"class":84},[74,988,201],{"class":88},[74,990,127],{"class":84},[74,992,206],{"class":84},[74,994,995],{"class":209},"消費税 10%:  ¥2,325",[74,997,206],{"class":84},[74,999,134],{"class":84},[74,1001,217],{"class":80},[74,1003,85],{"class":84},[74,1005,222],{"class":88},[74,1007,225],{"class":84},[74,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1030],{"class":76,"line":1010},45,[74,1012,534],{"class":80},[74,1014,85],{"class":84},[74,1016,827],{"class":88},[74,1018,127],{"class":84},[74,1020,385],{"class":80},[74,1022,85],{"class":84},[74,1024,421],{"class":88},[74,1026,127],{"class":84},[74,1028,1029],{"class":130},"2",[74,1031,574],{"class":84},[74,1033,1035,1037,1039,1042,1044,1046,1048,1051,1053,1055,1057,1060,1062,1065],{"class":76,"line":1034},46,[74,1036,534],{"class":80},[74,1038,85],{"class":84},[74,1040,1041],{"class":88},"Line",[74,1043,127],{"class":84},[74,1045,103],{"class":80},[74,1047,85],{"class":84},[74,1049,1050],{"class":88},"LineThickness",[74,1052,127],{"class":84},[74,1054,385],{"class":80},[74,1056,85],{"class":84},[74,1058,1059],{"class":88},"Pt",[74,1061,127],{"class":84},[74,1063,1064],{"class":130},"1",[74,1066,619],{"class":84},[74,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088],{"class":76,"line":1069},47,[74,1071,534],{"class":80},[74,1073,85],{"class":84},[74,1075,827],{"class":88},[74,1077,127],{"class":84},[74,1079,385],{"class":80},[74,1081,85],{"class":84},[74,1083,421],{"class":88},[74,1085,127],{"class":84},[74,1087,1029],{"class":130},[74,1089,574],{"class":84},[74,1091,1093,1095,1097,1099,1101,1103,1106,1108,1110,1112,1114,1116],{"class":76,"line":1092},48,[74,1094,534],{"class":80},[74,1096,85],{"class":84},[74,1098,201],{"class":88},[74,1100,127],{"class":84},[74,1102,206],{"class":84},[74,1104,1105],{"class":209},"合計:      ¥25,575",[74,1107,206],{"class":84},[74,1109,134],{"class":84},[74,1111,217],{"class":80},[74,1113,85],{"class":84},[74,1115,222],{"class":88},[74,1117,721],{"class":84},[74,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1140],{"class":76,"line":1120},49,[74,1122,727],{"class":80},[74,1124,85],{"class":84},[74,1126,556],{"class":88},[74,1128,559],{"class":84},[74,1130,217],{"class":80},[74,1132,85],{"class":84},[74,1134,566],{"class":88},[74,1136,127],{"class":84},[74,1138,1139],{"class":130},"14",[74,1141,574],{"class":84},[74,1143,1145],{"class":76,"line":1144},50,[74,1146,625],{"class":84},[74,1148,1150],{"class":76,"line":1149},51,[74,1151,231],{"class":84},[74,1153,1155],{"class":76,"line":1154},52,[74,1156,262],{"emptyLinePlaceholder":261},[74,1158,1160,1163,1165,1168,1170,1172,1174,1177],{"class":76,"line":1159},53,[74,1161,1162],{"class":80},"    data",[74,1164,134],{"class":84},[74,1166,1167],{"class":80}," err ",[74,1169,359],{"class":84},[74,1171,451],{"class":80},[74,1173,85],{"class":84},[74,1175,1176],{"class":88},"Generate",[74,1178,459],{"class":84},[74,1180,1182,1185,1187,1190,1193],{"class":76,"line":1181},54,[74,1183,1184],{"class":267},"    if",[74,1186,1167],{"class":80},[74,1188,1189],{"class":84},"!=",[74,1191,1192],{"class":84}," nil",[74,1194,114],{"class":84},[74,1196,1198,1201,1203,1206,1208,1211],{"class":76,"line":1197},55,[74,1199,1200],{"class":80},"        log",[74,1202,85],{"class":84},[74,1204,1205],{"class":88},"Fatal",[74,1207,127],{"class":84},[74,1209,1210],{"class":80},"err",[74,1212,331],{"class":84},[74,1214,1216],{"class":76,"line":1215},56,[74,1217,1218],{"class":84},"    }\n",[74,1220,1222,1224,1226,1228,1231,1233,1236,1238,1240,1243,1245,1247,1250,1252,1255,1258,1260,1262,1264],{"class":76,"line":1221},57,[74,1223,1184],{"class":267},[74,1225,1167],{"class":80},[74,1227,359],{"class":84},[74,1229,1230],{"class":80}," os",[74,1232,85],{"class":84},[74,1234,1235],{"class":88},"WriteFile",[74,1237,127],{"class":84},[74,1239,206],{"class":84},[74,1241,1242],{"class":209},"right_aligned.pdf",[74,1244,206],{"class":84},[74,1246,134],{"class":84},[74,1248,1249],{"class":80}," data",[74,1251,134],{"class":84},[74,1253,1254],{"class":130}," 0o644",[74,1256,1257],{"class":84},");",[74,1259,1167],{"class":80},[74,1261,1189],{"class":84},[74,1263,1192],{"class":84},[74,1265,114],{"class":84},[74,1267,1269,1271,1273,1275,1277,1279],{"class":76,"line":1268},58,[74,1270,1200],{"class":80},[74,1272,85],{"class":84},[74,1274,1205],{"class":88},[74,1276,127],{"class":84},[74,1278,1210],{"class":80},[74,1280,331],{"class":84},[74,1282,1284],{"class":76,"line":1283},59,[74,1285,1218],{"class":84},[74,1287,1289],{"class":76,"line":1288},60,[74,1290,1291],{"class":84},"}\n",[14,1293,1294],{"id":1294},"なぜ埋め草の列が要るのか",[18,1296,1297],{},"ここは丸暗記より理解しておく価値があります。gpdf のレイアウトで引っかかる他のいくつかの挙動も、同時に説明が付くからです。",[18,1299,1300,1301,1304,1305,1308],{},"行は水平方向のボックスです。",[21,1302,1303],{},"RowBuilder.build"," は ",[21,1306,1307],{},"r.cols"," を順に走査して列ごとに子ボックスを 1 つ生成しますが、その子に設定するスタイルは幅だけです。",[65,1310,1312],{"className":67,"code":1311,"language":69,"meta":70,"style":70},"colBox := &document.Box{\n    Content: cb.buildNodes(),\n    BoxStyle: document.BoxStyle{\n        Width: document.Pct(float64(col.span) / float64(gridColumns) * 100),\n    },\n}\n",[21,1313,1314,1334,1352,1369,1420,1425],{"__ignoreMap":70},[74,1315,1316,1319,1321,1324,1326,1328,1331],{"class":76,"line":77},[74,1317,1318],{"class":80},"colBox ",[74,1320,359],{"class":84},[74,1322,1323],{"class":84}," &",[74,1325,385],{"class":102},[74,1327,85],{"class":84},[74,1329,1330],{"class":102},"Box",[74,1332,1333],{"class":84},"{\n",[74,1335,1336,1339,1342,1345,1347,1350],{"class":76,"line":117},[74,1337,1338],{"class":80},"    Content",[74,1340,1341],{"class":84},":",[74,1343,1344],{"class":80}," cb",[74,1346,85],{"class":84},[74,1348,1349],{"class":88},"buildNodes",[74,1351,721],{"class":84},[74,1353,1354,1357,1359,1362,1364,1367],{"class":76,"line":161},[74,1355,1356],{"class":80},"    BoxStyle",[74,1358,1341],{"class":84},[74,1360,1361],{"class":102}," document",[74,1363,85],{"class":84},[74,1365,1366],{"class":102},"BoxStyle",[74,1368,1333],{"class":84},[74,1370,1371,1374,1376,1378,1380,1383,1385,1389,1391,1394,1396,1398,1400,1403,1406,1408,1411,1413,1415,1418],{"class":76,"line":193},[74,1372,1373],{"class":80},"        Width",[74,1375,1341],{"class":84},[74,1377,1361],{"class":80},[74,1379,85],{"class":84},[74,1381,1382],{"class":88},"Pct",[74,1384,127],{"class":84},[74,1386,1388],{"class":1387},"spNyl","float64",[74,1390,127],{"class":84},[74,1392,1393],{"class":80},"col",[74,1395,85],{"class":84},[74,1397,74],{"class":80},[74,1399,111],{"class":84},[74,1401,1402],{"class":84}," /",[74,1404,1405],{"class":1387}," float64",[74,1407,127],{"class":84},[74,1409,1410],{"class":80},"gridColumns",[74,1412,111],{"class":84},[74,1414,99],{"class":84},[74,1416,1417],{"class":130}," 100",[74,1419,393],{"class":84},[74,1421,1422],{"class":76,"line":228},[74,1423,1424],{"class":84},"    },\n",[74,1426,1427],{"class":76,"line":234},[74,1428,1291],{"class":84},[18,1430,1431,1433,1434,1437,1438,1441,1442,1445,1446,1449,1450,1449,1453,1449,1456,1449,1459,1449,1462,1449,1465,1449,1468,1449,1471,1449,1474,1449,1477,1449,1480,1483],{},[21,1432,1410],{}," は 12。つまり ",[21,1435,1436],{},"Col(4)"," は「行の幅の 33.33% のボックス」以上でも以下でもありません。行は子を左から右へ並べ、子が尽きたところで止まります。余白という概念を持っていないのは、",[21,1439,1440],{},"document.BoxStyle"," に ",[21,1443,1444],{},"JustifyContent"," フィールドが存在しないからです。リポジトリ全体を grep しても出てきません。あるのは ",[21,1447,1448],{},"Width"," / ",[21,1451,1452],{},"Height",[21,1454,1455],{},"MinWidth",[21,1457,1458],{},"MaxWidth",[21,1460,1461],{},"MinHeight",[21,1463,1464],{},"MaxHeight",[21,1466,1467],{},"Margin",[21,1469,1470],{},"Padding",[21,1472,1473],{},"Border",[21,1475,1476],{},"Background",[21,1478,1479],{},"Direction",[21,1481,1482],{},"Position"," だけ。これが語彙の全部です。",[18,1485,1486,1487,1489],{},"だから ",[21,1488,1436],{}," を単独で置くと、幅 33.33% のボックスが 1 つだけ入った行になり、それが水平フローの先頭に置かれます。残りの 66.67% は「列の右にある空きスペース」ではなく、そもそも何も無い。押し返す相手がいないのです。",[18,1491,1492,1493,1496],{},"埋め草の ",[21,1494,1495],{},"Col(8)"," は、その空間を占める何かをレイアウトエンジンに与えます。木構造に空のボックスが 1 つ増えるだけで、描画結果には何も出ません。",[18,1498,1499,1500,1502,1503,1506,1507,1506,1510,1512],{},"ついでに言えば ",[21,1501,1495],{}," に特別な意味はありません。",[21,1504,1505],{},"Col(6)"," + ",[21,1508,1509],{},"Col(3)",[21,1511,1509],{}," でも最後のブロックは同じように右端に来るし、後から埋め草側にコンテンツを足しても構造を組み直す必要はありません。",[14,1514,1516],{"id":1515},"罠-列は右テキストは左","罠: 列は右、テキストは左",[18,1518,1519],{},"一番時間を溶かすミスがこれです。",[65,1521,1523],{"className":67,"code":1522,"language":69,"meta":70,"style":70},"r.Col(8, func(c *template.ColBuilder) {})\nr.Col(4, func(c *template.ColBuilder) {\n    c.Text(\"合計: ¥25,575\") // ← AlignRight が無い\n})\n",[21,1524,1525,1555,1585,1607],{"__ignoreMap":70},[74,1526,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553],{"class":76,"line":77},[74,1528,96],{"class":80},[74,1530,85],{"class":84},[74,1532,57],{"class":88},[74,1534,127],{"class":84},[74,1536,131],{"class":130},[74,1538,134],{"class":84},[74,1540,137],{"class":84},[74,1542,140],{"class":95},[74,1544,99],{"class":84},[74,1546,103],{"class":102},[74,1548,85],{"class":84},[74,1550,149],{"class":102},[74,1552,111],{"class":84},[74,1554,920],{"class":84},[74,1556,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583],{"class":76,"line":117},[74,1558,96],{"class":80},[74,1560,85],{"class":84},[74,1562,57],{"class":88},[74,1564,127],{"class":84},[74,1566,172],{"class":130},[74,1568,134],{"class":84},[74,1570,137],{"class":84},[74,1572,140],{"class":95},[74,1574,99],{"class":84},[74,1576,103],{"class":102},[74,1578,85],{"class":84},[74,1580,149],{"class":102},[74,1582,111],{"class":84},[74,1584,114],{"class":84},[74,1586,1587,1590,1592,1594,1596,1598,1600,1602,1604],{"class":76,"line":161},[74,1588,1589],{"class":80},"    c",[74,1591,85],{"class":84},[74,1593,201],{"class":88},[74,1595,127],{"class":84},[74,1597,206],{"class":84},[74,1599,210],{"class":209},[74,1601,206],{"class":84},[74,1603,111],{"class":84},[74,1605,1606],{"class":157}," // ← AlignRight が無い\n",[74,1608,1609],{"class":76,"line":193},[74,1610,237],{"class":84},[18,1612,1613,1614,1618],{},"列は狙った場所にあります。テキストはそうではない。列の左境界、つまりページの 66.67% の位置から始まるので、",[1615,1616,1617],"em",{},"なんとなく"," 右寄せに見えてしまう。金額の桁が全部同じうちは気付かず、3 桁の数字と 5 桁の数字が並んだところで初めて小数点が揃っていないことに気付く、という順番になりがちです。",[18,1620,1621,1304,1623,1626,1627,1630,1631,1634,1635,1638],{},[21,1622,61],{},[21,1624,1625],{},"TextOption"," (",[21,1628,1629],{},"TextAlign"," を設定する ",[21,1632,1633],{},"func(*document.Style)",") なので、個々の ",[21,1636,1637],{},"c.Text"," 呼び出しに付けます。列単位でまとめて設定する手段はありません。ブロック内の全行に書いてください。",[14,1640,1642],{"id":1641},"tableimageページ番号","Table・Image・ページ番号",[18,1644,1645],{},"テキストオプションは他の要素の内部には届きません。要素ごとに専用の入口があります。",[65,1647,1649],{"className":67,"code":1648,"language":69,"meta":70,"style":70},"// Table: ヘッダーのスライスと位置対応する列ごとの配置。\nc.Table(header, rows, template.ColumnAlign(\n    document.AlignLeft, document.AlignRight, document.AlignRight,\n))\n\n// Image: 属する列の中での配置。\nc.Image(logoBytes, template.WithAlign(document.AlignRight))\n\n// ページ番号は TextOption を取るので AlignRight がそのまま効く。\nc.PageNumber(template.AlignRight())\n",[21,1650,1651,1656,1686,1715,1719,1723,1728,1761,1765,1770],{"__ignoreMap":70},[74,1652,1653],{"class":76,"line":77},[74,1654,1655],{"class":157},"// Table: ヘッダーのスライスと位置対応する列ごとの配置。\n",[74,1657,1658,1660,1662,1665,1667,1670,1672,1675,1677,1679,1681,1684],{"class":76,"line":117},[74,1659,140],{"class":80},[74,1661,85],{"class":84},[74,1663,1664],{"class":88},"Table",[74,1666,127],{"class":84},[74,1668,1669],{"class":80},"header",[74,1671,134],{"class":84},[74,1673,1674],{"class":80}," rows",[74,1676,134],{"class":84},[74,1678,217],{"class":80},[74,1680,85],{"class":84},[74,1682,1683],{"class":88},"ColumnAlign",[74,1685,369],{"class":84},[74,1687,1688,1691,1693,1696,1698,1700,1702,1704,1706,1708,1710,1712],{"class":76,"line":161},[74,1689,1690],{"class":80},"    document",[74,1692,85],{"class":84},[74,1694,1695],{"class":80},"AlignLeft",[74,1697,134],{"class":84},[74,1699,1361],{"class":80},[74,1701,85],{"class":84},[74,1703,222],{"class":80},[74,1705,134],{"class":84},[74,1707,1361],{"class":80},[74,1709,85],{"class":84},[74,1711,222],{"class":80},[74,1713,1714],{"class":84},",\n",[74,1716,1717],{"class":76,"line":193},[74,1718,574],{"class":84},[74,1720,1721],{"class":76,"line":228},[74,1722,262],{"emptyLinePlaceholder":261},[74,1724,1725],{"class":76,"line":234},[74,1726,1727],{"class":157},"// Image: 属する列の中での配置。\n",[74,1729,1730,1732,1734,1737,1739,1742,1744,1746,1748,1751,1753,1755,1757,1759],{"class":76,"line":298},[74,1731,140],{"class":80},[74,1733,85],{"class":84},[74,1735,1736],{"class":88},"Image",[74,1738,127],{"class":84},[74,1740,1741],{"class":80},"logoBytes",[74,1743,134],{"class":84},[74,1745,217],{"class":80},[74,1747,85],{"class":84},[74,1749,1750],{"class":88},"WithAlign",[74,1752,127],{"class":84},[74,1754,385],{"class":80},[74,1756,85],{"class":84},[74,1758,222],{"class":80},[74,1760,574],{"class":84},[74,1762,1763],{"class":76,"line":308},[74,1764,262],{"emptyLinePlaceholder":261},[74,1766,1767],{"class":76,"line":318},[74,1768,1769],{"class":157},"// ページ番号は TextOption を取るので AlignRight がそのまま効く。\n",[74,1771,1772,1774,1776,1779,1781,1783,1785,1787],{"class":76,"line":328},[74,1773,140],{"class":80},[74,1775,85],{"class":84},[74,1777,1778],{"class":88},"PageNumber",[74,1780,127],{"class":84},[74,1782,103],{"class":80},[74,1784,85],{"class":84},[74,1786,222],{"class":88},[74,1788,225],{"class":84},[18,1790,1791,1793,1794,1796,1797,1800,1801,1796,1803,1806],{},[21,1792,1683],{}," が取るのは ",[21,1795,1625],{}," ではなく ",[21,1798,1799],{},"document.TextAlign"," の値です。",[21,1802,61],{},[21,1804,1805],{},"document.AlignRight","。混同しやすいですが、コンパイラがすぐ教えてくれます。",[14,1808,1809],{"id":1809},"行では解決できないとき",[18,1811,1812],{},"ページの他の要素と無関係に座標へ固定したいもの — 領収印、斜めの透かし、隅のマーク — はグリッドから出ます。",[65,1814,1816],{"className":67,"code":1815,"language":69,"meta":70,"style":70},"page.Absolute(document.Mm(140), document.Mm(60),\n    func(c *template.ColBuilder) {\n        c.Text(\"領収済\", template.AlignRight(), template.Bold(),\n            template.FontSize(28), template.TextColor(pdf.RGBHex(0xC62828)))\n    },\n    template.AbsoluteWidth(document.Mm(50)),\n)\n",[21,1817,1818,1856,1875,1910,1948,1952,1978],{"__ignoreMap":70},[74,1819,1820,1822,1824,1827,1829,1831,1833,1835,1837,1840,1843,1845,1847,1849,1851,1854],{"class":76,"line":77},[74,1821,81],{"class":80},[74,1823,85],{"class":84},[74,1825,1826],{"class":88},"Absolute",[74,1828,127],{"class":84},[74,1830,385],{"class":80},[74,1832,85],{"class":84},[74,1834,421],{"class":88},[74,1836,127],{"class":84},[74,1838,1839],{"class":130},"140",[74,1841,1842],{"class":84},"),",[74,1844,1361],{"class":80},[74,1846,85],{"class":84},[74,1848,421],{"class":88},[74,1850,127],{"class":84},[74,1852,1853],{"class":130},"60",[74,1855,393],{"class":84},[74,1857,1858,1861,1863,1865,1867,1869,1871,1873],{"class":76,"line":117},[74,1859,1860],{"class":84},"    func(",[74,1862,140],{"class":95},[74,1864,99],{"class":84},[74,1866,103],{"class":102},[74,1868,85],{"class":84},[74,1870,149],{"class":102},[74,1872,111],{"class":84},[74,1874,114],{"class":84},[74,1876,1877,1879,1881,1883,1885,1887,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908],{"class":76,"line":161},[74,1878,196],{"class":80},[74,1880,85],{"class":84},[74,1882,201],{"class":88},[74,1884,127],{"class":84},[74,1886,206],{"class":84},[74,1888,1889],{"class":209},"領収済",[74,1891,206],{"class":84},[74,1893,134],{"class":84},[74,1895,217],{"class":80},[74,1897,85],{"class":84},[74,1899,222],{"class":88},[74,1901,559],{"class":84},[74,1903,217],{"class":80},[74,1905,85],{"class":84},[74,1907,556],{"class":88},[74,1909,721],{"class":84},[74,1911,1912,1915,1917,1919,1921,1924,1926,1928,1930,1932,1934,1936,1938,1941,1943,1946],{"class":76,"line":193},[74,1913,1914],{"class":80},"            template",[74,1916,85],{"class":84},[74,1918,566],{"class":88},[74,1920,127],{"class":84},[74,1922,1923],{"class":130},"28",[74,1925,1842],{"class":84},[74,1927,217],{"class":80},[74,1929,85],{"class":84},[74,1931,601],{"class":88},[74,1933,127],{"class":84},[74,1935,606],{"class":80},[74,1937,85],{"class":84},[74,1939,1940],{"class":88},"RGBHex",[74,1942,127],{"class":84},[74,1944,1945],{"class":130},"0xC62828",[74,1947,619],{"class":84},[74,1949,1950],{"class":76,"line":228},[74,1951,1424],{"class":84},[74,1953,1954,1957,1959,1962,1964,1966,1968,1970,1972,1975],{"class":76,"line":234},[74,1955,1956],{"class":80},"    template",[74,1958,85],{"class":84},[74,1960,1961],{"class":88},"AbsoluteWidth",[74,1963,127],{"class":84},[74,1965,385],{"class":80},[74,1967,85],{"class":84},[74,1969,421],{"class":88},[74,1971,127],{"class":84},[74,1973,1974],{"class":130},"50",[74,1976,1977],{"class":84},")),\n",[74,1979,1980],{"class":76,"line":298},[74,1981,331],{"class":84},[18,1983,1984],{},"これは非常口であって定石ではありません。普通のコンテンツのために x 座標を計算し始めていたら、答えは埋め草の列のほうです。",[18,1986,1987,1988,1990,1991,1994,1995,1998],{},"最後にもう 1 つ。",[21,1989,57],{}," は個々のスパンを 1〜12 にクランプしますが、",[1615,1992,1993],{},"合計"," は誰もチェックしません。1 行に ",[21,1996,1997],{},"Col(5)"," を 3 つ書けば幅の合計は 125% になり、3 列目は折り返さずに右マージンをはみ出します。gpdf は警告を出しません。スパンは自分で数えてください。",[14,2000,2001],{"id":2001},"関連レシピ",[2003,2004,2005,2013,2020,2031],"ul",{},[2006,2007,2008,2012],"li",{},[26,2009,2011],{"href":2010},"/ja/blog/12-column-grid","12 カラムグリッドはどう動くのか?"," — グリッドの全体像",[2006,2014,2015,2019],{},[26,2016,2018],{"href":2017},"/ja/blog/nest-row-in-col","Col の中に Row をネストするには?"," — フラットグリッドのもう 1 つの疑問",[2006,2021,2022,2026,2027,2030],{},[26,2023,2025],{"href":2024},"/ja/blog/table-column-widths","テーブルの列幅を指定するには?"," — ",[21,2028,2029],{},"c.Table"," の中の幅と配置",[2006,2032,2033,2037],{},[26,2034,2036],{"href":2035},"/ja/blog/invoice-pdf-go-under-50-lines","Go で 50 行以内に請求書 PDF を作る"," — このパターンを文書全体で使う例",[14,2039,2041],{"id":2040},"gpdf-を使ってみる","gpdf を使ってみる",[18,2043,2044],{},"gpdf は Go の PDF 生成ライブラリ。MIT、ゼロ依存、CJK 対応。",[65,2046,2050],{"className":2047,"code":2048,"language":2049,"meta":70,"style":70},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[21,2051,2052],{"__ignoreMap":70},[74,2053,2054,2056,2059],{"class":76,"line":77},[74,2055,69],{"class":102},[74,2057,2058],{"class":209}," get",[74,2060,2061],{"class":209}," github.com/gpdf-dev/gpdf\n",[18,2063,2064,2068,2069],{},[26,2065,2067],{"href":28,"rel":2066},[30],"⭐ Star on GitHub"," · ",[26,2070,2073],{"href":2071,"rel":2072},"https://gpdf.dev/ja/docs/quickstart",[30],"ドキュメントを読む",[2075,2076,2077],"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 .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}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":70,"searchDepth":117,"depth":117,"links":2079},[2080,2081,2082,2083,2084,2085,2086,2087,2088],{"id":16,"depth":117,"text":16},{"id":35,"depth":117,"text":35},{"id":240,"depth":117,"text":240},{"id":1294,"depth":117,"text":1294},{"id":1515,"depth":117,"text":1516},{"id":1641,"depth":117,"text":1642},{"id":1809,"depth":117,"text":1809},{"id":2001,"depth":117,"text":2001},{"id":2040,"depth":117,"text":2041},"2026-09-02","空の Col で押し出して列を右端に置き、中のテキストは template.AlignRight() で右揃えにする。この 2 つは別物で、大抵は両方必要です。",false,"md",{"name":2094,"totalTime":2095,"tools":2096,"steps":2099},"gpdf で Col を行の右端に配置する","PT10M",[2097,2098],"Go 1.22+","github.com/gpdf-dev/gpdf",[2100,2103,2106,2109,2112],{"name":2101,"text":2102},"どちらの「右」かを切り分ける","列のボックス自体を行の右端に置くことと、その列の中のテキストを右揃えにすることは別問題で、解決策も別です。ほとんどのレイアウトでは両方必要になります。",{"name":2104,"text":2105},"スパン合計が 12 になるよう空の Col を足す","右に置きたい列の手前に、空のクロージャを渡した r.Col を書きます。r.Col(8, func(c *template.ColBuilder) {}) の次に r.Col(4, ...) を書けば、4 スパンの列が右マージンにぴったり付きます。",{"name":2107,"text":2108},"テキストオプションに AlignRight を渡す","その列の中の c.Text すべてに template.AlignRight() を付けます。付け忘れると、右にある列の左端にテキストが並ぶことになり、これがこの場面で最も多いミスです。",{"name":2110,"text":2111},"Table と Image は専用オプションを使う","テキスト用の配置オプションは Table や Image の内部までは効きません。テーブルには template.ColumnAlign(document.AlignRight)、画像には template.WithAlign(document.AlignRight) を使います。",{"name":2113,"text":2114},"行で解決できないときだけ page.Absolute を使う","page.Absolute(x, y, fn, template.AbsoluteWidth(w)) はグリッド外の固定座標に配置します。スタンプや透かし向けで、通常の右寄せコンテンツには使いません。",null,{},"/ja/blog/align-column-right-edge",{"title":5,"description":2090},"ja/blog/028.align-column-right-edge",[2121,2122,2123],"recipe","tutorial","templates","8lOT-r9gwSodYTwveuEQP2fCZfM85fMPu3GXKJ2RlA0",1788360648389]