{"route":"/en-US-v0.13.1/guides/table-guide/","title":"Table guide","description":"Not sure how to change table strokes? Need to rotate a table? This guide\nexplains all you need to know about tables in Typst.\n","part":null,"outline":[{"id":"basic-tables","name":"Basic Tables","children":[]},{"id":"column-sizes","name":"Column Sizes","children":[]},{"id":"captions-and-references","name":"Captions And References","children":[]},{"id":"fills","name":"Fills","children":[{"id":"fill-override","name":"Fill Override","children":[]}]},{"id":"strokes","name":"Strokes","children":[{"id":"individual-lines","name":"Individual Lines","children":[]},{"id":"stroke-override","name":"Stroke Override","children":[]},{"id":"stroke-functions","name":"Stroke Functions","children":[]},{"id":"double-stroke","name":"Double Stroke","children":[]}]},{"id":"alignment","name":"Alignment","children":[]},{"id":"merge-cells","name":"Merge Cells","children":[]},{"id":"rotate-table","name":"Rotate Table","children":[]},{"id":"table-across-pages","name":"Table Across Pages","children":[]},{"id":"importing-data","name":"Importing Data","children":[]},{"id":"table-and-grid","name":"Table And Grid","children":[]}],"body":{"kind":"html","content":"<h1>Table guide</h1>\n<p>Tables are a great way to present data to your readers in an easily readable,\ncompact, and organized manner. They are not only used for numerical values, but\nalso survey responses, task planning, schedules, and more. Because of this wide\nset of possible applications, there is no single best way to lay out a table.\nInstead, think about the data you want to highlight, your document's overarching\ndesign, and ultimately how your table can best serve your readers.</p>\n<p>Typst can help you with your tables by automating styling, importing data from\nother applications, and more! This guide takes you through a few of the most\ncommon questions you may have when adding a table to your document with Typst.\nFeel free to skip to the section most relevant to you – we designed this guide\nto be read out of order.</p>\n<p>If you want to look up a detail of how tables work, you should also <a href=\"/en-US-v0.13.1/reference/model/table/\">check out\ntheir reference page</a>. And if you are looking for a table of contents\nrather than a normal table, the reference page of the <a href=\"/en-US-v0.13.1/reference/model/outline/\"><code>outline</code>\nfunction</a> is the right place to learn more.</p>\n<h2 id=\"basic-tables\">How to create a basic table?</h2>\n<p>In order to create a table in Typst, use the <a href=\"/en-US-v0.13.1/reference/model/table/\"><code>table</code> function</a>. For a\nbasic table, you need to tell the table function two things:</p>\n<ul>\n<li>The number of columns</li>\n<li>The content for each of the table cells</li>\n</ul>\n<p>So, let's say you want to create a table with two columns describing the\ningredients for a cookie recipe:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Amount*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Ingredient*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>360g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Baking flour<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>250g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Butter (room temp.)<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>150g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Brown sugar<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>100g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Cane sugar<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>100g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>70% cocoa chocolate<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>100g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>35-40% cocoa chocolate<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Eggs<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Pinch<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Salt<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Drizzle<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Vanilla extract<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/eb2c89e60a7f28cd1d8543b6bbb717f.png\" alt=\"Preview\"></div></div>\n<p>This example shows how to call, configure, and populate a table. Both the column\ncount and cell contents are passed to the table as arguments. The <a href=\"/en-US-v0.13.1/reference/foundations/function/\">argument\nlist</a> is surrounded by round parentheses. In it, we first pass the\ncolumn count as a named argument. Then, we pass multiple <a href=\"/en-US-v0.13.1/reference/foundations/content/\">content\nblocks</a> as positional arguments. Each content block contains the\ncontents for a single cell.</p>\n<p>To make the example more legible, we have placed two content block arguments on\neach line, mimicking how they would appear in the table. You could also write\neach cell on its own line. Typst does not care on which line you place the\narguments. Instead, Typst will place the content cells from left to right (or\nright to left, if that is the writing direction of your language) and then from\ntop to bottom. It will automatically add enough rows to your table so that it\nfits all of your content.</p>\n<p>It is best to wrap the header row of your table in the <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-header\"><code>table.header</code>\nfunction</a>. This clarifies your intent and will also allow future\nversions of Typst to make the output more accessible to users with a screen\nreader:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Amount*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Ingredient*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>360g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Baking flour<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n <span class=\"typ-comment\">// ... the remaining cells</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/6a2549ec6593b2ca3640ff2800e0aaae.png\" alt=\"Preview\"></div></div>\n<p>You could also write a show rule that automatically <a href=\"/en-US-v0.13.1/reference/model/strong/\">strongly\nemphasizes</a> the contents of the first cells for all tables. This\nquickly becomes useful if your document contains multiple tables!</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-func\">strong</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Amount<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Ingredient<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>360g<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Baking flour<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n <span class=\"typ-comment\">// ... the remaining cells</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/53b0b10f01dd5386e8591829e777375e.png\" alt=\"Preview\"></div></div>\n<p>We are using a show rule with a selector for cell coordinates here instead of\napplying our styles directly to <code>table.header</code>. This is due to a current\nlimitation of Typst that will be fixed in a future release.</p>\n<p>Congratulations, you have created your first table! Now you can proceed to\n<a href=\"#column-sizes\">change column sizes</a>, <a href=\"#strokes\">adjust the strokes</a>, <a href=\"#fills\">add\nstriped rows</a>, and more!</p>\n<h2 id=\"column-sizes\">How to change the column sizes?</h2>\n<p>If you create a table and specify the number of columns, Typst will make each\ncolumn large enough to fit its largest cell. Often, you want something\ndifferent, for example, to make a table span the whole width of the page. You\ncan provide a list, specifying how wide you want each column to be, through the\n<code>columns</code> argument. There are a few different ways to specify column widths:</p>\n<ul>\n<li>First, there is <code><span class=\"typ-key\">auto</span></code>. This is the default behavior and tells Typst to grow\nthe column to fit its contents. If there is not enough space, Typst will try\nits best to distribute the space among the <code><span class=\"typ-key\">auto</span></code>-sized columns.</li>\n<li><a href=\"/en-US-v0.13.1/reference/layout/length/\">Lengths</a> like <code><span class=\"typ-num\">6cm</span></code>, <code><span class=\"typ-num\">0.7in</span></code>, or <code><span class=\"typ-num\">120pt</span></code>. As usual, you can\nalso use the font-dependent <code>em</code> unit. This is a multiple of your current font\nsize. It's useful if you want to size your table so that it always fits\nabout the same amount of text, independent of font size.</li>\n<li>A <a href=\"/en-US-v0.13.1/reference/layout/ratio/\">ratio in percent</a> such as <code><span class=\"typ-num\">40%</span></code>. This will make the column take\nup 40% of the total horizontal space available to the table, so either the\ninner width of the page or the table's container. You can also mix ratios and\nlengths into <a href=\"/en-US-v0.13.1/reference/layout/relative/\">relative lengths</a>. Be mindful that even if you\nspecify a list of column widths that sum up to 100%, your table could still\nbecome larger than its container. This is because there can be\n<a href=\"/en-US-v0.13.1/reference/model/table/#parameters-gutter\">gutter</a> between columns that is not included in the column\nwidths. If you want to make a table fill the page, the next option is often\nvery useful.</li>\n<li>A <a href=\"/en-US-v0.13.1/reference/layout/fraction/\">fractional part of the free space</a> using the <code>fr</code> unit, such as\n<code>1fr</code>. This unit allows you to distribute the available space to columns. It\nworks as follows: First, Typst sums up the lengths of all columns that do not\nuse <code>fr</code>s. Then, it determines how much horizontal space is left. This\nhorizontal space then gets distributed to all columns denominated in <code>fr</code>s.\nDuring this process, a <code>2fr</code> column will become twice as wide as a <code>1fr</code>\ncolumn. This is where the name comes from: The width of the column is its\nfraction of the total fractionally sized columns.</li>\n</ul>\n<p>Let's put this to use with a table that contains the dates, numbers, and\ndescriptions of some routine checks. The first two columns are <code>auto</code>-sized and\nthe last column is <code>1fr</code> wide as to fill the whole page.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Date<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>°No<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Description<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>24/01/03<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>813<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Filtered participant pool<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>24/01/03<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>477<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Transitioned to sec. regimen<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>24/01/11<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>051<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Cycled treatment substrate<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/d94fea7bcf57bf2a4b0037a5f20f35be.png\" alt=\"Preview\"></div></div>\n<p>Here, we have passed our list of column lengths as an <a href=\"/en-US-v0.13.1/reference/foundations/array/\" title=\"array\">array</a>, enclosed in round\nparentheses, with its elements separated by commas. The first two columns are\nautomatically sized, so that they take on the size of their content and the\nthird column is sized as <code><span class=\"typ-num\">1fr</span></code> so that it fills up the remainder of the space\non the page. If you wanted to instead change the second column to be a bit more\nspacious, you could replace its entry in the <code>columns</code> array with a value like\n<code><span class=\"typ-num\">6em</span></code>.</p>\n<h2 id=\"captions-and-references\">How to caption and reference my table?</h2>\n<p>A table is just as valuable as the information your readers draw from it. You\ncan enhance the effectiveness of both your prose and your table by making a\nclear connection between the two with a cross-reference. Typst can help you with\nautomatic <a href=\"/en-US-v0.13.1/reference/model/ref/\">references</a> and the <a href=\"/en-US-v0.13.1/reference/model/figure/\"><code>figure</code> function</a>.</p>\n<p>Just like with images, wrapping a table in the <code>figure</code> function allows you to\nadd a caption and a label, so you can reference the figure elsewhere. Wrapping\nyour table in a figure also lets you use the figure's <code>placement</code> parameter to\nfloat it to the top or bottom of a page.</p>\n<p>Let's take a look at a captioned table and how to reference it in prose:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">figure</span><span class=\"typ-punct\">(</span>\n  <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n    columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">,</span>\n    stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Test Item<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Specification<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Test Result<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Compliance<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Voltage<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>220V ± 5%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>218V<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Pass<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Current<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>5A ± 0.5A<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>4.2A<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Fail<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  caption<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">[</span>Probe results for design A<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span> <span class=\"typ-label\">&lt;probe-a&gt;</span>\n\nThe results from <span class=\"typ-ref\">@probe-a</span> show that the design is not yet optimal.\nWe will show how its performance can be improved in this section.\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/abcc3d737c5a8aa9100fd01bd4f01ee8.png\" alt=\"Preview\"></div></div>\n<p>The example shows how to wrap a table in a figure, set a caption and a label,\nand how to reference that label. We start by using the <code>figure</code> function. It\nexpects the contents of the figure as a positional argument. We just put the\ntable function call in its argument list, omitting the <code>#</code> character because it\nis only needed when calling a function in markup mode. We also add the caption\nas a named argument (above or below) the table.</p>\n<p>After the figure call, we put a label in angle brackets (<code><span class=\"typ-label\">&lt;probe-a&gt;</span></code>). This\ntells Typst to remember this element and make it referenceable under this name\nthroughout your document. We can then reference it in prose by using the at sign\nand the label name <code><span class=\"typ-ref\">@probe-a</span></code>. Typst will print a nicely formatted reference\nand automatically update the label if the table's number changes.</p>\n<h2 id=\"fills\">How to get a striped table?</h2>\n<p>Many tables use striped rows or columns instead of strokes to differentiate\nbetween rows and columns. This effect is often called <em>zebra stripes.</em> Tables\nwith zebra stripes are popular in Business and commercial Data Analytics\napplications, while academic applications tend to use strokes instead.</p>\n<p>To add zebra stripes to a table, we use the <code>table</code> function's <code>fill</code> argument.\nIt can take three kinds of arguments:</p>\n<ul>\n<li>A single color (this can also be a gradient or a tiling) to fill all cells\nwith. Because we want some cells to have another color, this is not useful if\nwe want to build zebra tables.</li>\n<li>An array with colors which Typst cycles through for each column. We can use an\narray with two elements to get striped columns.</li>\n<li>A function that takes the horizontal coordinate <code>x</code> and the vertical\ncoordinate <code>y</code> of a cell and returns its fill. We can use this to create\nhorizontal stripes or <a href=\"/en-US-v0.13.1/reference/layout/grid/#definitions-cell\">checkerboard patterns</a>.</li>\n</ul>\n<p>Let's start with an example of a horizontally striped table:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>font<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;IBM Plex Sans&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-comment\">// Medium bold table header.</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;medium&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-comment\">// Bold titles.</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-comment\">// See the strokes section for details on this!</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> <span class=\"typ-func\">frame</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n  left<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> stroke <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  right<span class=\"typ-punct\">:</span> stroke<span class=\"typ-punct\">,</span>\n  top<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">&lt;</span> <span class=\"typ-num\">2</span> <span class=\"typ-punct\">{</span> stroke <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  bottom<span class=\"typ-punct\">:</span> stroke<span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n\n<span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;EAF2F5&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-func\">frame</span><span class=\"typ-punct\">(</span><span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;21222C&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">0.4fr</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Month<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Title<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Author<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Genre<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>January<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>The Great Gatsby<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>F. Scott Fitzgerald<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Classic<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>February<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>To Kill a Mockingbird<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Harper Lee<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Drama<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>March<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>1984<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>George Orwell<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Dystopian<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>April<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>The Catcher in the Rye<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>J.D. Salinger<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Coming-of-Age<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/509a179138d5d2bea0adfda9da818930.png\" alt=\"Preview\"></div></div>\n<p>This example shows a book club reading list. The line <code>fill: <span class=\"typ-punct\">(</span><span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;EAF2F5&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span></code> in <code>table</code>'s set rule is all that is needed to add striped columns. It\ntells Typst to alternate between coloring columns with a light blue (in the\n<a href=\"/en-US-v0.13.1/reference/visualize/color/#definitions-rgb\"><code>rgb</code></a> function call) and nothing (<code><span class=\"typ-key\">none</span></code>). Note that we\nextracted all of our styling from the <code>table</code> function call itself into set and\nshow rules, so that we can automatically reuse it for multiple tables.</p>\n<p>Because setting the stripes itself is easy we also added some other styles to\nmake it look nice. The other code in the example provides a dark blue\n<a href=\"#stroke-functions\">stroke</a> around the table and below the first line and\nemboldens the first row and the column with the book title. See the\n<a href=\"#strokes\">strokes</a> section for details on how we achieved this stroke\nconfiguration.</p>\n<p>Let's next take a look at how we can change only the set rule to achieve\nhorizontal stripes instead:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">odd</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">)</span> <span class=\"typ-punct\">{</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;EAF2F5&quot;</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-func\">frame</span><span class=\"typ-punct\">(</span><span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;21222C&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/db99425919500e03700ba3ffb2ce6bb2.png\" alt=\"Preview\"></div></div>\n<p>We just need to replace the set rule from the previous example with this one and\nget horizontal stripes instead. Here, we are passing a function to <code>fill</code>. It\ndiscards the horizontal coordinate with an underscore and then checks if the\nvertical coordinate <code>y</code> of the cell is odd. If so, the cell gets a light blue\nfill, otherwise, no fill is returned.</p>\n<p>Of course, you can make this function arbitrarily complex. For example, if you\nwant to stripe the rows with a light and darker shade of blue, you could do\nsomething like this:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;EAF2F5&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;DDEAEF&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span><span class=\"typ-func\">at</span><span class=\"typ-punct\">(</span>calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">rem</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">,</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-func\">frame</span><span class=\"typ-punct\">(</span><span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;21222C&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/702beb05f67c6598f2f1a6ed084fdc9a.png\" alt=\"Preview\"></div></div>\n<p>This example shows an alternative approach to write our fill function. The\nfunction uses an array with three colors and then cycles between its values for\neach row by indexing the array with the remainder of <code>y</code> divided by 3.</p>\n<p>Finally, here is a bonus example that uses the <em>stroke</em> to achieve striped rows:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n    y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n    left<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-key\">if</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">even</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">)</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">1pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n    right<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">even</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">)</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">1pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/183fdb57dff39e2760799d2fe7321750.png\" alt=\"Preview\"></div></div>\n<h3 id=\"fill-override\">Manually overriding a cell's fill color</h3>\n<p>Sometimes, the fill of a cell needs not to vary based on its position in the\ntable, but rather based on its contents. We can use the <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-cell\"><code>table.cell</code>\nelement</a> in the <code>table</code>'s parameter list to wrap a cell's content\nand override its fill.</p>\n<p>For example, here is a list of all German presidents, with the cell borders\ncolored in the color of their party.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>font<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;Roboto&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> <span class=\"typ-func\">cdu</span><span class=\"typ-punct\">(</span>name<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=</span> <span class=\"typ-punct\">(</span><span class=\"typ-punct\">[</span>CDU<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>fill<span class=\"typ-punct\">:</span> black<span class=\"typ-punct\">,</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>fill<span class=\"typ-punct\">:</span> white<span class=\"typ-punct\">,</span> name<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> <span class=\"typ-func\">spd</span><span class=\"typ-punct\">(</span>name<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=</span> <span class=\"typ-punct\">(</span><span class=\"typ-punct\">[</span>SPD<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>fill<span class=\"typ-punct\">:</span> red<span class=\"typ-punct\">,</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>fill<span class=\"typ-punct\">:</span> white<span class=\"typ-punct\">,</span> name<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> <span class=\"typ-func\">fdp</span><span class=\"typ-punct\">(</span>name<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=</span> <span class=\"typ-punct\">(</span><span class=\"typ-punct\">[</span>FDP<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>fill<span class=\"typ-punct\">:</span> yellow<span class=\"typ-punct\">,</span> name<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Tenure<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Party<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>President<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1949-1959<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">fdp</span><span class=\"typ-punct\">[</span>Theodor Heuss<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1959-1969<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">cdu</span><span class=\"typ-punct\">[</span>Heinrich Lübke<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1969-1974<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">spd</span><span class=\"typ-punct\">[</span>Gustav Heinemann<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1974-1979<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">fdp</span><span class=\"typ-punct\">[</span>Walter Scheel<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1979-1984<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">cdu</span><span class=\"typ-punct\">[</span>Karl Carstens<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1984-1994<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">cdu</span><span class=\"typ-punct\">[</span>Richard von Weizsäcker<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1994-1999<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">cdu</span><span class=\"typ-punct\">[</span>Roman Herzog<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1999-2004<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">spd</span><span class=\"typ-punct\">[</span>Johannes Rau<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2004-2010<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">cdu</span><span class=\"typ-punct\">[</span>Horst Köhler<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2010-2012<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span><span class=\"typ-func\">cdu</span><span class=\"typ-punct\">[</span>Christian Wulff<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2012-2017<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>n/a<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Joachim Gauck<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2017-<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>     <span class=\"typ-op\">..</span><span class=\"typ-func\">spd</span><span class=\"typ-punct\">[</span>Frank-Walter-Steinmeier<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/29ce6849357d9086f3c12776ef9384c1.png\" alt=\"Preview\"></div></div>\n<p>In this example, we make use of variables because there only have been a total\nof three parties whose members have become president (and one unaffiliated\npresident). Their colors will repeat multiple times, so we store a function that\nproduces an array with their party's name and a table cell with that party's\ncolor and the president's name (<code>cdu</code>, <code>spd</code>, and <code>fdp</code>). We then use these\nfunctions in the <code>table</code> argument list instead of directly adding the name. We\nuse the <a href=\"/en-US-v0.13.1/reference/foundations/arguments/#spreading\">spread operator</a> <code>..</code> to turn the items of the\narrays into single cells. We could also write something like\n<code><span class=\"typ-punct\">[</span>FDP<span class=\"typ-punct\">]</span>, table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>fill<span class=\"typ-punct\">:</span> yellow<span class=\"typ-punct\">)</span><span class=\"typ-punct\">[</span>Theodor Heuss<span class=\"typ-punct\">]</span></code> for each cell directly in the\n<code>table</code>'s argument list, but that becomes unreadable, especially for the parties\nwhose colors are dark so that they require white text. We also delete vertical\nstrokes and set the font to Roboto.</p>\n<p>The party column and the cell color in this example communicate redundant\ninformation on purpose: Communicating important data using color only is a bad\naccessibility practice. It disadvantages users with vision impairment and is in\nviolation of universal access standards, such as the\n<a href=\"https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html\">WCAG 2.1 Success Criterion 1.4.1</a>.\nTo improve this table, we added a column printing the party name. Alternatively,\nyou could have made sure to choose a color-blindness friendly palette and mark\nup your cells with an additional label that screen readers can read out loud.\nThe latter feature is not currently supported by Typst, but will be added in a\nfuture release. You can check how colors look for color-blind readers with\n<a href=\"https://chromewebstore.google.com/detail/colorblindly/floniaahmccleoclneebhhmnjgdfijgg\">this Chrome extension</a>,\n<a href=\"https://helpx.adobe.com/photoshop/using/proofing-colors.html\">Photoshop</a>, or\n<a href=\"https://docs.gimp.org/2.10/en/gimp-display-filter-dialog.html\">GIMP</a>.</p>\n<h2 id=\"strokes\">How to adjust the lines in a table?</h2>\n<p>By default, Typst adds strokes between each row and column of a table. You can\nadjust these strokes in a variety of ways. Which one is the most practical,\ndepends on the modification you want to make and your intent:</p>\n<ul>\n<li>Do you want to style all tables in your document, irrespective of their size\nand content? Use the <code>table</code> function's <a href=\"/en-US-v0.13.1/reference/model/table/#parameters-stroke\">stroke</a> argument in a\nset rule.</li>\n<li>Do you want to customize all lines in a single table? Use the <code>table</code>\nfunction's <a href=\"/en-US-v0.13.1/reference/model/table/#parameters-stroke\">stroke</a> argument when calling the table function.</li>\n<li>Do you want to change, add, or remove the stroke around a single cell? Use the\n<code>table.cell</code> element in the argument list of your table call.</li>\n<li>Do you want to change, add, or remove a single horizontal or vertical stroke\nin a single table? Use the <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-hline\" title=\"`table.hline`\"><code>table.hline</code></a> and <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-vline\" title=\"`table.vline`\"><code>table.vline</code></a> elements in the\nargument list of your table call.</li>\n</ul>\n<p>We will go over all of these options with examples next! First, we will tackle\nthe <code>table</code> function's <a href=\"/en-US-v0.13.1/reference/model/table/#parameters-stroke\">stroke</a> argument. Here, you can adjust\nboth how the table's lines get drawn and configure which lines are drawn at all.</p>\n<p>Let's start by modifying the color and thickness of the stroke:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.5pt</span> <span class=\"typ-op\">+</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;666675&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Monday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>11.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>13.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>4.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Tuesday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>8.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>14.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>5.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Wednesday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>9.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>18.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>13.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/cb4b867fd697f9a5065aa08a3301c427.png\" alt=\"Preview\"></div></div>\n<p>This makes the table lines a bit less wide and uses a bluish gray. You can see\nthat we added a width in point to a color to achieve our customized stroke. This\naddition yields a value of the <a href=\"/en-US-v0.13.1/reference/visualize/stroke/\">stroke type</a>. Alternatively, you can\nuse the dictionary representation for strokes which allows you to access\nadvanced features such as dashed lines.</p>\n<p>The previous example showed how to use the stroke argument in the table\nfunction's invocation. Alternatively, you can specify the stroke argument in the\n<code>table</code>'s set rule. This will have exactly the same effect on all subsequent\n<code>table</code> calls as if the stroke argument was specified in the argument list. This\nis useful if you are writing a template or want to style your whole document.</p>\n<pre><code><span class=\"typ-comment\">// Renders the exact same as the last example</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.5pt</span> <span class=\"typ-op\">+</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;666675&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Monday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>11.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>13.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>4.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Tuesday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>8.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>14.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>5.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Wednesday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>9.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>18.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>13.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre>\n<p>For small tables, you sometimes want to suppress all strokes because they add\ntoo much visual noise. To do this, just set the stroke argument to <code><span class=\"typ-key\">none</span></code>:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Monday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>11.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>13.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>4.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Tuesday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>8.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>14.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>5.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Wednesday*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>9.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>18.5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>13.0<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/bd098e0eea59924e8c6c8de70728e4ab.png\" alt=\"Preview\"></div></div>\n<p>If you want more fine-grained control of where lines get placed in your table,\nyou can also pass a dictionary with the keys <code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code>\n(controlling the respective cell sides), <code>x</code>, <code>y</code> (controlling vertical and\nhorizontal strokes), and <code>rest</code> (covers all strokes not styled by other\ndictionary entries). All keys are optional; omitted keys will be treated as if\ntheir value was the default value. For example, to get a table with only\nhorizontal lines, you can do this:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  align<span class=\"typ-punct\">:</span> horizon<span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>☒<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Close cabin door<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>☐<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Start engines<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>☐<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Radio tower<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>☐<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Push back<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/79bd887d2884813c5c0480bbf51e9bf9.png\" alt=\"Preview\"></div></div>\n<p>This turns off all vertical strokes and leaves the horizontal strokes in place.\nTo achieve the reverse effect (only horizontal strokes), set the stroke argument\nto <code><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span></code> instead.</p>\n<p><a href=\"#stroke-functions\">Further down in the guide</a>, we cover how to use a function\nin the stroke argument to customize all strokes individually. This is how you\nachieve more complex stroking patterns.</p>\n<h3 id=\"individual-lines\">Adding individual lines in the table</h3>\n<p>If you want to add a single horizontal or vertical line in your table, for\nexample to separate a group of rows, you can use the <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-hline\" title=\"`table.hline`\"><code>table.hline</code></a> and\n<a href=\"/en-US-v0.13.1/reference/model/table/#definitions-vline\" title=\"`table.vline`\"><code>table.vline</code></a> elements for horizontal and vertical lines, respectively. Add\nthem to the argument list of the <code>table</code> function just like you would add\nindividual cells and a header.</p>\n<p>Let's take a look at the following example from the reference:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> table<span class=\"typ-punct\">.</span><span class=\"typ-func\">hline</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.6pt</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-comment\">// Morning schedule abridged.</span>\n  <span class=\"typ-punct\">[</span>14:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Talk: Tracked Layout<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>15:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Talk: Automations<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>16:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Workshop: Tables<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">hline</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>19:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Day 1 Attendee Mixer<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/dce18351d85a7e6be7b1bc21a44667a8.png\" alt=\"Preview\"></div></div>\n<p>In this example, you can see that we have placed a call to <code>table.hline</code> between\nthe cells, producing a horizontal line at that spot. We also used a set rule on\nthe element to reduce its stroke width to make it fit better with the weight of\nthe font.</p>\n<p>By default, Typst places horizontal and vertical lines after the current row or\ncolumn, depending on their position in the argument list. You can also manually\nmove them to a different position by adding the <code>y</code> (for <code>hline</code>) or <code>x</code> (for\n<code>vline</code>) argument. For example, the code below would produce the same result:</p>\n<pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> table<span class=\"typ-punct\">.</span><span class=\"typ-func\">hline</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.6pt</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-comment\">// Morning schedule abridged.</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">hline</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>14:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Talk: Tracked Layout<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>15:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Talk: Automations<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>16:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Workshop: Tables<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>19:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Day 1 Attendee Mixer<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre>\n<p>Let's imagine you are working with a template that shows none of the table\nstrokes except for one between the first and second row. Now, since you have one\ntable that also has labels in the first column, you want to add an extra\nvertical line to it. However, you do not want this vertical line to cross into\nthe top row. You can achieve this with the <code>start</code> argument:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-comment\">// Base template already configured tables, but we need some</span>\n<span class=\"typ-comment\">// extra configuration for this table.</span>\n<span class=\"typ-punct\">#</span><span class=\"typ-punct\">{</span>\n  <span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>align<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> _<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> left <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> right <span class=\"typ-punct\">}</span><span class=\"typ-punct\">)</span>\n  <span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-func\">smallcaps</span>\n  <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n    columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">1fr</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">vline</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1</span><span class=\"typ-punct\">,</span> start<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Trainset<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Top Speed<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Length<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Weight<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>TGV Réseau<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>320 km/h<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>200m<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>383t<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>ICE 403<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>330 km/h<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>201m<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>409t<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Shinkansen N700<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>300 km/h<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>405m<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>700t<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span>\n<span class=\"typ-punct\">}</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/2c8360bc80e83043f19b274c46759702.png\" alt=\"Preview\"></div></div>\n<p>In this example, we have added <code>table.vline</code> at the start of our positional\nargument list. But because the line is not supposed to go to the left of the\nfirst column, we specified the <code>x</code> argument as <code><span class=\"typ-num\">1</span></code>. We also set the <code>start</code>\nargument to <code><span class=\"typ-num\">1</span></code> so that the line does only start after the first row.</p>\n<p>The example also contains two more things: We use the align argument with a\nfunction to right-align the data in all but the first column and use a show rule\nto make the first column of table cells appear in small capitals. Because these\nstyles are specific to this one table, we put everything into a <a href=\"/en-US-v0.13.1/reference/scripting/#blocks\">code\nblock</a>, so that the styling does not affect any further\ntables.</p>\n<h3 id=\"stroke-override\">Overriding the strokes of a single cell</h3>\n<p>Imagine you want to change the stroke around a single cell. Maybe your cell is\nvery important and needs highlighting! For this scenario, there is the\n<a href=\"/en-US-v0.13.1/reference/model/table/#definitions-cell\"><code>table.cell</code> function</a>. Instead of adding your content directly in\nthe argument list of the table, you wrap it in a <code>table.cell</code> call. Now, you can\nuse <code>table.cell</code>'s argument list to override the table properties, such as the\nstroke, for this cell only.</p>\n<p>Here's an example with a matrix of two of the Big Five personality factors, with\none intersection highlighted.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n\n  <span class=\"typ-punct\">[</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*High Neuroticism*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Low Neuroticism*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*High Agreeableness*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> orange <span class=\"typ-op\">+</span> <span class=\"typ-num\">2pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">[</span>\n    <span class=\"typ-emph\">_Sensitive_</span> <span class=\"typ-escape\">\\</span> Prone to emotional distress but very empathetic.\n  <span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-emph\">_Compassionate_</span> <span class=\"typ-escape\">\\</span> Caring and stable, often seen as a supportive figure.<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n\n  <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*Low Agreeableness*</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-emph\">_Contentious_</span> <span class=\"typ-escape\">\\</span> Competitive and easily agitated.<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span><span class=\"typ-emph\">_Detached_</span> <span class=\"typ-escape\">\\</span> Independent and calm, may appear aloof.<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/cd3fab3e1a1dacef7dbdf9a31249ce2b.png\" alt=\"Preview\"></div></div>\n<p>Above, you can see that we used the <code>table.cell</code> element in the table's argument\nlist and passed the cell content to it. We have used its <code>stroke</code> argument to\nset a wider orange stroke. Despite the fact that we disabled vertical strokes on\nthe table, the orange stroke appeared on all sides of the modified cell, showing\nthat the table's stroke configuration is overwritten.</p>\n<h3 id=\"stroke-functions\">Complex document-wide stroke customization</h3>\n<p>This section explains how to customize all lines at once in one or multiple\ntables. This allows you to draw only the first horizontal line or omit the outer\nlines, without knowing how many cells the table has. This is achieved by\nproviding a function to the table's <code>stroke</code> parameter. The function should\nreturn a stroke given the zero-indexed x and y position of the current cell. You\nshould only need these functions if you are a template author, do not use a\ntemplate, or need to heavily customize your tables. Otherwise, your template\nshould set appropriate default table strokes.</p>\n<p>For example, this is a set rule that draws all horizontal lines except for the\nvery first and last line.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>style<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;italic&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>style<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;normal&quot;</span><span class=\"typ-punct\">,</span> weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-punct\">(</span>top<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.8pt</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">,</span>\n  align<span class=\"typ-punct\">:</span> center <span class=\"typ-op\">+</span> horizon<span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Technique<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Advantage<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Drawback<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Diegetic<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Immersive<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>May be contrived<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Extradiegetic<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Breaks immersion<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Obtrusive<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Omitted<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Fosters engagement<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>May fracture audience<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/48a88fa20efd01fc14a20940ad3fb5ef.png\" alt=\"Preview\"></div></div>\n<p>In the set rule, we pass a function that receives two arguments, assigning the\nvertical coordinate to <code>y</code> and discarding the horizontal coordinate. It then\nreturns a stroke dictionary with a <code><span class=\"typ-num\">0.8pt</span></code> top stroke for all but the first\nline. The cells in the first line instead implicitly receive <code><span class=\"typ-key\">none</span></code> as the\nreturn value. You can easily modify this function to just draw the inner\nvertical lines instead as <code><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> _<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-punct\">(</span>left<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.8pt</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span></code>.</p>\n<p>Let's try a few more stroking functions. The next function will only draw a line\nbelow the first row:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-punct\">(</span>bottom<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-comment\">// Table as seen above</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/9f2bec20afad0ef1ee4706e7c218f891.png\" alt=\"Preview\"></div></div>\n<p>If you understood the first example, it becomes obvious what happens here. We\ncheck if we are in the first row. If so, we return a bottom stroke. Otherwise,\nwe'll return <code><span class=\"typ-key\">none</span></code> implicitly.</p>\n<p>The next example shows how to draw all but the outer lines:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n  left<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0.8pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  top<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0.8pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-comment\">// Table as seen above</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/411878f9ec8fa83e18cfd5517ac93d77.png\" alt=\"Preview\"></div></div>\n<p>This example uses both the <code>x</code> and <code>y</code> coordinates. It omits the left stroke in\nthe first column and the top stroke in the first row. The right and bottom lines\nare not drawn.</p>\n<p>Finally, here is a table that draws all lines except for the vertical lines in\nthe first row and horizontal lines in the table body. It looks a bit like a\ncalendar.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n  left<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-key\">or</span> y <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">1pt</span> <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  right<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n  top<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">&lt;=</span> <span class=\"typ-num\">1</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">1pt</span> <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  bottom<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-comment\">// Table as seen above</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/ab0f2d29eff8b6955bb4502615fd0f39.png\" alt=\"Preview\"></div></div>\n<p>This example is a bit more complex. We start by drawing all the strokes on the\nright of the cells. But this means that we have drawn strokes in the top row,\ntoo, and we don't need those! We use the fact that <code>left</code> will override <code>right</code>\nand only draw the left line if we are not in the first row or if we are in the\nfirst column. In all other cases, we explicitly remove the left line. Finally,\nwe draw the horizontal lines by first setting the bottom line and then for the\nfirst two rows with the <code>top</code> key, suppressing all other top lines. The last\nline appears because there is no <code>top</code> line that could suppress it.</p>\n<h3 id=\"double-stroke\">How to achieve a double line?</h3>\n<p>Typst does not yet have a native way to draw double strokes, but there are\nmultiple ways to emulate them, for example with <a href=\"/en-US-v0.13.1/reference/visualize/tiling/\">tilings</a>. We will\nshow a different workaround in this section: Table gutters.</p>\n<p>Tables can space their cells apart using the <code>gutter</code> argument. When a gutter is\napplied, a stroke is drawn on each of the now separated cells. We can\nselectively add gutter between the rows or columns for which we want to draw a\ndouble line. The <code>row-gutter</code> and <code>column-gutter</code> arguments allow us to do this.\nThey accept arrays of gutter values. Let's take a look at an example:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  row-gutter<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">2.2pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-key\">auto</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Date<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Exercise Type<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Calories Burned<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2023-03-15<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Swimming<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>400<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2023-03-17<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Weightlifting<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>250<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2023-03-18<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Yoga<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>200<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/91eb6958c17ff1340429096b6e188d45.png\" alt=\"Preview\"></div></div>\n<p>We can see that we used an array for <code>row-gutter</code> that specifies a <code><span class=\"typ-num\">2.2pt</span></code> gap\nbetween the first and second row. It then continues with <code>auto</code> (which is the\ndefault, in this case <code><span class=\"typ-num\">0pt</span></code> gutter) which will be the gutter between all other\nrows, since it is the last entry in the array.</p>\n<h2 id=\"alignment\">How to align the contents of the cells in my table?</h2>\n<p>You can use multiple mechanisms to align the content in your table. You can\neither use the <code>table</code> function's <code>align</code> argument to set the alignment for your\nwhole table (or use it in a set rule to set the alignment for tables throughout\nyour document) or the <a href=\"/en-US-v0.13.1/reference/layout/align/\" title=\"`align`\"><code>align</code></a> function (or <code>table.cell</code>'s <code>align</code> argument) to\noverride the alignment of a single cell.</p>\n<p>When using the <code>table</code> function's align argument, you can choose between three\nmethods to specify an <a href=\"/en-US-v0.13.1/reference/layout/alignment/\" title=\"alignment\">alignment</a>:</p>\n<ul>\n<li>Just specify a single alignment like <code>right</code> (aligns in the top-right corner)\nor <code>center + horizon</code> (centers all cell content). This changes the alignment\nof all cells.</li>\n<li>Provide an array. Typst will cycle through this array for each column.</li>\n<li>Provide a function that is passed the horizontal <code>x</code> and vertical <code>y</code>\ncoordinate of a cell and returns an alignment.</li>\n</ul>\n<p>For example, this travel itinerary right-aligns the day column and left-aligns\neverything else by providing an array in the <code>align</code> argument:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>font<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;IBM Plex Sans&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">,</span>\n  align<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>right<span class=\"typ-punct\">,</span> left<span class=\"typ-punct\">,</span> left<span class=\"typ-punct\">,</span> left<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">odd</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">)</span> <span class=\"typ-punct\">{</span> green<span class=\"typ-punct\">.</span><span class=\"typ-func\">lighten</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">90%</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Day<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Location<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Hotel or Apartment<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Activities<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Paris, France<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Hôtel de l&#39;Europe<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Arrival, Evening River Cruise<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Paris, France<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Hôtel de l&#39;Europe<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Louvre Museum, Eiffel Tower<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>3<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Lyon, France<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Lyon City Hotel<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>City Tour, Local Cuisine Tasting<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>4<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Geneva, Switzerland<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Lakeview Inn<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Lake Geneva, Red Cross Museum<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Zermatt, Switzerland<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Alpine Lodge<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Visit Matterhorn, Skiing<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/3d14afd44d650537031a621541053c17.png\" alt=\"Preview\"></div></div>\n<p>However, this example does not yet look perfect — the header cells should be\nbottom-aligned. Let's use a function instead to do so:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>font<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;IBM Plex Sans&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">,</span>\n  align<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span>\n    <span class=\"typ-key\">if</span> x <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> right <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> left <span class=\"typ-punct\">}</span> <span class=\"typ-op\">+</span>\n    <span class=\"typ-key\">if</span> y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> bottom <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> top <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">odd</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">)</span> <span class=\"typ-punct\">{</span> green<span class=\"typ-punct\">.</span><span class=\"typ-func\">lighten</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">90%</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Day<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Location<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Hotel or Apartment<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Activities<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>1<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Paris, France<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Hôtel de l&#39;Europe<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Arrival, Evening River Cruise<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>2<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Paris, France<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Hôtel de l&#39;Europe<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Louvre Museum, Eiffel Tower<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n <span class=\"typ-comment\">// ... remaining days omitted</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/bf7905b60360831cefc0b9b9a5600d47.png\" alt=\"Preview\"></div></div>\n<p>In the function, we calculate a horizontal and vertical alignment based on\nwhether we are in the first column (<code>x <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span></code>) or the first row (<code>y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span></code>).\nWe then make use of the fact that we can add horizontal and vertical alignments\nwith <code>+</code> to receive a single, two-dimensional alignment.</p>\n<p>You can find an example of using <code>table.cell</code> to change a single cell's\nalignment on <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-cell\">its reference page</a>.</p>\n<h2 id=\"merge-cells\">How to merge cells?</h2>\n<p>When a table contains logical groupings or the same data in multiple adjacent\ncells, merging multiple cells into a single, larger cell can be advantageous.\nAnother use case for cell groups are table headers with multiple rows: That way,\nyou can group for example a sales data table by quarter in the first row and by\nmonths in the second row.</p>\n<p>A merged cell spans multiple rows and/or columns. You can achieve it with the\n<a href=\"/en-US-v0.13.1/reference/model/table/#definitions-cell\" title=\"`table.cell`\"><code>table.cell</code></a> function's <code>rowspan</code> and <code>colspan</code> arguments: Just specify how\nmany rows or columns you want your cell to span.</p>\n<p>The example below contains an attendance calendar for an office with in-person\nand remote days for each team member. To make the table more glanceable, we\nmerge adjacent cells with the same value:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> ofi <span class=\"typ-op\">=</span> <span class=\"typ-punct\">[</span>Office<span class=\"typ-punct\">]</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> rem <span class=\"typ-op\">=</span> <span class=\"typ-punct\">[</span><span class=\"typ-emph\">_Remote_</span><span class=\"typ-punct\">]</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> lea <span class=\"typ-op\">=</span> <span class=\"typ-punct\">[</span><span class=\"typ-strong\">*On leave*</span><span class=\"typ-punct\">]</span>\n\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>\n  fill<span class=\"typ-punct\">:</span> white<span class=\"typ-punct\">,</span>\n  weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">6</span> <span class=\"typ-op\">*</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  align<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> x <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-key\">or</span> y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> left <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> center <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n  stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n    <span class=\"typ-comment\">// Separate black cells with white strokes.</span>\n    left<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-key\">and</span> x <span class=\"typ-op\">&gt;</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> white <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> black <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n    rest<span class=\"typ-punct\">:</span> black<span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> black <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n\n  table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">(</span>\n    <span class=\"typ-punct\">[</span>Team member<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Monday<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Tuesday<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Wednesday<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Thursday<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Friday<span class=\"typ-punct\">]</span>\n  <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Evelyn Archer<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>colspan<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span> ofi<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>colspan<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span> rem<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    ofi<span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Lila Montgomery<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>colspan<span class=\"typ-punct\">:</span> <span class=\"typ-num\">5</span><span class=\"typ-punct\">,</span> lea<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">[</span>Nolan Pearce<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    rem<span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">cell</span><span class=\"typ-punct\">(</span>colspan<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span> ofi<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    rem<span class=\"typ-punct\">,</span>\n    ofi<span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/cb268a7fe2cb41bcb2dd071c5495dbdb.png\" alt=\"Preview\"></div></div>\n<p>In the example, we first define variables with &quot;Office&quot;, &quot;Remote&quot;, and &quot;On\nleave&quot; so we don't have to write these labels out every time. We can then use\nthese variables in the table body either directly or in a <code>table.cell</code> call if\nthe team member spends multiple consecutive days in office, remote, or on leave.</p>\n<p>The example also contains a black header (created with <code>table</code>'s <code>fill</code>\nargument) with white strokes (<code>table</code>'s <code>stroke</code> argument) and white text (set\nby the <code>table.cell</code> set rule). Finally, we align all the content of all table\ncells in the body in the center. If you want to know more about the functions\npassed to <code>align</code>, <code>stroke</code>, and <code>fill</code>, you can check out the sections on\n<a href=\"/en-US-v0.13.1/reference/layout/alignment/\" title=\"alignment\">alignment</a>, <a href=\"#stroke-functions\">strokes</a>, and <a href=\"#fills\">striped\ntables</a>.</p>\n<p>This table would be a great candidate for fully automated generation from an\nexternal data source! Check out the <a href=\"#importing-data\">section about importing\ndata</a> to learn more about that.</p>\n<h2 id=\"rotate-table\">How to rotate a table?</h2>\n<p>When tables have many columns, a portrait paper orientation can quickly get\ncramped. Hence, you'll sometimes want to switch your tables to landscape\norientation. There are two ways to accomplish this in Typst:</p>\n<ul>\n<li>If you want to rotate only the table but not the other content of the page and\nthe page itself, use the <a href=\"/en-US-v0.13.1/reference/layout/rotate/\"><code>rotate</code> function</a> with the <code>reflow</code>\nargument set to <code><span class=\"typ-key\">true</span></code>.</li>\n<li>If you want to rotate the whole page the table is on, you can use the <a href=\"/en-US-v0.13.1/reference/layout/page/\"><code>page</code>\nfunction</a> with its <code>flipped</code> argument set to <code><span class=\"typ-key\">true</span></code>. The header,\nfooter, and page number will now also appear on the long edge of the page.\nThis has the advantage that the table will appear right side up when read on a\ncomputer, but it also means that a page in your document has different\ndimensions than all the others, which can be jarring to your readers.</li>\n</ul>\n<p>Below, we will demonstrate both techniques with a student grade book table.</p>\n<p>First, we will rotate the table on the page. The example also places some text\non the right of the table.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">page</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;a5&quot;</span><span class=\"typ-punct\">,</span> columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span> numbering<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;— 1 —&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">rotate</span><span class=\"typ-punct\">(</span>\n  <span class=\"typ-op\">-</span><span class=\"typ-num\">90deg</span><span class=\"typ-punct\">,</span>\n  reflow<span class=\"typ-punct\">:</span> <span class=\"typ-key\">true</span><span class=\"typ-punct\">,</span>\n\n  <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n    columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span> <span class=\"typ-op\">+</span> <span class=\"typ-num\">5</span> <span class=\"typ-op\">*</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    inset<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.6em</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n      x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n      top<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">&lt;=</span> <span class=\"typ-num\">1</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">1pt</span> <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n      bottom<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    align<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>left<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> left<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">(</span>\n      <span class=\"typ-punct\">[</span>Student Name<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n      <span class=\"typ-punct\">[</span>Assignment 1<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Assignment 2<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n      <span class=\"typ-punct\">[</span>Mid-term<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Final Exam<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n      <span class=\"typ-punct\">[</span>Total Grade<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Jane Smith<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>78%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>82%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>75%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>80%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>B<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Alex Johnson<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>90%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>95%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>94%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>96%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>A+<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>John Doe<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>85%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>90%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>88%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>92%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>A<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Maria Garcia<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>88%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>84%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>89%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>85%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>B+<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Zhang Wei<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>93%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>89%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>90%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>91%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>A-<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Marina Musterfrau<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>96%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>91%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>74%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>69%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>B-<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">lorem</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">80</span><span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/b7f9a12e649ef3d655fd1fbe7b98456a.png\" alt=\"Preview\"></div></div>\n<p>What we have here is a two-column document on ISO A5 paper with page numbers on\nthe bottom. The table has six columns and contains a few customizations to\n<a href=\"#strokes\">stroke</a>, alignment and spacing. But the most important part is that\nthe table is wrapped in a call to the <code>rotate</code> function with the <code>reflow</code>\nargument being <code><span class=\"typ-key\">true</span></code>. This will make the table rotate 90 degrees\ncounterclockwise. The reflow argument is needed so that the table's rotation\naffects the layout. If it was omitted, Typst would lay out the page as if the\ntable was not rotated (<code><span class=\"typ-key\">true</span></code> might become the default in the future).</p>\n<p>The example also shows how to produce many columns of the same size: To the\ninitial <code><span class=\"typ-num\">1fr</span></code> column, we add an array with five <code><span class=\"typ-key\">auto</span></code> items that we\ncreate by multiplying an array with one <code><span class=\"typ-key\">auto</span></code> item by five. Note that arrays\nwith just one item need a trailing comma to distinguish them from merely\nparenthesized expressions.</p>\n<p>The second example shows how to rotate the whole page, so that the table stays\nupright:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">page</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;a5&quot;</span><span class=\"typ-punct\">,</span> numbering<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;— 1 —&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">page</span><span class=\"typ-punct\">(</span>flipped<span class=\"typ-punct\">:</span> <span class=\"typ-key\">true</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">[</span>\n  <span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n    columns<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">1fr</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span> <span class=\"typ-op\">+</span> <span class=\"typ-num\">5</span> <span class=\"typ-op\">*</span> <span class=\"typ-punct\">(</span><span class=\"typ-key\">auto</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    inset<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0.6em</span><span class=\"typ-punct\">,</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">(</span>\n      x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n      top<span class=\"typ-punct\">:</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">&lt;=</span> <span class=\"typ-num\">1</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">1pt</span> <span class=\"typ-punct\">}</span> <span class=\"typ-key\">else</span> <span class=\"typ-punct\">{</span> <span class=\"typ-num\">0pt</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n      bottom<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    align<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>left<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> right<span class=\"typ-punct\">,</span> left<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">(</span>\n      <span class=\"typ-punct\">[</span>Student Name<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n      <span class=\"typ-punct\">[</span>Assignment 1<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Assignment 2<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n      <span class=\"typ-punct\">[</span>Mid-term<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>Final Exam<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n      <span class=\"typ-punct\">[</span>Total Grade<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Jane Smith<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>78%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>82%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>75%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>80%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>B<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Alex Johnson<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>90%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>95%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>94%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>96%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>A+<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>John Doe<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>85%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>90%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>88%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>92%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>A<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Maria Garcia<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>88%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>84%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>89%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>85%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>B+<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Zhang Wei<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>93%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>89%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>90%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>91%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>A-<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>Marina Musterfrau<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>96%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>91%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>74%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>69%<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>B-<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span>\n\n  <span class=\"typ-func\">#</span><span class=\"typ-func\">pad</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">15%</span><span class=\"typ-punct\">,</span> top<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1.5em</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">[</span>\n    <span class=\"typ-heading\">= Winter 2023/24 results</span>\n    <span class=\"typ-func\">#</span><span class=\"typ-func\">lorem</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">80</span><span class=\"typ-punct\">)</span>\n  <span class=\"typ-punct\">]</span>\n<span class=\"typ-punct\">]</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/f46a28eb14c5d2fa6b7258721526f8cf.png\" alt=\"Preview\"></div></div>\n<p>Here, we take the same table and the other content we want to set with it and\nput it into a call to the <a href=\"/en-US-v0.13.1/reference/layout/page/\" title=\"`page`\"><code>page</code></a> function while supplying <code><span class=\"typ-key\">true</span></code> to the\n<code>flipped</code> argument. This will instruct Typst to create new pages with width and\nheight swapped and place the contents of the function call onto a new page.\nNotice how the page number is also on the long edge of the paper now. At the\nbottom of the page, we use the <a href=\"/en-US-v0.13.1/reference/layout/pad/\" title=\"`pad`\"><code>pad</code></a> function to constrain the width of the\nparagraph to achieve a nice and legible line length.</p>\n<h2 id=\"table-across-pages\">How to break a table across pages?</h2>\n<p>It is best to contain a table on a single page. However, some tables just have\nmany rows, so breaking them across pages becomes unavoidable. Fortunately, Typst\nsupports breaking tables across pages out of the box. If you are using the\n<a href=\"/en-US-v0.13.1/reference/model/table/#definitions-header\" title=\"`table.header`\"><code>table.header</code></a> and <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-footer\" title=\"`table.footer`\"><code>table.footer</code></a> functions, their contents will be repeated\non each page as the first and last rows, respectively. If you want to disable\nthis behavior, you can set <code>repeat</code> to <code><span class=\"typ-key\">false</span></code> on either of them.</p>\n<p>If you have placed your table inside of a <a href=\"/en-US-v0.13.1/reference/model/figure/\" title=\"figure\">figure</a>, it becomes unable to break\nacross pages by default. However, you can change this behavior. Let's take a\nlook:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">page</span><span class=\"typ-punct\">(</span>width<span class=\"typ-punct\">:</span> <span class=\"typ-num\">9cm</span><span class=\"typ-punct\">,</span> height<span class=\"typ-punct\">:</span> <span class=\"typ-num\">6cm</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">text</span><span class=\"typ-punct\">(</span>weight<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;bold&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> <span class=\"typ-func\">figure</span><span class=\"typ-punct\">:</span> <span class=\"typ-key\">set</span> <span class=\"typ-func\">block</span><span class=\"typ-punct\">(</span>breakable<span class=\"typ-punct\">:</span> <span class=\"typ-key\">true</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">figure</span><span class=\"typ-punct\">(</span>\n  caption<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">[</span>Training regimen for Marathon<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n    columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">,</span>\n    fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> y <span class=\"typ-op\">==</span> <span class=\"typ-num\">0</span> <span class=\"typ-punct\">{</span> gray<span class=\"typ-punct\">.</span><span class=\"typ-func\">lighten</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">75%</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Week<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Distance (km)<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Time (hh:mm:ss)<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>1<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>  <span class=\"typ-punct\">[</span>00:30:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>2<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>7<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>  <span class=\"typ-punct\">[</span>00:45:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>3<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>10<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>01:00:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>4<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>12<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>01:10:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>5<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>15<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>01:25:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>6<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>18<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>01:40:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>7<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>20<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>01:50:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span>8<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>22<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span>02:00:00<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    <span class=\"typ-punct\">[</span><span class=\"typ-escape\">...</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span><span class=\"typ-escape\">...</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span> <span class=\"typ-punct\">[</span><span class=\"typ-escape\">...</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n    table<span class=\"typ-punct\">.</span><span class=\"typ-func\">footer</span><span class=\"typ-punct\">[</span><span class=\"typ-emph\">_Goal_</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span><span class=\"typ-emph\">_42.195_</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span><span class=\"typ-emph\">_02:45:00_</span><span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-punct\">)</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/2cdf355cdb67df614a2fd121dd5563a3.png\" alt=\"Preview\"></div></div>\n<p>A figure automatically produces a <a href=\"/en-US-v0.13.1/reference/layout/block/\" title=\"block\">block</a> which cannot break by default.\nHowever, we can reconfigure the block of the figure using a show rule to make it\n<code>breakable</code>. Now, the figure spans multiple pages with the headers and footers\nrepeating.</p>\n<h2 id=\"importing-data\">How to import data into a table?</h2>\n<p>Often, you need to put data that you obtained elsewhere into a table. Sometimes,\nthis is from Microsoft Excel or Google Sheets, sometimes it is from a dataset\non the web or from your experiment. Fortunately, Typst can load many <a href=\"/en-US-v0.13.1/reference/data-loading/\">common\nfile formats</a>, so you can use scripting to include their\ndata in a table.</p>\n<p>The most common file format for tabular data is CSV. You can obtain a CSV file\nfrom Excel by choosing &quot;Save as&quot; in the <em>File</em> menu and choosing the file format\n&quot;CSV UTF-8 (Comma-delimited) (.csv)&quot;. Save the file and, if you are using the\nweb app, upload it to your project.</p>\n<p>In our case, we will be building a table about Moore's Law. For this purpose, we\nare using a statistic with <a href=\"https://ourworldindata.org/grapher/transistors-per-microprocessor\">how many transistors the average microprocessor\nconsists of per year from Our World in\nData</a>. Let's\nstart by pressing the &quot;Download&quot; button to get a CSV file with the raw data.</p>\n<p>Be sure to move the file to your project or somewhere Typst can see it, if you\nare using the CLI. Once you did that, we can open the file to see how it is\nstructured:</p>\n<pre style=\"background-color:#ffffff;\">\n<span style=\"color:#4b69c6;\">Entity</span><span style=\"color:#000000;\">,</span><span style=\"color:#4b69c6;\">Code</span><span style=\"color:#000000;\">,</span><span style=\"color:#b60157;\">Year</span><span style=\"color:#000000;\">,</span><span style=\"color:#d73a49;\">Transistors per microprocessor\n</span><span style=\"color:#4b69c6;\">World</span><span style=\"color:#000000;\">,</span><span style=\"color:#4b69c6;\">OWID_WRL</span><span style=\"color:#000000;\">,</span><span style=\"color:#b60157;\">1971</span><span style=\"color:#000000;\">,</span><span style=\"color:#d73a49;\">2308.2417\n</span><span style=\"color:#4b69c6;\">World</span><span style=\"color:#000000;\">,</span><span style=\"color:#4b69c6;\">OWID_WRL</span><span style=\"color:#000000;\">,</span><span style=\"color:#b60157;\">1972</span><span style=\"color:#000000;\">,</span><span style=\"color:#d73a49;\">3554.5222\n</span><span style=\"color:#4b69c6;\">World</span><span style=\"color:#000000;\">,</span><span style=\"color:#4b69c6;\">OWID_WRL</span><span style=\"color:#000000;\">,</span><span style=\"color:#b60157;\">1974</span><span style=\"color:#000000;\">,</span><span style=\"color:#d73a49;\">6097.5625\n</span></pre>\n<p>The file starts with a header and contains four columns: Entity (which is to\nwhom the metric applies), Code, the year, and the number of transistors per\nmicroprocessor. Only the last two columns change between each row, so we can\ndisregard &quot;Entity&quot; and &quot;Code&quot;.</p>\n<p>First, let's start by loading this file with the <a href=\"/en-US-v0.13.1/reference/data-loading/csv/\" title=\"`csv`\"><code>csv</code></a> function. It accepts\nthe file name of the file we want to load as a string argument:</p>\n<pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> moore <span class=\"typ-op\">=</span> <span class=\"typ-func\">csv</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;moore.csv&quot;</span><span class=\"typ-punct\">)</span>\n</code></pre>\n<p>We have loaded our file (assuming we named it <code>moore.csv</code>) and <a href=\"/en-US-v0.13.1/reference/scripting/#bindings\">bound\nit</a> to the new variable <code>moore</code>. This will not produce any\noutput, so there's nothing to see yet. If we want to examine what Typst loaded,\nwe can either hover the name of the variable in the web app or print some items\nfrom the array:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> moore <span class=\"typ-op\">=</span> <span class=\"typ-func\">csv</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;moore.csv&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-pol\">#</span><span class=\"typ-pol\">moore</span><span class=\"typ-punct\">.</span><span class=\"typ-func\">slice</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">0</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/e16aeadb19d1635fc55013308b03e2cd.png\" alt=\"Preview\"></div></div>\n<p>With the arguments <code><span class=\"typ-punct\">(</span><span class=\"typ-num\">0</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">3</span><span class=\"typ-punct\">)</span></code>, the <a href=\"/en-US-v0.13.1/reference/foundations/array/#definitions-slice\"><code>slice</code></a> method returns the\nfirst three items in the array (with the indices 0, 1, and 2). We can see that\neach row is its own array with one item per cell.</p>\n<p>Now, let's write a loop that will transform this data into an array of cells\nthat we can use with the table function.</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> moore <span class=\"typ-op\">=</span> <span class=\"typ-func\">csv</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;moore.csv&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n  columns<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-op\">..</span><span class=\"typ-key\">for</span> <span class=\"typ-punct\">(</span><span class=\"typ-op\">..</span><span class=\"typ-punct\">,</span> year<span class=\"typ-punct\">,</span> count<span class=\"typ-punct\">)</span> <span class=\"typ-key\">in</span> moore <span class=\"typ-punct\">{</span>\n    <span class=\"typ-punct\">(</span>year<span class=\"typ-punct\">,</span> count<span class=\"typ-punct\">)</span>\n  <span class=\"typ-punct\">}</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/d491cb1797a018f403dc2d95d3064e36.png\" alt=\"Preview\"></div></div>\n<p>The example above uses a for loop that iterates over the rows in our CSV file\nand returns an array for each iteration. We use the for loop's\n<a href=\"/en-US-v0.13.1/reference/scripting/#bindings\">destructuring</a> capability to discard all but the last two\nitems of each row. We then create a new array with just these two. Because Typst\nwill concatenate the array results of all the loop iterations, we get a\none-dimensional array in which the year column and the number of transistors\nalternate. We can then insert the array as cells. For this we use the <a href=\"/en-US-v0.13.1/reference/foundations/arguments/#spreading\">spread\noperator</a> (<code>..</code>). By prefixing an array, or, in our case\nan expression that yields an array, with two dots, we tell Typst that the\narray's items should be used as positional arguments.</p>\n<p>Alternatively, we can also use the <a href=\"/en-US-v0.13.1/reference/foundations/array/#definitions-map\"><code>map</code></a>, <a href=\"/en-US-v0.13.1/reference/foundations/array/#definitions-slice\"><code>slice</code></a>,\nand <a href=\"/en-US-v0.13.1/reference/foundations/array/#definitions-flatten\"><code>flatten</code></a> array methods to write this in a more functional\nstyle:</p>\n<pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> moore <span class=\"typ-op\">=</span> <span class=\"typ-func\">csv</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;moore.csv&quot;</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n   columns<span class=\"typ-punct\">:</span> moore<span class=\"typ-punct\">.</span><span class=\"typ-func\">first</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span><span class=\"typ-func\">len</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n   <span class=\"typ-op\">..</span>moore<span class=\"typ-punct\">.</span><span class=\"typ-func\">map</span><span class=\"typ-punct\">(</span>m <span class=\"typ-op\">=&gt;</span> m<span class=\"typ-punct\">.</span><span class=\"typ-func\">slice</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">2</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span><span class=\"typ-func\">flatten</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre>\n<p>This example renders the same as the previous one, but first uses the <code>map</code>\nfunction to change each row of the data. We pass a function to map that gets run\non each row of the CSV and returns a new value to replace that row with. We use\nit to discard the first two columns with <code>slice</code>. Then, we spread the data into\nthe <code>table</code> function. However, we need to pass a one-dimensional array and\n<code>moore</code>'s value is two-dimensional (that means that each of its row values\ncontains an array with the cell data). That's why we call <code>flatten</code> which\nconverts it to a one-dimensional array. We also extract the number of columns\nfrom the data itself.</p>\n<p>Now that we have nice code for our table, we should try to also make the table\nitself nice! The transistor counts go from millions in 1995 to trillions in 2021\nand changes are difficult to see with so many digits. We could try to present\nour data logarithmically to make it more digestible:</p>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> moore <span class=\"typ-op\">=</span> <span class=\"typ-func\">csv</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;moore.csv&quot;</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> moore-log <span class=\"typ-op\">=</span> moore<span class=\"typ-punct\">.</span><span class=\"typ-func\">slice</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">1</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span><span class=\"typ-func\">map</span><span class=\"typ-punct\">(</span>m <span class=\"typ-op\">=&gt;</span> <span class=\"typ-punct\">{</span>\n  <span class=\"typ-key\">let</span> <span class=\"typ-punct\">(</span><span class=\"typ-op\">..</span><span class=\"typ-punct\">,</span> year<span class=\"typ-punct\">,</span> count<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=</span> m\n  <span class=\"typ-key\">let</span> log <span class=\"typ-op\">=</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">log</span><span class=\"typ-punct\">(</span><span class=\"typ-func\">float</span><span class=\"typ-punct\">(</span>count<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n  <span class=\"typ-key\">let</span> rounded <span class=\"typ-op\">=</span> <span class=\"typ-func\">str</span><span class=\"typ-punct\">(</span>calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">round</span><span class=\"typ-punct\">(</span>log<span class=\"typ-punct\">,</span> digits<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n  <span class=\"typ-punct\">(</span>year<span class=\"typ-punct\">,</span> rounded<span class=\"typ-punct\">)</span>\n<span class=\"typ-punct\">}</span><span class=\"typ-punct\">)</span>\n\n<span class=\"typ-key\">#</span><span class=\"typ-key\">show</span> table<span class=\"typ-punct\">.</span>cell<span class=\"typ-punct\">.</span><span class=\"typ-func\">where</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">:</span> <span class=\"typ-num\">0</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">:</span> <span class=\"typ-func\">strong</span>\n\n<span class=\"typ-func\">#</span><span class=\"typ-func\">table</span><span class=\"typ-punct\">(</span>\n   columns<span class=\"typ-punct\">:</span> moore-log<span class=\"typ-punct\">.</span><span class=\"typ-func\">first</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span><span class=\"typ-func\">len</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n   align<span class=\"typ-punct\">:</span> right<span class=\"typ-punct\">,</span>\n   fill<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>_<span class=\"typ-punct\">,</span> y<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=&gt;</span> <span class=\"typ-key\">if</span> calc<span class=\"typ-punct\">.</span><span class=\"typ-func\">odd</span><span class=\"typ-punct\">(</span>y<span class=\"typ-punct\">)</span> <span class=\"typ-punct\">{</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;D7D9E0&quot;</span><span class=\"typ-punct\">)</span> <span class=\"typ-punct\">}</span><span class=\"typ-punct\">,</span>\n   stroke<span class=\"typ-punct\">:</span> <span class=\"typ-key\">none</span><span class=\"typ-punct\">,</span>\n\n   table<span class=\"typ-punct\">.</span><span class=\"typ-func\">header</span><span class=\"typ-punct\">[</span>Year<span class=\"typ-punct\">]</span><span class=\"typ-punct\">[</span>Transistor count (<span class=\"typ-math-delim\">$</span><span class=\"typ-pol\">log</span><span class=\"typ-math-op\">_</span>10<span class=\"typ-math-delim\">$</span>)<span class=\"typ-punct\">]</span><span class=\"typ-punct\">,</span>\n   table<span class=\"typ-punct\">.</span><span class=\"typ-func\">hline</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-func\">rgb</span><span class=\"typ-punct\">(</span><span class=\"typ-str\">&quot;4D4C5B&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n   <span class=\"typ-op\">..</span>moore-log<span class=\"typ-punct\">.</span><span class=\"typ-func\">flatten</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.13.1/assets/64e5c9c075fa94f3ff18b9f3e1e0316d.png\" alt=\"Preview\"></div></div>\n<p>In this example, we first drop the header row from the data since we are adding\nour own. Then, we discard all but the last two columns as above. We do this by\n<a href=\"/en-US-v0.13.1/reference/scripting/#bindings\">destructuring</a> the array <code>m</code>, discarding all but the two\nlast items. We then convert the string in <code>count</code> to a floating point number,\ncalculate its logarithm and store it in the variable <code>log</code>. Finally, we round it\nto two digits, convert it to a string, and store it in the variable <code>rounded</code>.\nThen, we return an array with <code>year</code> and <code>rounded</code> that replaces the original\nrow. In our table, we have added our custom header that tells the reader that\nwe've applied a logarithm to the values. Then, we spread the flattened data as\nabove.</p>\n<p>We also styled the table with <a href=\"#fills\">stripes</a>, a\n<a href=\"#individual-lines\">horizontal line</a> below the first row, <a href=\"#alignment\">aligned</a>\neverything to the right, and emboldened the first column. Click on the links to\ngo to the relevant guide sections and see how it's done!</p>\n<h2 id=\"table-and-grid\">What if I need the table function for something that isn't a table?</h2>\n<p>Tabular layouts of content can be useful not only for matrices of closely\nrelated data, like shown in the examples throughout this guide, but also for\npresentational purposes. Typst differentiates between grids that are for layout\nand presentational purposes only and tables, in which the arrangement of the\ncells itself conveys information.</p>\n<p>To make this difference clear to other software and allow templates to heavily\nstyle tables, Typst has two functions for grid and table layout:</p>\n<ul>\n<li>The <a href=\"/en-US-v0.13.1/reference/model/table/\" title=\"`table`\"><code>table</code></a> function explained throughout this guide which is intended for\ntabular data.</li>\n<li>The <a href=\"/en-US-v0.13.1/reference/layout/grid/\" title=\"`grid`\"><code>grid</code></a> function which is intended for presentational purposes and page\nlayout.</li>\n</ul>\n<p>Both elements work the same way and have the same arguments. You can apply\neverything you have learned about tables in this guide to grids. There are only\nthree differences:</p>\n<ul>\n<li>You'll need to use the <a href=\"/en-US-v0.13.1/reference/layout/grid/#definitions-cell\" title=\"`grid.cell`\"><code>grid.cell</code></a>, <a href=\"/en-US-v0.13.1/reference/layout/grid/#definitions-vline\" title=\"`grid.vline`\"><code>grid.vline</code></a>, and <a href=\"/en-US-v0.13.1/reference/layout/grid/#definitions-hline\" title=\"`grid.hline`\"><code>grid.hline</code></a>\nelements instead of <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-cell\" title=\"`table.cell`\"><code>table.cell</code></a>, <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-vline\" title=\"`table.vline`\"><code>table.vline</code></a>, and <a href=\"/en-US-v0.13.1/reference/model/table/#definitions-hline\" title=\"`table.hline`\"><code>table.hline</code></a>.</li>\n<li>The grid has different defaults: It draws no strokes by default and has no\nspacing (<code>inset</code>) inside of its cells.</li>\n<li>Elements like <code>figure</code> do not react to grids since they are supposed to have\nno semantical bearing on the document structure.</li>\n</ul>"}}