%% ------------------------------------------------------------------------
%% Supplementary Information for the IJDAR submission.
%%
%% Built as a separate PDF and uploaded as Electronic Supplementary
%% Material. The file is named ESM_1.tex, and so builds to ESM_1.pdf,
%% because that is the name Springer's ESM instructions ask for; the text
%% calls it "Online Resource 1" for the same reason. It holds Appendices A-F, which were in the manuscript until the
%% editor asked (2026-09-05) for 20 pages; see LENGTH_CUT_PLAN.md.
%%
%% The appendices reference body sections (\ref{sec:coverage} and friends),
%% so xr imports main_sn.aux and the numbers come out matching the
%% manuscript. Build main_sn.tex FIRST, or every such reference renders as
%% ??. make_springer_submission.py enforces the order.
%%
%% No `referee' option here: the double spacing exists to give reviewers
%% margin room inside the page limit, and supplementary material is neither
%% page-limited nor typeset by Springer.
%%
%% Compile under XeLaTeX, as with main_sn.tex.
%% ------------------------------------------------------------------------
\documentclass[sn-basic,Numbered,iicol,pdflatex]{sn-jnl}

\usepackage{graphicx}%
\usepackage{multirow}%
\usepackage{amsmath,amssymb,amsfonts}%
\usepackage{amsthm}%
\usepackage{mathrsfs}%
\usepackage[title]{appendix}%
\usepackage{xcolor}%
\usepackage{textcomp}%
\usepackage{manyfoot}%
\usepackage{booktabs}%
\usepackage{listings}%
\usepackage[ruled,vlined]{algorithm2e}%
\usepackage{xr}%
%% [][nocite] tells xr to import main_sn.aux's \newlabel entries but not its
%% \bibcite ones (xr.sty v6.00 lines 62--67). Without it both documents
%% define the same citation keys and natbib warns "multiply defined": this
%% document has its own bibliography, and its numbers must be its own.
\externaldocument[][nocite]{main_sn}%

% --- Tamil ----------------------------------------------------------------
\usepackage{iftex}
\ifXeTeX
  \usepackage{fontspec}
  \newfontfamily\tamilfont{Noto Sans Tamil}[Script=Tamil, Scale=0.95]
  \newcommand{\ta}[1]{{\tamilfont #1}}
\else
  \newcommand{\ta}[1]{\textbf{[Tamil requires XeLaTeX --- see TAMIL.md]}}
\fi

% --- Macros ---------------------------------------------------------------
\newcommand{\corpus}{TamilSynth}
\newcommand{\model}{\texttt{tam\_v3}}
\newcommand{\stockmodel}{\texttt{tam}}

%% Counterparts of the manuscript's macros: here the appendices are present,
%% so these resolve for real and the second argument is ignored.
\newcommand{\appsec}[2]{Appendix~\ref{#1}}
\newcommand{\apptab}[2]{Table~\ref{#1}}
\newcommand{\appfig}[2]{Fig.~\ref{#1}}

\raggedbottom
\emergencystretch=3em

%% Springer's ESM instructions ask that each supplementary file carry the
%% article title, journal name, author name, affiliation and corresponding
%% e-mail inside it. Title, author, affiliation and e-mail come from the
%% front matter below; the journal name goes in the abstract, which is the
%% only prose the class prints before the appendices.
\title[Supplementary Information: \corpus]{Supplementary Information for
\corpus: A Synthetic Line Corpus for Tamil OCR and the Three Defaults That
Decide Whether It Helps}

\author*[1]{\fnm{SyedKhaleel} \sur{Jageer}}\email{jskcse4@gmail.com}
\affil[1]{\orgname{Independent Researcher}, \orgaddress{\country{India}}}

\abstract{Online Resource 1, supporting material for the above manuscript
submitted to the \emph{International Journal on Document Analysis and
Recognition} (IJDAR): the typeface inventory, the
generation procedure, the corpus-hygiene analysis, the rare-unit tail, the
reproduction recipe, and the datasheet for \corpus. Section and table numbers
prefixed with a letter belong to this document; unprefixed numbers refer to
the manuscript.}

\keywords{Optical character recognition, Tamil, Synthetic training data,
Tesseract, Indic scripts, Grapheme clusters}

\begin{document}

\maketitle

\begin{appendices}
%% <<< inlined from sections/appendices.tex
\section{Typeface Inventory}
\label{app:fonts}
%% <<< inlined from tables/fonts.tex
% generated by experiments/font_audit.py -- do not edit
\begin{table*}[t]
\centering\small
\begin{tabular}{llll}
\toprule
File & Family & Designer / foundry & Licence \\
\midrule
Aazhi & Aazhi & Chalkpiece Foundation & proprietary/unstated \\
AnekTamil & Anek Tamil Medium & Aadarsh Rajan (Tamil), Yesha Gosha & OFL 1.1 \\
Arima & Arima Thin & Joana Correia and Natanael Gama & OFL 1.1 \\
Catamaran & Catamaran Thin & Pria Ravichandran & OFL 1.1 \\
Gnani & Gnani & Gnani Sankaran & proprietary/unstated \\
Hemalatha & Bharathi 25 Hemalatha & Chalkpiece Foundation & proprietary/unstated \\
HindMadurai & Hind Madurai & Jyotish Sonowal & OFL 1.1 \\
Indumathi & Bharathi 11 Indumathi & Chalkpiece Foundation & proprietary/unstated \\
Kalayarasi & Bharathi 09 Kalayarasi & Chalkpiece Foundation & proprietary/unstated \\
Kavivanar & Kavivanar & Tharique Azeez & OFL 1.1 \\
Korkai & Korkai & Muthu Nedumaran, Ranjith Roozo, Pr & OFL 1.1 \\
MuktaMalar & Mukta Malar & Aadarsh Rajan, Girish Dalvi, Yasho & OFL 1.1 \\
Pavanam & Pavanam & Tharique Azeez & OFL 1.1 \\
Siva\_01 & Siva 01 & Chalkpiece Foundation & TVA (order no.) \\
Siva\_02 & Siva 02 & Perumalraj D 8220471077 & proprietary/unstated \\
Sudeeptha & Bharathi 02 Sudeeptha & Chalkpiece Foundation & proprietary/unstated \\
Sundaram\_0810 & SUNDARAM-0810 & -- & proprietary/unstated \\
TAU-Barathi & TAU-Barathi & -- & proprietary/unstated \\
TAU-Ezhil & TAU-Ezhil & N.S.Nana (naanaas@gmail.com) & TVA (order no.) \\
TAU-Kabilar & TAU-Kabilar & -- & proprietary/unstated \\
TAU-Kambar & TAU-Kambar & -- & proprietary/unstated \\
TAU-Malar & TAU-Malar & N.S.Nana  (Narayanan) & TVA (order no.) \\
TAU-Marutham & TAU-Marutham & N.S.Nana (naanaas@gmail.com) & TVA (order no.) \\
TAU-Mullai & TAU-Mullai & N.S.Nana (naanaas@gmail.com) & TVA (order no.) \\
TAU-Neythal & TAU-Neythal & N.S.Nana  (naanaas@gmail.com) & TVA (order no.) \\
TAU-Nilavu & TAU-Nilavu & N.S.Nana (naanaas@gmail.com) & TVA (order no.) \\
TAU-Valluvar & TAU-Valluvar & -- & proprietary/unstated \\
TiroTamil & Tiro Tamil & Tamil: Fernando Mello \& Fiona Ross & OFL 1.1 \\
Yogeshwaran & Bharathi 07 Yogeshwaran & Chalkpiece Foundation & proprietary/unstated \\
\bottomrule
\end{tabular}
\caption{The 29 typefaces used to render \corpus. All 29 carry GSUB tables and cover every Tamil codepoint appearing in the corpus; rendering used HarfBuzz shaping via Raqm.}
\label{tab:fonts}
\end{table*}
%% >>> end tables/fonts.tex

All 29 typefaces carry GSUB tables, and rendering used HarfBuzz shaping via
Raqm so conjunct formation and vowel-sign reordering are applied. Coverage is
not quite universal: one face lacks \ta{ஶ} (U+0BB6), and the typeface set as a
whole omits a handful of typographic marks. Lines containing any character not
covered by \emph{every} typeface are excluded during corpus construction
(\S\ref{sec:corpus}), so no rendered image can disagree with its
transcription regardless of which face a line is assigned.

\section{Generation Procedure}
\label{app:alg}

\begin{algorithm}[h]
\caption{Corpus generation}
\label{alg:pipeline}
\KwIn{Text sources $S$, font set $F$ ($|F| = 29$)}
\KwOut{Line images with transcriptions}
$T_0 \gets \textsc{Repair}(\textsc{Merge}(S))$\;
$T \gets \textsc{ParagraphLayout}(T_0)$\;
\ForEach{page $p$ of 50 lines from $T$}{
  \ForEach{line $\ell_i \in p$}{
    render $\ell_i$ with font $F[i \bmod |F|]$\;
  }
  $I \gets$ rasterise $p$ at 300\,dpi\;
  $B \gets \textsc{MergeBands}(\textsc{ProjectionProfile}(I))$\;
  \lIf{$|B| \neq |p|$}{discard $p$}
  \ForEach{band $b_j \in B$}{
    emit crop $I[b_j]$ with sampled fill\;
    pair it with transcription $\ell_j$\;
  }
}
\end{algorithm}


\section{Corpus Hygiene}
\label{app:hygiene}

Tesseract's \texttt{unicharset\_extractor} rejected 123 of the 218{,}125
lines with \texttt{Invalid start of grapheme sequence}. Every code point in
them is valid Tamil; the \emph{sequences} are not. Across the sources,
146 words in 2{,}418{,}180 (0.006\%) place a vowel sign or pulli where Tamil
permits no mark.

Three quarters of these have one cause. In the 8-bit Tamil encodings the
source sites were typeset in before Unicode --- Bamini, TAB, TSCII --- the
glyph for the consonant \ta{ர} sits at the code point Unicode assigns to the
vowel sign \ta{ா}. A naive converter therefore emits \ta{ா}\,\ta{்} wherever
the text said \ta{ர}\,\ta{்}: \ta{தலைவா்} for \ta{தலைவர்}, \ta{தோ்தல்} for
\ta{தேர்தல்}. The two render almost identically, which is why the defect
survives proofreading, and why the newspaper source carries the highest rate
of the five (0.017\% of words against Wikisource's 0.006\%).

The repair is mechanical and, importantly, cannot damage correct text: every
pattern it matches is illegal Tamil. Applied to all 2{,}418{,}180 words it
changes 103 and leaves the rest byte-identical. What it cannot mend is a word
whose base consonant is simply absent --- \ta{்ளனர்}, \ta{ாநாட்டின்}, which
is what a scraper produces when it breaks a word across a page boundary
mid-grapheme --- and those 43 words' lines are dropped, giving 218{,}082
lines on a rebuild.

The repair postdates the released corpus, and the released corpus is the one
the released model was trained on, so we ship it unchanged with the 123
affected lines listed by identifier rather than silently removing them. At
0.056\% they are disclosed label noise; deleting them would leave the
published corpus no longer the corpus that produced the published model,
which is the worse property for a resource.


\section{The Rare-Unit Tail}
\label{app:tail}

Coverage alone overstates how well the tail is served. Because fonts are
assigned round-robin, a unit occurring $k$ times is rendered in at most
$\min(k, 29)$ typefaces. A unit seen fewer than 29 times therefore cannot be
presented in every typeface the recogniser will meet at inference, no matter
how large the corpus grows.

%% <<< inlined from tables/coverage.tex
% generated by experiments/corpus_stats.py -- do not edit
\begin{table}[t]
\centering\small
\begin{tabular}{lr}
\toprule
Occurrences in the corpus & Units \\
\midrule
never occur & 20 \\
1--28 (cannot appear in every font) & 17 \\
29--289 ($<10$ exemplars per font) & 14 \\
290 or more & 196 \\
\bottomrule
\end{tabular}
\caption{Training exposure of the 247 syllabary units. Under round-robin
assignment a unit occurring $k$ times is rendered in at most
$\min(k, 29)$ typefaces, so units below that threshold
cannot be shown in every font regardless of corpus size. The
17 units in the middle tier account for only
0.0014\% of syllabary occurrences:
\ta{ஞோ}~(1)  \ta{ளௌ}~(1)  \ta{ஞே}~(2)  \ta{நௌ}~(2)  \ta{ஙொ}~(3)  \ta{டௌ}~(4)  \ta{யௌ}~(4)  \ta{ழொ}~(5)  \ta{னௌ}~(5)  \ta{லௌ}~(6)  \ta{வௌ}~(8)  \ta{ழூ}~(12)  \ta{ஔ}~(13)  \ta{ழோ}~(17)  \ta{தௌ}~(18)  \ta{ரௌ}~(21)  \ta{ழெ}~(23).}
\label{tab:coverage}
\end{table}
%% >>> end tables/coverage.tex

Seventeen units fall in that band, several appearing once or twice in 13.4M
graphemes (\ta{ஞோ}, \ta{ளௌ} occur exactly once each). Together they are
0.0014\% of syllabary occurrences, so they contribute almost nothing to
aggregate error rate --- but a recogniser trained on this corpus has
effectively not been taught them, and per-unit error on the tail will be
close to chance. This is a property of sampling natural text at any scale,
not of this corpus in particular; the remedy is targeted synthesis of lines
containing rare units, which we leave to future work
(\S\ref{sec:limitations}).

\begin{figure}[t]
\centering
\includegraphics[width=\linewidth]{grapheme_freq.pdf}
\caption{Grapheme rank--frequency in \corpus. The distribution is
Zipf-like over four orders of magnitude, which is what bounds the tail: the
corpus can be enlarged without improving exposure of the rarest syllabary
units, because their frequency scales with it.}
\label{fig:freq}
\end{figure}


\section{Reproducing the Result}
\label{app:repro}

\begin{verbatim}
regenerate_corpus.py --seed 0
prepare_lstmf.py --gt-dir gt --jobs 10

make training \
  MODEL_NAME=tam_v3 \
  START_MODEL=tam \
  LANG_TYPE=Indic \
  GROUND_TRUTH_DIR=$PWD/gt \
  MAX_ITERATIONS=100000

build_dawgs.py \
  --checkpoint <run>/tam_v3_1400.ckpt \
  --traineddata <run>/tam_v3.traineddata \
  --out model/tam_v3.traineddata

# defaults arm, same corpus
prepare_lstmf.py --gt-dir gt_unset \
  --jobs 10 --lang-type ""
make training \
  MODEL_NAME=tam_unset \
  START_MODEL=tam \
  GROUND_TRUTH_DIR=$PWD/gt_unset \
  MAX_ITERATIONS=100000 \
  LANG_TYPE=

make_testset.py predict \
  --pred_dir preds --model tam_v3
tamil_ocr_eval.py \
  --gt_dir testset/gt --pred_dir preds \
  --bootstrap 2000
\end{verbatim}

\noindent \texttt{LANG\_TYPE=Indic} must appear on the \texttt{make} line
and not only in \texttt{prepare\_lstmf.py}: the box-generator half is applied
during ground-truth preparation, but the \texttt{-{}-pass\_through\_recoder}
half is applied by \texttt{combine\_lang\_model} inside the Makefile.
Verify with \texttt{combine\_tessdata -l} that the result carries
\texttt{null\_char=2} rather than a rebuilt value.

% =========================================================================
% Moved out of \S\ref{sec:results} for the editor's 20-page limit
% (2026-09-05). Both are diagnostic: the table is explicitly not comparable
% with the headline table, and every number in the figure is stated in the
% prose that cites it.
% =========================================================================
\section{Diagnostic Tables and Figures}
\label{app:diag}

\begin{table}[t]
\centering\small
\begin{tabular}{lr}
\toprule
Configuration & CER \\
\midrule
Stock Tesseract \stockmodel & 8.87\% \\
\midrule
\texttt{LANG\_TYPE} unset, best checkpoint & 12.01\% \\
\texttt{LANG\_TYPE} unset, exported & 13.52\% \\
\texttt{LANG\_TYPE}=\texttt{Indic}, exported & 12.23\% \\
\texttt{LANG\_TYPE}=\texttt{Indic}, best checkpoint & \textbf{8.09\%} \\
\bottomrule
\end{tabular}
\caption{\emph{Diagnostic, all 300 test lines.} Grapheme CER, no dictionary
in any configuration. ``Best checkpoint'' is the minimum over the swept
checkpoints of that run and is reported here for diagnosis only; the
model selection that produces Table~\ref{tab:main} uses the selection split.
Diagnostic sweeps are reported over all 300 lines; every headline number is
computed on the 202-line reporting split, so figures in this table are not
directly comparable with those in Table~\ref{tab:main}.}
\label{tab:defaults}
\end{table}

\begin{figure}[t]
\centering
\includegraphics[width=\linewidth]{crop_fill.pdf}
\caption{Grapheme CER by crop fill quartile over all 300 lines. The
overtrained checkpoint is worse than stock in every quartile and much worse
on sparse crops, where it fills empty space with invented text. The released
model is at or below stock everywhere. This is the defect that motivated
paragraph-aware layout (\S\ref{sec:layout}).}
\label{fig:cropfill}
\end{figure}

\begin{table}[t]
\centering\small
\begin{tabular}{ll}
\toprule
Start model & \stockmodel{} 5.5.0 (float) \\
\texttt{LANG\_TYPE} & \texttt{Indic} \\
Learning rate & $1 \times 10^{-4}$ \\
Train / held-out & 196{,}311 / 21{,}812 \\
Iteration cap & 100{,}000 \\
Released checkpoint & 1{,}400 \\
Hardware & i7-1355U, 12 threads \\
Corpus generation & 804\,s (13.4\,min) \\
Fine-tuning to cap & 8.1\,h \\
\bottomrule
\end{tabular}
\caption{Fine-tuning configuration for the released model, which is the
checkpoint at 1{,}400 training iterations (1{,}059 weight updates). All
times are wall-clock on the machine named here. All work
ran on one laptop CPU with 14\,GB of memory. The complete training log and
all 77 intermediate checkpoints are released with the pipeline.}
\label{tab:training}
\end{table}

\begin{table}[t]
\centering\small
\begin{tabular}{lccc}
\toprule
Batch & Lines & Graph. & Word \\
\midrule
Selection split & 60 & 0.75 & 3.63 \\
Reporting split & 40 & 1.48 & 5.09 \\
\midrule
Combined & 100 & 1.04 & 4.20 \\
\quad less one two-line crop & \phantom{0}98 & 0.77 & 3.94 \\
\bottomrule
\end{tabular}
\caption{Double-entry disagreement, percent, over a third of the test set.
80 of the 100 lines are in exact agreement. A single crop spanning two
printed lines carries the whole difference between the two batches: without
it they agree to 0.77\% and 0.78\%.}
\label{tab:floor}
\end{table}

\begin{table}[t]
\centering
\caption{Reporting split by capture condition; percentages. Word error falls
on every condition; character error on four of
five, degraded material being the exception. Paired resampling puts the
word-error gain beyond doubt on newsprint, books, forms and degraded material
(9{,}922 to 9{,}991 of 10{,}000) but not on signage (5{,}540), where stock
already errs on only one word in twenty.}
\label{tab:bystratum}
%% \small so the table also fits ACL's narrower column; this file is shared.
\small
\begin{tabular}{@{}lrrrrr@{}}
\toprule
& & \multicolumn{2}{c}{Grapheme CER} & \multicolumn{2}{c}{WER} \\
\cmidrule(lr){3-4}\cmidrule(lr){5-6}
Condition & $n$ & Stock & Ours & Stock & Ours \\
\midrule
Newsprint & 54 & 6.34 & \textbf{4.66} & 22.55 & \textbf{15.69} \\
Books     & 54 & 7.47 & \textbf{6.68} & 20.25 & \textbf{14.64} \\
Forms     & 40 & 15.00 & \textbf{12.38} & 40.19 & \textbf{33.18} \\
Signage   & 27 & 1.51 & \textbf{1.21} & 5.36 & \textbf{4.46} \\
Degraded  & 27 & \textbf{10.22} & 11.65 & 31.45 & \textbf{23.90} \\
\midrule
All       & 202 & 8.38 & \textbf{7.36} & 24.82 & \textbf{18.79} \\
\bottomrule
\end{tabular}
\end{table}

\begin{table}[t]
\centering\small
\begin{tabular}{lrr}
\toprule
 & Stock & Ours \\
\midrule
Total edits & 539 & 489 \\
\quad substitutions & 143 & 148 \\
\quad deletions & 150 & 144 \\
\quad insertions & 246 & 197 \\
\midrule
\ta{ர}/\ta{ற}, \ta{ள}/\ta{ல}/\ta{ழ} subs & 5 & 3 \\
\quad as \% of substitutions & 3.5\% & 2.0\% \\
Same consonant, other vowel sign & 41 & 43 \\
Deletions carrying a mark & 68 & 66 \\
\bottomrule
\end{tabular}
\caption{Error composition on the 202-line reporting split. Errors involving
the dependent vowel sign --- substituted for another sign on the same
consonant, or lost with its base --- account for 37\% of non-insertion edits
in both models, against 2--4\% for the confusable consonant families that
dominate informal accounts of Tamil OCR.}
\label{tab:errors}
\end{table}

% =========================================================================
% Moved out of \S\ref{sec:floor} for the 20-page limit (2026-09-05). The
% body keeps the conclusion; the reasoning is here.
% =========================================================================
\section{Reading the Transcription Error Floor}
\label{app:floor}

Double entry puts grapheme disagreement at 1.04\% over the 100 re-transcribed
lines, 0.75\% on the selection split and 1.48\% on the reporting split
(\apptab{tab:floor}{F5}). One line put the raw figure at 2.37\% on its own,
and not through a reading error: both passes read its Tamil identically and
differed on whether a signature rule of 29 printed hyphens is text. We
transcribe such rules, since the reference must describe its image, and the
ruling favours neither system --- both emit a rule run there. No other test
line contains such a run.

The floor bounds the \emph{absolute} error rates reported in
\S\ref{sec:results}: an error rate of 7.36\% is measured against a reference
that disagrees with itself at 0.8--1.0\%, so the second decimal place is not
meaningful. It does not bound the \emph{difference} between two systems
scored on identical input, which is what the paired bootstrap addresses, and
reference errors do not subtract out --- where the reference is wrong, a
system that reads the line correctly is penalised and one that repeats the
transcriber's error is not.

That is a reason for caution rather than for dismissal. The second pass and
both models fail in the same places: the pulli accounts for three of the
seven Tamil disagreements between passes and is also what the models most
often lose (\S\ref{sec:errors}). Reference noise is therefore not
independent of model behaviour, and a character error difference of 1.01
points measured against a floor of the same order is not a difference this
test set can resolve in either direction.

% =========================================================================
% The full version of \S\ref{sec:errors}, which the 20-page limit
% (2026-09-05) left room for only in summary.
% =========================================================================
\section{Error Analysis in Full}
\label{app:errors}

Grapheme-level alignments between reference and hypothesis were computed on
the reporting split, after the normalisation of \S\ref{sec:eval}, for the
stock and released models: 539 edits for stock against 489 for ours, broken
down in \apptab{tab:errors}{F7}.


\paragraph{The consonant-confusion claim does not hold.} The families
\ta{ர}/\ta{ற} and \ta{ள}/\ta{ல}/\ta{ழ} are routinely named as the dominant
Tamil OCR failure, and an earlier draft of this paper asserted they accounted
for roughly 40\% of errors. Measured, they are 5 edits of 143 substitutions
for stock and 3 of 148 for ours --- script folklore rather than a
measurement. A system tuned to separate those families would be optimising
2--4\% of its error.

\paragraph{The dependent vowel sign is where recognition fails.} Combining
substitutions that preserve the consonant but change its vowel sign (41 and
43) with deletions of a grapheme carrying a mark (68 and 66) accounts for
37\% of non-insertion edits in both models --- 29\% of substitutions and
45\% of deletions. Vowel-length
pairs specifically --- \ta{ி}/\ta{ீ}, \ta{ு}/\ta{ூ}, \ta{ெ}/\ta{ே} on a
shared base, plus independent-vowel pairs such as \ta{ஒ}/\ta{ஓ} --- rise from
2 edits for stock to 10 for ours, so the released model trades a little
length precision for its word-level gains.

\paragraph{The families that confuse readers are not the ones that confuse
models.} The double-entry pass (\S\ref{sec:floor}) disagreed with itself at
seven sites involving a Tamil grapheme. Two are \ta{ல}/\ta{ள} and
\ta{ண}/\ta{ன}, members of the families that account for only 2--4\% of
either model's substitutions: on this material those families are a human
reading difficulty rather than a machine one, a further reason to treat the
folklore claim as folklore. Three more are the pulli, which is also what the
models lose most often.

\paragraph{Stock hallucinates punctuation.} Stock's insertions (246) exceed
ours (197), and are dominated by punctuation absent from the reference: 47
full stops, 23 vertical bars, 22 colons. This is a layout-analysis artefact
rather than a recognition one, and it is part of why the WER gap
(Table~\ref{tab:main}) is wider than the CER gap.

% =========================================================================
% Moved out of \S\ref{sec:dawg} for the 20-page limit. The body keeps the
% conclusion -- grafting is safe but not best -- and this is why.
% =========================================================================
\section{Why Grafting a DAWG Across a Fine-Tune Is Safe}
\label{app:dawg}

A DAWG stores unichar \emph{identifiers} rather than characters, so carrying
one across a fine-tune is only safe if the identifiers still mean what they
meant when the DAWG was built. They do here.
\texttt{combine\_lang\_model} builds our unicharset as a strict superset of
stock \stockmodel{}'s with identifiers preserved: all 99 stock units keep
their positions and nine are appended. Rebuilding stock's own wordlist
against our unicharset reproduces its DAWG at byte-identical size
(2{,}943{,}474), which confirms the mapping empirically rather than by
inspection.

Safety is not optimality. Stock's 251{,}899 words were selected for a
different corpus, and \S\ref{sec:results} finds the corpus-derived wordlist
better than stock's and better than their union --- the matched vocabulary
rather than the larger one.

% Moved out of \S\ref{sec:results} for the 20-page limit. It is
% methodology rather than result, and it is the kind of thing a reader
% goes looking for rather than meets in passing.
\section{What the Selection Split Costs}
\label{app:selection}

Choosing on 98 lines is itself
uncertain: the top eight checkpoints span 0.63 grapheme CER points there
(9.01--9.64\%), so the winner is drawn from within noise. Iteration 1{,}400
wins and scores 8.11\% on the reporting split; iteration 400, eighth by
selection score, would have scored 7.51\%. The released checkpoint is one
draw from a set of near-equivalent models, not an optimum.
%% >>> end sections/appendices.tex
%% <<< inlined from sections/datasheet.tex
% =========================================================================
% Datasheet for the corpus, following Gebru et al. (2021).
% Figures here are measured, not asserted: see results/corpus_stats.json and
% results/font_audit.json in the code repository.
% =========================================================================
\section{Datasheet for \corpus}
\label{app:datasheet}

Following \citet{gebru2021datasheets}. Every quantity below is reproducible
from the released pipeline; the scripts that produce them are named inline.

\subsection*{Motivation}

\textbf{For what purpose was the dataset created?}
To provide line-level training data for Tamil optical character recognition.
Modern Tesseract recognises text with an LSTM operating on text lines, and
fine-tuning it requires paired line images and transcriptions. Existing
openly licensed synthetic resources divide a fixed budget across many Indian
languages --- \citet{saini2022indic} provide roughly 3{,}500 Tamil lines
across 17 Unicode typefaces --- while other Indic resources concentrate on
handwriting and word-level annotation \citep{gongidi2021indic}. Off-the-shelf
engines applied to Tamil zero-shot fall well short of their accuracy on
high-resource scripts \citep{jayatilleke2025}. \corpus{} trades language
breadth for depth in one script.

\textbf{Who created the dataset?}
SyedKhaleel Jageer, independent researcher.

\textbf{Who funded the creation of the dataset?}
No external funding.

\subsection*{Composition}

\textbf{What do the instances represent?}
Each instance is one rendered line of printed Tamil text: a grayscale TIFF
image paired with a UTF-8 transcription in \texttt{tesstrain} layout
(\texttt{<stem>.tif} and \texttt{<stem>.gt.txt}).

\textbf{How many instances are there?}
218{,}125. From a pool of 225{,}450 source lines: deduplication leaves
218{,}366, and a further 241 lines are unrenderable --- they fall outside the
intersection of all 29 typeface coverages (\S\ref{sec:corpus}) --- so
218{,}125 images are released (\S\ref{sec:render}). The counts are recorded
in \texttt{results/regeneration.json}.

\textbf{What data does each instance consist of?}
A rendered image of one text line at 300\,dpi, tight-cropped to the ink
bounding box, and the exact string rendered. Transcriptions are Unicode NFC.

\textbf{Is there a label or target associated with each instance?}
Yes --- the transcription is the target. Labels are exact by construction
rather than annotated, since the text is known before rendering. This
eliminates transcription error but introduces the synthetic-to-real gap
discussed under Limitations.

\textbf{Is any information missing?}
The released instances do not record which typeface rendered each line.
Per-line typeface identity is not stored explicitly, because it does not need
to be: line $i$ of the shuffled pool is rendered in typeface $i \bmod 29$ with
the ordering recorded in the manifest, so a reuser can recover the face for
any line by index and stratify by typeface without re-rendering.

\textbf{Are there errors, sources of noise, or redundancies?}
Exact duplicate lines occur across the source texts; 7{,}048 lines (3.13\%)
are removed before rendering. The source texts contain a small quantity of
non-Tamil material --- 2.60\% of characters, mostly ordinary punctuation, but
including stray Latin and one Malayalam letter. Characters absent from at least one
typeface --- twelve typographic marks and \ta{ஶ} (U+0BB6), which one face
lacks --- are removed with their lines during construction, so no image can
lack a glyph its transcription names.

\textbf{Is the dataset self-contained?}
Yes. Images and transcriptions are distributed together and depend on no
external resource.

\textbf{Does the dataset contain confidential or offensive content?}
The sources are published texts --- encyclopaedic, literary and journalistic.
No personal data was collected. The dataset has not been screened for
offensive content present in the underlying published material, and reusers
training generative models on the transcriptions should not assume it has
been.

\subsection*{Collection process}

\textbf{How was the data acquired?}
The text was assembled from five published Tamil sources (Table
\ref{tab:corpus-stats}): Tamil Wikisource, a story collection, the Theekkathir
newspaper, Tamil Wikinews, and Maattru. The images were generated, not
collected: text is rendered by the pipeline described in
\S\ref{sec:render}.

\textbf{Over what timeframe was the data collected?}
The source texts were retrieved in approximately 2019 and have not been
re-fetched since; the rendered images were generated in 2026 from those
stored texts. We record the year rather than a date because the exact
retrieval dates were not logged at the time, and we would rather state the
imprecision than imply a precision we do not have. Two of the five sources
are continuously edited, so a reuser fetching them today will not obtain the
same text; for those, the Wikimedia dump archive provides dated snapshots
that make a year-level record usable. The stored texts are released with the
corpus, so the pipeline remains reproducible from them regardless.

\textbf{Was the data collected from individuals?}
No.

\textbf{Were any ethical review processes conducted?}
No review was required: the dataset contains no human subjects data.

\subsection*{Preprocessing, cleaning, labelling}

Sources are concatenated and segmented into fixed 12-word lines
(\texttt{normalize-gt.py}; note that the script's docstring states seven
words while the implementation uses twelve --- twelve is what produced the
released corpus). Text is normalised to Unicode NFC and whitespace collapsed.
Exact duplicates are removed. Lines are laid out 50 to a synthetic A4 page at
300\,dpi and rendered with HarfBuzz shaping via Raqm, so conjunct formation
and vowel-sign reordering are applied. Line crops are then recovered from the
rendered page by horizontal projection profile rather than emitted from
layout coordinates, so that training geometry matches the geometry a
segmenter produces at inference.

\textbf{Was the raw data saved?}
Yes; the source texts are committed to the pipeline repository under
\texttt{raw\_data/}.

\texttt{raw\_data/README.md} records each source, its URL, its licence and
its retrieval date, so the texts are presented under their own terms: the
repository's GPL-3.0 \texttt{LICENSE} covers the pipeline code and does not
relicense third-party content inside it.

\textbf{Can the dataset be regenerated?}
Yes. Line $i$ is rendered in typeface $i \bmod 29$ and the line set is a
seeded selection, so the corpus is a pure function of the seed, the target
count and the source texts. \texttt{regenerate\_corpus.py} reproduces it, and
\texttt{results/regeneration.json} records the seed, the per-source
composition of the selection, per-typeface line counts and the validation
result.

An earlier archived version was generated with unseeded random font sampling
and is therefore not reproducible; its typeface distribution spans roughly
8\% rather than the 0.01\% reported here. The corpus described in this
datasheet is a distinct, deterministic version, and citations should use its
version DOI rather than the concept DOI.

\subsection*{Uses}

\textbf{What tasks could the dataset be used for?}
Training and evaluating printed Tamil text-line recognisers; as a source of
synthetic pretraining data to be mixed with real document images, which for
historical print has been shown to beat either source alone
\citep{martinek2019hybrid}; and as a testbed for typographic robustness.

\textbf{What tasks should it not be used for?}
Handwriting recognition --- the corpus is typeset text only. Layout analysis,
table or multi-column understanding --- instances are isolated lines with no
page context. Evaluating real-world OCR accuracy: a model scored on held-out
\emph{synthetic} lines will report an optimistic figure, because the images
share a generative process with training. Real-document evaluation is
required, and \S\ref{sec:eval} describes the held-out set we use.

\textbf{Is there anything that might affect future uses?}
Two things. Coverage of the Tamil syllabary is 227 of 247 units, and 37 units
occur fewer than 29 times, so under round-robin assignment they cannot appear
in every typeface at any corpus size (\S\ref{sec:coverage}). Models trained on
this corpus should be assumed weak on those units. Second, the register mix is
dominated by literary sources; contemporary newsprint is 12.7\% of lines.

\subsection*{Distribution}

\textbf{How is the dataset distributed?}
The generation pipeline, the test set and the released model are at
\url{https://github.com/khaleeljageer/tesseract-gt-builder}. The corpus is
archived on Zenodo under a stable concept DOI with a DOI per version; cite
the version used. The release described here is
\texttt{10.5281/zenodo.22093954}; the concept DOI
\texttt{10.5281/zenodo.15009379} resolves to the latest version.

\textbf{Under what licence?}
The pipeline code is GPL-3.0. The typefaces are not redistributed with the
corpus --- only the images they produced are --- but a reuser regenerating the
corpus needs them, so we report what each face declares in its own metadata
rather than a summary judgement. Nine faces carry the SIL Open Font License
1.1; seven declare Tamilnadu Virtual Academy terms citing order
no.\ 10336/20/12/2016; two name a foundry without stating terms; and
\textbf{eleven declare no licence string at all}. Table~\ref{tab:fonts}
gives the per-face declaration. The eleven silent faces are the material
gap: they are distributed as free Tamil typefaces and are used here on that
basis, but their metadata does not evidence it, and a reuser with stricter
requirements should substitute OFL faces, which the pipeline supports by
changing the font directory.
Source terms are given in Table~\ref{tab:corpus-stats}. Tamil Wikisource, Tamil
Wikinews, Theekkathir and Maattru (\url{https://maattru.in}) are all
CC BY-SA 4.0; the story collection (\texttt{aitamilnadu/tamil\_stories}) is
Apache-2.0, which is one-way compatible into BY-SA with its notices
preserved. \textbf{The corpus is released under CC BY-SA 4.0, with no source
excluded.}

The Theekkathir text reaches us via the
\texttt{aiwithvarun7/theekkathir-text-dataset} collection, a third-party
scrape of \texttt{theekkathir.in}; the publisher's own site terms permit
BY-SA redistribution, which is what the release relies on rather than the
intermediate dataset card.

\subsection*{Maintenance}

\textbf{Who maintains the dataset, and how can they be contacted?}
SyedKhaleel Jageer, \texttt{jskcse4@gmail.com}. Issues and corrections are
best raised in the pipeline repository.

\textbf{Will the dataset be updated?}
Yes, as versioned releases under a stable concept DOI, each with its own
version DOI; users should cite the version they used. Two updates are
foreseeable: a rebuild with the hygiene repair of \S\ref{sec:hygiene}
applied before rendering, which drops 43 lines and removes the 123 lines of
disclosed label noise; and a version adding targeted synthesis for the rare
syllabary units of Appendix~\ref{app:tail}, which sampling natural text
cannot supply. Superseded versions remain retrievable so that results
reported against them stay reproducible.

\textbf{Will older versions continue to be supported?}
Zenodo retains all versions; the concept DOI resolves to the latest.
%% >>> end sections/datasheet.tex
\end{appendices}

%% Its own reference list, rather than borrowing the manuscript's through xr.
%% The appendices cite six works and the datasheet cites Gebru et al., which
%% the manuscript itself no longer cites -- so xr alone left that one
%% citation undefined and printing as [?]. natbib takes the \bibcite entries
%% from this document's own .aux over the imported ones, so the numbers here
%% are this document's. Run bibtex on ESM_1 as well as on main_sn.
\bibliography{custom}

\end{document}
