Abstract 1 Introduction 2 Lower Bound 3 Upper Bound 4 Good-looking weightmaps 5 Related Work 6 Open Questions References Appendix A Appendix

1038 A10s Fit into One A0

Noel Friedrich ORCID Department of Mathematics, ETH Zürich, Switzerland
Abstract

The A-series paper sizes are specified in integer millimetres in ISO 216. Since the sizes are based on an irrational aspect ratio, rounding errors introduce small but cumulative discrepancies from their nominal areas. In this work, we prove that exactly 1038 sheets of ISO A10 can be packed without overlap into a single ISO A0 sheet, allowing only orthogonal (axis-aligned) placements. A lower bound is given by an explicit construction, while the upper bound is proved by a simple-to-verify computer-assisted certificate. Along the way, the dual certificates produce unexpectedly pretty weightmaps.111Companion video (expository): https://youtu.be/zDKBCIMkDbw [10]

Keywords and phrases:
rectangle packing, pallet loading problem, rounding effects, ISO 216
Copyright and License:
[Uncaptioned image] © Noel Friedrich; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Theory of computation Packing and covering problems
Supplementary Material:
Software  (Verification scripts, rounded weightmap certificate, and packing coordinates): https://doi.org/10.5281/zenodo.18813570
Editor:
John Iacono

1 Introduction

There are many reasons why the A-series has become the dominant international system for paper sizes [17]: it is metrically grounded, self-similar and built around the elegant aspect ratio 1:2 [12]. Yet, ISO 216 [6] (and its predecessor DIN 476 [11]) specify the actual paper sizes in whole millimetres. Since the nominal side ratio is irrational, this discretization introduces a rounding error. In the standard construction, A0 is approximated first, and each subsequent size is obtained by halving the previous one and rounding down so that two sheets of A(n) can always be cut from one sheet of A(n1) [14]. In this work we quantify the cumulative effect of these roundings by studying a concrete packing problem: how many A10 sheets can be placed, without overlap and with axis-aligned orientation, inside a single sheet of A0?

To formalise this, let us fix integers (L,W):=(1189,841) and (a,b):=(37,26) to be the sizes of the A0 and A10 rectangles in millimetre units. We further define an integer coordinate system where the top-left corner represents (0,0) and the bottom-right corner of the larger A0-sized rectangle represents (L,W).

Definition 1 (Orthogonal placement and packing).

An orthogonal placement is a rectangle R=[x,x+w]×[y,y+h][0,L]×[0,W] where (w,h){(a,b),(b,a)} and x,y (or x,y in the integer-mm model).

A set 𝒫 of orthogonal placements is a non-overlapping orthogonal packing if for any two distinct rectangles R,R𝒫, their interiors are disjoint, i.e., int(R)int(R)= (Equivalently, rectangles may touch at boundaries but may not overlap in area).

Definition 2 (Optimal packing number).

Let OPT(L,W,a,b) be the maximum size of a non-overlapping orthogonal packing of (a×b)-rectangles into an (L×W)-rectangle. In this article, we study OPT:=OPT(1189,841,37,26).

Without much work, we can show some lower and upper bounds for OPT.

Proposition 3 (Trivial bounds).

OPT{1024,,1039}.

Proof.

The lower bound of 1024=210 holds because the paper sizes are designed such that every sheet of A(n) can fit (at least) two sheets of A(n+1) for 0n9 [6]. The upper bound holds by area: OPTArea of A0Area of A10=1189×84137×26=1039.

Our primary goal in this article is proving the exact value of OPT, namely:

Theorem 4 (Main Theorem, computer-assisted).

OPT=1038.

The proof of Theorem 4 will be done in three steps. We will first show that we can assume the integer-mm model without loss of generality. Then we will provide an explicit packing of size 1038, hence proving a lower bound. Finally, we will show an upper bound of 1038 using a computer-assisted argument, concluding the proof.

Lemma 5 (Integer-coordinates without loss of generality).

Consider an orthogonal packing of axis-aligned rectangles of sizes (a×b) and (b×a) inside the container [0,L]×[0,W], where rectangle positions may use arbitrary real coordinates.

Then there exists an orthogonal packing of the same cardinality in which every rectangle has integer coordinates, i.e., each rectangle is of the form [x,x+w]×[y,y+h] with x,y and (w,h){(a,b),(b,a)}.

Proof.

Consider an arbitrary orthogonal packing 𝒫={R1,,Rn} of size n. We first make this packing left-stable by repeatedly selecting any rectangle R𝒫 and translating it leftwards, i.e., decreasing its x-coordinate x(R), as far as possible while keeping the packing non-overlapping and x(R)0. This process terminates at a packing in which every rectangle is either touching the boundary (x(R)=0) or its left side touches the right side of another rectangle.

The resulting left-stable packing is still non-overlapping and has the same size n. Furthermore, every rectangle must either have an x-coordinate of x(R)=0 (on the boundary) or x(R)=x(R)+w(R) where R is a rectangle blocking leftwards movements and w(R) is the width of said rectangle. Since we can form a chain of blocking rectangles from every rectangle to the line x=0 and since w(R) for all rectangles R𝒫, all x(R) must be integer.

We can apply an analogous argument for producing a top-stable packing that will yield integer y-coordinates. Therefore, there exists a feasible packing of the same size whose rectangle coordinates are integers.

2 Lower Bound

Theorem 6 (Lower bound).

OPT1038.

We will prove this by splitting the L×W area into two parts. Part A is 962×841, Part B is 227×841. Combined, these two parts exactly cover the entire (962+227)×841=L×W area. An explicit construction for both parts is depicted in Figure 1.

Figure 1: An arrangement for 1038 A10 in one A0, constructed on a custom website (FORP [7]).
Lemma 7 (Part A).

A (962×841) rectangle can be packed gaplessly with a non-overlapping orthogonal packing of size 841, i.e., OPT(962,W,a,b)=841.

Proof.

Since 1537+1126=841, we tile the height by 15 strips of height 37 and 11 strips of height 26. Each 37-high strip is tiled by 37 upright (26×37) rectangles as 3726=962. Each 26-high strip is tiled by 26 horizontal (37×26) rectangles as 2637=962.

Thus the (962×841) rectangle is tiled gaplessly by 1537+1126=841 rectangles, implying OPT(962,841,a,b)841. Equality follows directly from the lack of gaps.

Lemma 8 (Part B).

A (227×841) rectangle can be packed with a non-overlapping orthogonal packing of size 197, i.e., OPT(227,W,a,b)197.

Proof.

Appendix A lists 197 rectangles by integer coordinates (x0,y0,x1,y1), representing R=[x0,x1]×[y0,y1]. It suffices to check:

  1. (i)

    Correct dimensions: for every listed rectangle, (x1x0,y1y0){(26,37),(37,26)}.

  2. (ii)

    Containment: for every listed rectangle, 0x0<x1227 and 0y0<y1841.

  3. (iii)

    Non-overlap: the rectangles are pairwise interior-disjoint. A fun way to verify this (using integrality of the coordinates) is to count covered unit squares: if we mark every covered 1×1 cell in the 227×841 grid, then disjointness is equivalent to the number of covered cells being exactly the sum of areas, i.e., 1973726.

Therefore the listed rectangles form a non-overlapping orthogonal packing of size 197 in the (227×841) container, proving OPT(227,841,a,b)197. The appendix also contains a short script for verifying these claims mechanically. Combined with Lemma 7, this proves Theorem 6.

This specific packing was constructed and exported using a custom website featuring an interactive visualization and playground we developed for this problem appropriately called Fun Orthogonal Rectangle Packing [7]. The presented arrangements were constructed by hand and by using an existing algorithm developed by Birgin, Lobato and Morabito [4] for smaller subproblems.

3 Upper Bound

Existing techniques for finding upper bounds use a structural approach [15] on a Minimum Size Instance (MSI) [16]. The MSI is a minimal instance preserving the same set of optimal packing arrangements. In this setting, our packing problem can be formulated as the (L,W,a,b)=(1189,841,37,26) instance of the Pallet Loading Problem (PLP).

Our instance is already the MSI, since A0 can be tiled gaplessly by A10s in both width and height: 2337+1326=1189 and 1537+1126=841. The Barnes bound [3] for this instance also yields 1039. Together, both of these facts indicate that this instance does not permit an easy simplification. Therefore, we need to employ more complex computational bounds.

3.1 Structural LP Bounds (that almost work)

Isermann [13] and Nelißen [18] show how we can compute upper bounds by considering a×1 and b×1 strips combined with structural information about all possible feasible partitions of the side lengths, expressed by the following linear program:

F(L,a,b):={(i,j)02ia+jbL,(i,j)(0,0)},
F(W,a,b):={(f,g)02fa+gbW,(f,g)(0,0)}.
max (i,j)F(L,a,b)ibxij+(f,g)F(W,a,b)fbyfg
s.t. (i,j)F(L,a,b)xijW,(f,g)F(W,a,b)yfgL,
a(i,j)F(L,a,b)ixijb(f,g)F(W,a,b)gyfg=0,
b(i,j)F(L,a,b)jxija(f,g)F(W,a,b)fyfg=0,
xij0(i,j)F(L,a,b),yfg0(f,g)F(W,a,b).

We formulated and ran this linear program using the Gurobi LP solver, which computed an optimum of 1039.0254329004. This structural bound does not disprove 1039, but is close enough to yield hope that some clever tweaks might drop this bound below 1039. Unfortunately, we did not manage to improve this bound, even when employing more advanced constraints suggested by Nelißen [18] and Letchford [15]. This supports the earlier claim that our specific instance of the PLP does not permit a simple proof of optimality.

3.2 Weighing Bounds (a.k.a. dual witnesses)

The aforementioned structural bounds can be expressed in a simpler way by reformulating them as weightmap-bounds. The idea is to find a weightmap w(x,y) which maps every 1×1 square on the A0-sized lattice to a non-negative real value. If we construct a weightmap such that for every possible rectangle placement the sum over that rectangle is 1, the total sum over all weights is then an upper bound for the optimal packing size.

We formalize this by defining the set of all integer placements:

horizontal ={(x,y,a,b)0xLa, 0yWb},
vertical ={(x,y,b,a)0xLb, 0yWa},
=horizontalvertical.
Lemma 9 (Weight-map upper bound).

Let w:{0,,L1}×{0,,W1}0. Assume that every placement (x0,y0,w,h) satisfies

x=x0x0+w1y=y0y0+h1w(x,y) 1.

Then the size of any non-overlapping orthogonal packing is at most

OPT(L,W,a,b)T:=x=0L1y=0W1w(x,y).

Proof.

Let 𝒫 be any non-overlapping orthogonal packing. By assumption, every rectangle in 𝒫 covers a weight of at least 1. Since rectangles in 𝒫 are interior-disjoint, the total weight covered by all rectangles is at most the total weight T of the container. Hence |𝒫|T.

Corollary 10 (Scaled integer certificate).

Let S1 and let w:{0,,L1}×{0,,W1}0. If every placement in has weight at least S and x,yw(x,y)<1039S, then OPT1038.

Proof.

Apply Lemma 9 to the scaled weightmap w/S.

The space of all weightmaps is quite large (there are approximately 1 million variable weights and approximately 2 million possible rectangle placements) and hence computationally expensive to optimize for directly. If we restrict the weightmaps to specific (easier to compute) forms, we can recover some structural bounds.

Refer to caption

Figure 2: The optimal weightmap under restriction w(x,y)=ax+by.

For example, restricting to weightmaps of the form w(x,y)=ax+by severely limits the space of free variables to only L+W=2030. Optimizing over this restricted family yields the familiar value 1039.0254329004 (Figure 2), i.e., the same bound as the structural LP. We tried several more restricted weightmaps (periodic tilings, diagonal striping patterns, extra border variables and combinations), but all either produced a worse upper bound or collapsed to the striping pattern. This raised the fear that the optimal value of any weightmap approach might not lie below 1039, which would invalidate this proof approach.

We therefore solve the general weightmap LP. To do so efficiently, we use a prefix-sum reformulation that dramatically reduces the number of nonzero constraint coefficients. We introduce variables Fx,y0 for x{1,,L} and y{1,,W} with boundary convention F0,y=Fx,0=0, and solve:

min FL,W
s.t. Fx,yFx1,yFx,y1+Fx1,y1 0x{1,,L}y{1,,W},
Fx+w,y+hFx,y+hFx+w,y+Fx,y 1(x,y,w,h),
Fx,y0x{1,,L}y{1,,W}.

This reformulation uses prefix sums over the weights instead of variables for each weight; the individual weights can be reconstructed trivially.

We computed the optimum of this LP using Gurobi (PDHG method). We ran the instance on the Euler Cluster [5]. The computed optimum value is 1038.7291940779483. Since this is an upper bound, this indicates that an orthogonal packing of size 1038 is optimal, but needs to be verified in exact arithmetic to avoid floating-point inaccuracies.

Refer to caption

Figure 3: The (unrounded) optimal weightmap found through the prefix-LP.
Theorem 11 (Upper bound, computer-assisted).

There exists an integer weightmap w:{0,,L1}×{0,,W1}0 with scale S=106 such that:

  1. (i)

    every placement in has total weight at least S,

  2. (ii)

    x,yw(x,y)<1039S.

Consequently, OPT1038.

Proof.

We take an optimal floating-point-valued weightmap from the LP above, multiply it by 106 and round to integers. Using numerically exact integer addition, we computed a minimum rectangle-sum of Σmin=1,000,000 and a total sum of Σtotal=1,038,768,234. Thus condition (i) holds (since ΣminS) and condition (ii) holds (since Σtotal<1039S). The claim OPT1038 follows from Corollary 10.

The proof argument used might be considered useful for applications of the PLP, which has many real-world applications, especially in logistics [20], but the general approach of using a weightmap as an upper bound is not entirely novel [15].

3.3 Verifier

The rounded weights are available on the GitHub page [9]. The following script verifies the conditions of Theorem 11 using exact integer arithmetic:

import numpy as np
weights = np.load("upper-bound/weights/rounded-weights.npy")
assert weights.shape == (1189, 841) and weights.dtype == np.int64
assert weights.min() >= 0
assert weights.sum() < 1039_000_000
# prefix-sum matrix over large rectangle
S = np.zeros((weights.shape[0] + 1, weights.shape[1] + 1), dtype=np.int64)
S[1:, 1:] = weights.cumsum(axis=0).cumsum(axis=1)
def all_rect_sums_at_least(w, h, threshold):
# returns all sums for (w, h) windows as a 2d array
sums = S[w:, h:] - S[:-w, h:] - S[w:, :-h] + S[:-w, :-h]
return sums.min() >= threshold
assert all_rect_sums_at_least(26, 37, 1_000_000) # horizontal
assert all_rect_sums_at_least(37, 26, 1_000_000) # vertical

4 Good-looking weightmaps

The proof technique of generating minimal weightmaps can be applied to other instances of the PLP. By colouring these weightmaps according to their values, we get some good-looking pictures. Figure 4 shows a grid of all computed optimal weightmaps for instances (64,64,a,b) with 1a,b10. The colourmap between weightmaps is not synchronized; a tone of yellow (indicating the highest weight value across a given weightmap) must not always indicate the same weight value as the same tone in another weightmap.

These weights were computed via Gurobi within a numerical precision of 109. The code used to generate these and other weightmaps can be found in the GitHub repository [9]. Because these pictures look nice and display a surprising number of patterns and complexity, we also present these in a digital art gallery, appropriately called the Gallery of Papel [8]. The Gallery showcases all optimal weightmaps of instances of the form (S,S,a,b) with 64Sab1, hence containing a total number of S=164a=1Sa=S=164S(S+1)2=45760 weightmaps.

Figure 4: Grid of optimal weightmaps of family of instances (64,64,a,b).

5 Related Work

The PLP, also known as the manufacturer’s pallet loading problem, has been studied extensively; see, e.g., the survey by Silva–Oliveira–Wäscher [19]. Widely used computational benchmarks are given by the Cover I and Cover II instance sets, which contain representatives of equivalence classes with area ratio (LW)/(ab)<51 and 51(LW)/(ab)<101 respectively [2, 4]. For these datasets, Birgin–Lobato–Morabito report that their combined recursive partitioning approach finds optimal solutions for all Cover I and II instances [4]. Heuristic methods have also been evaluated on these sets and achieve good performance in practice [2].

Our A0/A10 instance has a much larger area ratio, (1189841)/(3726)1039.4 and is therefore outside the classical benchmark regime. The natural 0–1 formulations for PLP scale with the number of feasible placements (and with the number of unit cells in a discretized model), which can become extremely large for instances with small items [1]. In our case, even in the integer-millimetre model there are on the order of millions of candidate placements, making direct exact optimization approaches impractical.

Direct upper bounds for PLP have also received significant attention. In particular, Nelißen [18] and Letchford–Amaral [15] study structural LP bounds and related dominance relationships between bounds. We implemented these structural bounds for our instance. Unfortunately, they did not yield an upper bound below 1039. To our knowledge, the specific ISO 216-motivated instance (L,W,a,b)=(1189,841,37,26) has not previously been studied.

6 Open Questions

While A0 and A10 arguably pose the most interesting packing problem inside the A series of paper sizes (as they have the largest difference), one can ask the same question for A(n) and A(m) for 10nm0.

Table 1: Remaining A series optimal orthogonal packing results.
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
A0 =1 =2 =4 =8 =16 =32 =64 =128 =258 516x1518 =1038
A1 =1 =2 =4 =8 =16 =32 =64 =129 258x2259 518x3519
A2 =1 =2 =4 =8 =16 =32 =64 =128 =258
A3 =1 =2 =4 =8 =16 =32 =64 =129
A4 =1 =2 =4 =8 =16 =32 =64
A5 =1 =2 =4 =8 =16 =32
A6 =1 =2 =4 =8 =16
A7 =1 =2 =4 =8
A8 =1 =2 =4
A9 =1 =2
A10 =1

We computed solutions to many of these instances and proved optimality in most of these cases using the algorithm presented by Birgin, Lobato and Morabito [4]. This solved all instances except A10 in A0, A9 in A0, A10 in A1 and A9 in A1. For these instances, we computed a simple upper bound using the area bound of the Minimum Size Instance [16] and found good arrangements by hand to prove the lower bounds. Details for these bounds can be found on the GitHub [9]. Naturally, these bounds could be tightened by computing bounds like we presented for A0 and A10. The computed bounds can be seen in Table 1, blue entries correspond to results where the optimum is not a power of two and are thus, in some sense, surprising.

Another question of interest could be the limits of the weightmap proof method. Does there exist an instance (L,W,a,b) of the PLP where the optimal weight does not correspond to the size of an optimal orthogonal packing? We have searched through many smaller instances by computing the optimal weightmaps but have not found a counterexample. The largest difference between the optimal packing size and total weight we were able to find was at instance (50,50,5,4), where the optimal packing has size 124, but the computed optimal weightmap has a weight-sum of 124.8. Since the large weight-finding LP is dual to the relaxed direct packing-LP [15], they share a common optimal value under strong duality. Hence, this is equivalent to asking whether the LP-relaxation of the packing-LP ever causes a difference 1 in optimal value compared to the packing-ILP.

Lastly, Theorem 4 is a statement about orthogonal packings. It seems unlikely that allowing non-90 rotations would make a packing of size 1039 possible, but isn’t ruled out in this article. The grid-based argument used in our upper bound doesn’t seem to align with a non-orthogonal setting.

References

  • [1] Ramón Alvarez-Valdés, Francisco Parreño, and José Manuel Tamarit. A branch-and-cut algorithm for the pallet loading problem. Computers & Operations Research, 32(11):3007–3029, 2005. doi:10.1016/j.cor.2004.04.010.
  • [2] Ramón Alvarez-Valdés, Francisco Parreño, and José Manuel Tamarit. A tabu search algorithm for the pallet loading problem. Or Spectrum, 27(1):43–61, 2005. doi:10.1007/s00291-004-0183-5.
  • [3] Frank W. Barnes. Packing the maximum number of m × n tiles in a large p × q rectangle. Discret. Math., 26(2):93–100, 1979. doi:10.1016/0012-365X(79)90115-8.
  • [4] E. G. Birgin, R. D. Lobato, and R. Morabito. An effective recursive partitioning approach for the packing of identical rectangles in a rectangle. The Journal of the Operational Research Society, 61(2):306–320, 2010. doi:10.1057/jors.2008.141.
  • [5] ETH Zurich. Euler: High-performance computing cluster, 2024. Scientific IT Services, ETH Zurich. URL: https://scicomp.ethz.ch/wiki/Euler.
  • [6] International Organization for Standardization. ISO 216:2007 – writing paper and certain classes of printed matter – trimmed sizes – a and b series, and indication of machine direction, 2007.
  • [7] Noel Friedrich. Fun Orthonogal Rectangle Packing. https://noel-friedrich.de/forp, 2025. [Accessed 16-12-2025].
  • [8] Noel Friedrich. Gallery of papel. https://noel-friedrich.de/papel, 2025. [Accessed 03-01-2026].
  • [9] Noel Friedrich. Github repository containing material and code relating to the project. https://github.com/noel-friedrich/paper-packing, 2025. [Accessed 03-01-2026].
  • [10] Noel Friedrich. A4 paper is annoying (I have proof), 2026. YouTube video explaining core concepts from this paper. URL: https://www.youtube.com/watch?v=zDKBCIMkDbw.
  • [11] Deutsches Institut für Normung. DIN 476: Papierformate, 1976.
  • [12] M. Helbig and W. Hennig. DIN-Format A 4: e. Erfolgssystem in Gefahr. Beuth-Kommentare. Beuth, 1988. URL: https://books.google.ch/books?id=Eo9tAAAACAAJ.
  • [13] Heinz Isermann. Obere Schranken für die Lösung des zweidimensionalen Packproblems auf der Basis struktureller Identitäten, pages 341–348. Springer Berlin Heidelberg, Berlin, Heidelberg, 1991. doi:10.1007/978-3-642-76537-7_22.
  • [14] Markus Kuhn. International standard paper sizes, 2025. Created 1996-10-29; last modified 2025-12-08. URL: https://www.cl.cam.ac.uk/˜mgk25/iso-paper.html.
  • [15] Adam N. Letchford and André Renato Sales Amaral. Analysis of upper bounds for the pallet loading problem. Eur. J. Oper. Res., 132(3):582–593, 2001. doi:10.1016/S0377-2217(00)00163-6.
  • [16] Gustavo H. A. Martins and Robert F. Dell. The minimum size instance of a pallet loading problem equivalence class. Eur. J. Oper. Res., 179(1):17–26, 2007. doi:10.1016/j.ejor.2006.03.009.
  • [17] Neenah Paper. International paper sizes and dimensions. Paper 101 (states that A4 is the most common international letterhead size). URL: https://www.neenahpaper.com/resources/paper-101/international-sizes.
  • [18] Josef Nelißen. How to use structural constraints to compute an upper bound for the pallet loading problem. European Journal of Operational Research, 84(3):662–680, 1995. Cutting and Packing. doi:10.1016/0377-2217(95)00030-T.
  • [19] Elsa Silva, José F Oliveira, and Gerhard Wäscher. The pallet loading problem: a review of solution methods and computational experiments. International Transactions in Operational Research, 23(1-2):147–172, 2016. doi:10.1111/itor.12099.
  • [20] Saúl Vargas-Osorio and Catya Zúñiga. A literature review on the pallet loading problem. Lámpsakos, pages 69–80, 2016. doi:10.21501/21454086.1790.

Appendix A Appendix

Lower Bound Part B Placement Certificate

Each line contains integers (x0,y0,x1,y1) encoding the rectangle [x0,x1]×[y0,y1]. All rectangles have (x1x0,y1y0){(26,37),(37,26)}.

% x0 y0 x1 y178 0 115 26115 0 152 26152 0 189 26189 0 226 2678 26 115 52115 26 152 52152 26 189 52189 26 226 5278 52 115 78115 52 152 78152 52 189 78189 52 226 7878 78 115 104115 78 152 104152 78 189 104189 78 226 104189 104 226 130189 130 226 156189 156 226 182189 182 226 208189 208 226 234189 234 226 260189 260 226 286200 286 226 323200 323 226 360200 360 226 397200 397 226 434200 434 226 471200 471 226 508200 508 226 545200 545 226 582200 582 226 619200 619 226 656200 656 226 693200 693 226 730200 730 226 767200 767 226 804200 804 226 841111 104 137 141137 104 163 141163 104 189 141111 141 137 178137 141 163 178163 141 189 178111 178 137 215137 178 163 215163 178 189 215111 215 137 252137 215 163 252163 215 189 252111 252 137 289137 252 163 289163 252 189 289163 289 200 315163 315 200 341163 341 200 367163 367 200 393163 393 200 419163 419 200 445163 445 200 471174 471 200 508174 508 200 545174 545 200 582174 582 200 619174 619 200 656174 656 200 693174 693 200 730174 730 200 767174 767 200 804174 804 200 841111 289 137 326137 289 163 326111 326 137 363137 326 163 363111 363 137 400137 363 163 400111 400 137 437137 400 163 437111 437 137 474137 437 163 474137 474 174 500137 500 174 526137 526 174 552137 552 174 578137 578 174 604137 604 174 630137 630 174 656148 656 174 693148 693 174 730148 730 174 767148 767 174 804148 804 174 841111 474 137 511111 511 137 548111 548 137 585111 585 137 622111 622 137 659111 659 148 685111 685 148 711111 711 148 737111 737 148 763111 763 148 789111 789 148 815111 815 148 8410 0 26 3726 0 52 3752 0 78 370 37 26 7426 37 52 7452 37 78 740 74 26 11126 74 52 11152 74 78 1110 111 37 13737 111 74 13774 111 111 1370 137 37 16337 137 74 16374 137 111 1630 163 37 18937 163 74 18974 163 111 1890 189 37 21537 189 74 21574 189 111 2150 215 37 24137 215 74 24174 215 111 2410 241 37 26737 241 74 26774 241 111 2670 267 37 29337 267 74 29374 267 111 2930 293 37 31937 293 74 31974 293 111 3190 319 37 34537 319 74 34574 319 111 3450 345 37 37137 345 74 37174 345 111 3710 371 37 39737 371 74 39774 371 111 3970 397 37 42337 397 74 42374 397 111 4230 423 37 44937 423 74 44974 423 111 4490 449 37 47537 449 74 47574 449 111 4750 475 37 50137 475 74 50174 475 111 5010 501 37 52737 501 74 52774 501 111 5270 527 37 55337 527 74 55374 527 111 5530 553 37 57937 553 74 57974 553 111 5790 579 37 60537 579 74 60574 579 111 6050 605 37 63137 605 74 63174 605 111 6310 631 37 65737 631 74 65774 631 111 6570 657 37 68337 657 74 68374 657 111 6830 683 37 70937 683 74 70974 683 111 7090 709 37 73537 709 74 73574 709 111 7350 735 37 76137 735 74 76174 735 111 7610 761 37 78737 761 74 78774 761 111 7870 787 37 81337 787 74 81374 787 111 8130 813 37 83937 813 74 83974 813 111 839

These coordinates can be verified using the following concise python script:

import numpy as np
rects = np.loadtxt("rect_positions.txt", dtype=int)
assert rects.shape == (197, 4)
# check correct dimensions
for x0, y0, x1, y1 in rects:
assert (x1 - x0, y1 - y0) in {(26, 37), (37, 26)}
# check containment
assert rects[:, 0].min() >= 0 and rects[:, 2].max() <= 227
assert rects[:, 1].min() >= 0 and rects[:, 3].max() <= 841
# check disjointness by checking covering map
covered_map = np.zeros((227, 841))
for x0, y0, x1, y1 in rects:
covered_map[x0:x1, y0:y1] += 1
assert covered_map.max() <= 1
Table 2: ISO 216 A-series paper sizes in millimetres.
Name Width (mm) Height (mm) Nominal Width (mm) Nominal Height (mm)
A0 841 1189 840.89641525… 1189.2071150…
A1 594 841 594.60355750… 840.89641525…
A2 420 594 420.44820762… 594.60355750…
A3 297 420 297.30177875… 420.44820762…
A4 210 297 210.22410381… 297.30177875…
A5 148 210 148.65088937… 210.22410381…
A6 105 148 105.11205190… 148.65088937…
A7 74 105 74.325444687… 105.11205190…
A8 52 74 52.556025953… 74.325444687…
A9 37 52 37.162722343… 52.556025953…
A10 26 37 26.278012976… 37.162722343…