// ============================================================================
// AestheticRecipeSamples_Batch3.cs — Recipes 10-11: Academic style guides
// ============================================================================
// Recipe 10: Chicago/Turabian (humanities dissertations, history papers)
// Recipe 11: Springer LNCS (computer science conference proceedings)
// ============================================================================
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using WpPageSize = DocumentFormat.OpenXml.Wordprocessing.PageSize;
namespace MiniMaxAIDocx.Core.Samples;
public static partial class AestheticRecipeSamples
{
// ════════════════════════════════════════════════════════════════════════
// RECIPE 10: CHICAGO / TURABIAN
// ════════════════════════════════════════════════════════════════════════
///
/// Recipe: Chicago/Turabian Academic Document
/// Source: Turabian 9th edition (2018), Chicago Manual of Style 17th edition.
/// Best for: Humanities dissertations, history papers, theology, philosophy.
///
/// Design rationale:
/// - Times New Roman 12pt: standard for all Turabian submissions.
/// - Double spacing (line=480) throughout body text, as required by Turabian 9th ed. A.1.
/// - First-line indent 0.5in (720 DXA): Turabian A.1.3 — paragraphs separated by
/// indentation, not extra spacing.
/// - Left margin 1.5in (2160 DXA) for binding; all others 1in (1440 DXA):
/// Turabian A.1.1 specifies 1in minimum on all sides, 1.5in left for binding.
/// - Heading hierarchy (Turabian A.2.2):
/// H1: Centered, Bold, Title Case (first-level subheading)
/// H2: Centered, Regular (not bold), Title Case — this is the distinctive
/// Turabian feature: an unbold centered heading.
/// H3: Flush Left, Bold, Title Case
/// H4: Flush Left, Regular (not bold), Title Case
/// H5: Indented, Bold, run-in with period, sentence case (run-in = inline with text)
/// All headings are 12pt — the same size as body text.
/// - Page numbers: centered at bottom of page (Turabian A.1.5).
/// - Footnotes: 10pt (sz=20), single-spaced within, double-spaced between.
/// Turabian uses footnotes (not endnotes) as the primary citation system.
/// - Block quotes: indented 0.5in from left margin, single-spaced within,
/// used for quotations of 5+ lines (Turabian 25.2.2).
///
public static void CreateChicagoTurabianDocument(string outputPath)
{
using var doc = WordprocessingDocument.Create(outputPath, WordprocessingDocumentType.Document);
var mainPart = doc.AddMainDocumentPart();
mainPart.Document = new Document(new Body());
var body = mainPart.Document.Body!;
// ── Styles ──
var stylesPart = mainPart.AddNewPart();
stylesPart.Styles = new Styles();
var styles = stylesPart.Styles;
// DocDefaults: Times New Roman 12pt, double spacing, first-line indent
styles.Append(new DocDefaults(
new RunPropertiesDefault(
new RunPropertiesBaseStyle(
new RunFonts
{
Ascii = "Times New Roman",
HighAnsi = "Times New Roman",
EastAsia = "SimSun",
ComplexScript = "Times New Roman"
},
new FontSize { Val = "24" }, // 12pt (half-points)
new FontSizeComplexScript { Val = "24" },
new Color { Val = "000000" },
new Languages { Val = "en-US", EastAsia = "zh-CN" }
)
),
new ParagraphPropertiesDefault(
new ParagraphPropertiesBaseStyle(
new SpacingBetweenLines
{
// Double spacing: 480 = 2.0x (240 = single)
// Required throughout by Turabian A.1.2
Line = "480",
LineRule = LineSpacingRuleValues.Auto,
After = "0" // No space after — indent separates paragraphs
},
// First-line indent: 0.5in = 720 DXA (Turabian A.1.3)
new Indentation { FirstLine = "720" }
)
)
));
// ── Normal style ──
styles.Append(CreateParagraphStyle(
styleId: "Normal",
styleName: "Normal",
isDefault: true,
uiPriority: 0
));
// ── Heading 1: 12pt Bold, Centered, Title Case ──
// Turabian first-level subheading: centered and bold
styles.Append(CreateAcademicHeadingStyle(
level: 1,
sizeHalfPts: "24", // 12pt — same as body
bold: true,
italic: false,
centered: true,
spaceBefore: "480", // One blank double-spaced line before
spaceAfter: "0"
));
// ── Heading 2: 12pt Regular (NOT bold), Centered, Title Case ──
// Turabian second-level subheading: centered but NOT bold.
// This is the distinctive Turabian feature — an unbold centered heading.
// It contrasts with APA which makes all centered headings bold.
styles.Append(CreateAcademicHeadingStyle(
level: 2,
sizeHalfPts: "24", // 12pt — same as body
bold: false, // NOT bold — distinctive Turabian feature
italic: false,
centered: true,
spaceBefore: "480",
spaceAfter: "0"
));
// ── Heading 3: 12pt Bold, Flush Left, Title Case ──
// Turabian third-level subheading: flush left and bold
styles.Append(CreateAcademicHeadingStyle(
level: 3,
sizeHalfPts: "24", // 12pt — same as body
bold: true,
italic: false,
centered: false,
spaceBefore: "480",
spaceAfter: "0"
));
// ── Heading 4: 12pt Regular (NOT bold), Flush Left, Title Case ──
// Turabian fourth-level subheading: flush left, not bold
styles.Append(CreateAcademicHeadingStyle(
level: 4,
sizeHalfPts: "24", // 12pt — same as body
bold: false, // NOT bold
italic: false,
centered: false,
spaceBefore: "480",
spaceAfter: "0"
));
// ── Heading 5 style: 12pt Bold, Indented, run-in with period ──
// Turabian fifth-level: indented like a paragraph, bold, followed by a period,
// then the text runs in on the same line. We approximate with a style
// that has the indent but the run-in behavior is manual.
styles.Append(CreateTurabianHeading5Style());
// ── Block Quote style ──
// Turabian 25.2.2: quotations of 5+ lines are block-quoted.
// Indented 0.5in from left margin, single-spaced within.
styles.Append(CreateTurabianBlockQuoteStyle());
// ── Caption style ──
styles.Append(CreateCaptionStyle(
fontSizeHalfPts: "24", // 12pt — same as body
color: "000000",
italic: false
));
// ── Page setup: US Letter, 1in margins except 1.5in left for binding ──
// Turabian A.1.1: at least 1in on all sides, left may be 1.5in for binding
var sectPr = new SectionProperties(
new WpPageSize { Width = 12240U, Height = 15840U },
new PageMargin
{
Top = 1440, Bottom = 1440, // 1in
Left = 2160U, // 1.5in for binding
Right = 1440U, // 1in
Header = 720U, Footer = 720U, Gutter = 0U
}
);
// ── Page numbers: centered bottom (Turabian A.1.5) ──
AddPageNumberFooter(mainPart, sectPr,
alignment: JustificationValues.Center,
fontSizeHalfPts: "24", // 12pt — same as body
color: "000000",
format: PageNumberFormat.Plain
);
// ── Footnotes part setup ──
// Turabian uses footnotes as the primary citation system.
// Footnote text: 10pt (sz=20), single-spaced within, double-spaced between.
var footnotesPart = mainPart.AddNewPart();
footnotesPart.Footnotes = new Footnotes(
// Required separator and continuation separator footnotes
new Footnote(
new Paragraph(
new ParagraphProperties(
new SpacingBetweenLines { After = "0", Line = "240", LineRule = LineSpacingRuleValues.Auto }
),
new Run(new SeparatorMark())
)
)
{ Type = FootnoteEndnoteValues.Separator, Id = -1 },
new Footnote(
new Paragraph(
new ParagraphProperties(
new SpacingBetweenLines { After = "0", Line = "240", LineRule = LineSpacingRuleValues.Auto }
),
new Run(new ContinuationSeparatorMark())
)
)
{ Type = FootnoteEndnoteValues.ContinuationSeparator, Id = 0 },
// Actual footnote (id=1): 10pt, single-spaced
new Footnote(
new Paragraph(
new ParagraphProperties(
new SpacingBetweenLines { After = "0", Line = "240", LineRule = LineSpacingRuleValues.Auto },
new Indentation { FirstLine = "720" }
),
new Run(
new RunProperties(
new VerticalTextAlignment { Val = VerticalPositionValues.Superscript }
),
new FootnoteReferenceMark()
),
new Run(
new RunProperties(
new FontSize { Val = "20" }, // 10pt footnote text
new FontSizeComplexScript { Val = "20" }
),
new Text(" Kate L. Turabian, ") { Space = SpaceProcessingModeValues.Preserve }
),
new Run(
new RunProperties(
new FontSize { Val = "20" },
new FontSizeComplexScript { Val = "20" },
new Italic()
),
new Text("A Manual for Writers of Research Papers, Theses, and Dissertations")
),
new Run(
new RunProperties(
new FontSize { Val = "20" },
new FontSizeComplexScript { Val = "20" }
),
new Text(", 9th ed. (Chicago: University of Chicago Press, 2018), 1.")
)
)
)
{ Id = 1 }
);
footnotesPart.Footnotes.Save();
// ── Sample content ──
// Title — centered, no indent
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading1" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("The Influence of Typographic Conventions on Scholarly Communication"))
));
// Body paragraph
AddAcademicParagraph(body, "The conventions governing the physical presentation of scholarly "
+ "writing have evolved considerably since the advent of the printing press. What began as "
+ "pragmatic considerations of legibility and economy have become codified standards that "
+ "signal disciplinary identity and methodological rigor.");
// Body paragraph with footnote reference
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Normal" }
),
new Run(new Text("The Chicago Manual of Style, now in its seventeenth edition, remains the "
+ "authoritative guide for humanities publishing.")),
new Run(
new RunProperties(
new VerticalTextAlignment { Val = VerticalPositionValues.Superscript }
),
new FootnoteReference { Id = 1 }
),
new Run(new Text(" Its companion volume for students, commonly known as Turabian, "
+ "translates these standards into practical formatting requirements for academic papers "
+ "and dissertations.") { Space = SpaceProcessingModeValues.Preserve })
));
// Heading 2 — centered, NOT bold (distinctive Turabian feature)
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading2" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("Historical Development of Style Guides"))
));
AddAcademicParagraph(body, "The emergence of standardized formatting guidelines in the early "
+ "twentieth century reflected a growing professionalization of academic writing. "
+ "Universities increasingly required uniform presentation of theses and dissertations, "
+ "driven by the practical needs of library cataloguing and microfilm reproduction.");
// Heading 3 — flush left, bold
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading3" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("The University of Chicago Tradition"))
));
AddAcademicParagraph(body, "Kate Turabian served as the dissertation secretary at the "
+ "University of Chicago from 1930 to 1958. During this period, she developed a set of "
+ "formatting guidelines that would eventually become the standard reference for student "
+ "writers across the humanities.");
// Heading 4 — flush left, NOT bold
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading4" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("Margin Requirements and Binding Considerations"))
));
AddAcademicParagraph(body, "The requirement for a wider left margin originated in the physical "
+ "binding process. Theses submitted for library archiving were typically bound on the left "
+ "edge, necessitating additional space to ensure that text near the spine remained legible.");
// Heading 5 — indented, bold, run-in with period
// In Turabian, H5 runs into the paragraph text. We simulate by putting the
// heading and body text in the same paragraph.
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading5" }
),
new Run(
new RunProperties(new Bold()),
new Text("Modern adaptations.") { Space = SpaceProcessingModeValues.Preserve }
),
new Run(
new Text(" Contemporary editions of Turabian have adapted these physical requirements "
+ "for digital submission, though many programs still require the wider left margin "
+ "as a nod to tradition and to accommodate printed copies.") { Space = SpaceProcessingModeValues.Preserve }
)
));
// Block quote — indented 0.5in, single-spaced
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "BlockQuote" }
),
new Run(new Text("A writer who undertakes a research project joins an ongoing conversation. "
+ "To enter that conversation, you must understand what others have written, consider "
+ "their claims, and respond with your own interpretation of the evidence. The format "
+ "of your paper — its margins, spacing, notes, and bibliography — signals your "
+ "participation in that scholarly community."))
));
AddAcademicParagraph(body, "This passage illustrates the centrality of formatting conventions "
+ "to the scholarly enterprise. The visual presentation of a document communicates not only "
+ "the content but also the author's membership in a disciplinary community.");
// Section properties must be last child of body
body.Append(sectPr);
}
///
/// Creates the Turabian fifth-level heading style.
/// Turabian H5: Indented (same as paragraph indent, 0.5in), Bold, run-in with period.
/// The heading text is bold and followed by a period, then body text continues
/// on the same line in regular weight. This "run-in" behavior is unique to Turabian
/// and requires manual composition (bold run + regular run in same paragraph).
///
private static Style CreateTurabianHeading5Style()
{
var rPr = new StyleRunProperties(
new RunFonts
{
Ascii = "Times New Roman",
HighAnsi = "Times New Roman",
EastAsia = "SimSun",
ComplexScript = "Times New Roman"
},
new FontSize { Val = "24" },
new FontSizeComplexScript { Val = "24" },
new Color { Val = "000000" },
new Bold()
);
var pPr = new StyleParagraphProperties(
new KeepNext(),
new KeepLines(),
new SpacingBetweenLines
{
Before = "480",
After = "0",
Line = "480",
LineRule = LineSpacingRuleValues.Auto
},
// Indented same as paragraph first-line indent (0.5in)
new Indentation { FirstLine = "720" },
new OutlineLevel { Val = 4 } // OutlineLevel is 0-based: level 5 = 4
);
return new Style(
new StyleName { Val = "heading 5" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 9 },
new PrimaryStyle(),
pPr,
rPr
)
{
Type = StyleValues.Paragraph,
StyleId = "Heading5",
Default = false
};
}
///
/// Creates a Turabian block quote style.
/// Turabian 25.2.2: prose quotations of five or more lines should be set off
/// as block quotations. Block quotes are indented 0.5in from the left margin,
/// single-spaced within (line=240), with no first-line indent, and with a blank
/// line (double-spaced) before and after.
///
private static Style CreateTurabianBlockQuoteStyle()
{
return new Style(
new StyleName { Val = "Block Quote" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 29 },
new PrimaryStyle(),
new StyleParagraphProperties(
new SpacingBetweenLines
{
Before = "240",
After = "240",
Line = "240", // Single-spaced within block quote
LineRule = LineSpacingRuleValues.Auto
},
new Indentation
{
Left = "720", // 0.5in from left margin
FirstLine = "0" // No first-line indent in block quotes
}
),
new StyleRunProperties(
new FontSize { Val = "24" }, // 12pt — same as body
new FontSizeComplexScript { Val = "24" }
)
)
{
Type = StyleValues.Paragraph,
StyleId = "BlockQuote",
Default = false
};
}
// ════════════════════════════════════════════════════════════════════════
// RECIPE 11: SPRINGER LNCS
// ════════════════════════════════════════════════════════════════════════
///
/// Recipe: Springer LNCS (Lecture Notes in Computer Science)
/// Source: llncs.cls class file, Springer LNCS author instructions (2024).
/// Best for: Computer science conference proceedings, workshop papers, Springer volumes.
///
/// Design rationale:
/// - Times New Roman 10pt body (sz=20): LNCS uses a compact 10pt body to fit
/// more content per page. Conference proceedings have strict page limits
/// (typically 12-16 pages), so density matters.
/// - Text area: 122mm x 193mm on US Letter. This creates generous margins
/// (~44mm left/right, ~47mm top, ~55mm bottom) that give the dense text
/// breathing room. The narrow text column improves readability at 10pt.
/// Margins: Top=47mm(2669 DXA), Bottom=55mm(3118 DXA), Left=44mm(2494 DXA),
/// Right=44mm(2494 DXA).
/// - Title: 14pt bold centered (sz=28) — the only large element on the page.
/// - Author: 12pt centered (sz=24) — subordinate to title but clearly visible.
/// - H1 (Section): 12pt bold flush left, arabic numbered ("1 Introduction").
/// - H2 (Subsection): 10pt bold flush left, numbered "1.1".
/// - H3 (Subsubsection): 10pt bold italic run-in, numbered but discouraged.
/// - H4 (Paragraph): 10pt italic run-in, unnumbered.
/// - Single spacing (line=240) throughout — maximizes content density.
/// - First-line indent: ~15pt (283 DXA, ~0.5cm) — notably smaller than the
/// typical 0.5in, reflecting European typographic conventions.
/// - Paragraph spacing: 0pt — paragraphs separated only by indent.
/// - Abstract: "Abstract." bold prefix, 9pt body (sz=18).
/// - Captions and references: 9pt (sz=18).
/// - Page numbers: centered at bottom of page.
///
public static void CreateSpringerLNCSDocument(string outputPath)
{
using var doc = WordprocessingDocument.Create(outputPath, WordprocessingDocumentType.Document);
var mainPart = doc.AddMainDocumentPart();
mainPart.Document = new Document(new Body());
var body = mainPart.Document.Body!;
// ── Styles ──
var stylesPart = mainPart.AddNewPart();
stylesPart.Styles = new Styles();
var styles = stylesPart.Styles;
// DocDefaults: Times New Roman 10pt, single spacing, small first-line indent
styles.Append(new DocDefaults(
new RunPropertiesDefault(
new RunPropertiesBaseStyle(
new RunFonts
{
Ascii = "Times New Roman",
HighAnsi = "Times New Roman",
EastAsia = "SimSun",
ComplexScript = "Times New Roman"
},
new FontSize { Val = "20" }, // 10pt body (half-points)
new FontSizeComplexScript { Val = "20" },
new Color { Val = "000000" },
new Languages { Val = "en-US", EastAsia = "zh-CN" }
)
),
new ParagraphPropertiesDefault(
new ParagraphPropertiesBaseStyle(
new SpacingBetweenLines
{
// Single spacing: compact layout for proceedings
Line = "240",
LineRule = LineSpacingRuleValues.Auto,
After = "0"
},
// First-line indent: ~15pt = 283 DXA (~0.5cm)
// Smaller than the Anglo-American 0.5in, following European convention
new Indentation { FirstLine = "283" }
)
)
));
// ── Normal style ──
styles.Append(CreateParagraphStyle(
styleId: "Normal",
styleName: "Normal",
isDefault: true,
uiPriority: 0
));
// ── LNCS Title style: 14pt bold centered ──
styles.Append(CreateLNCSTitleStyle());
// ── LNCS Author style: 12pt centered ──
styles.Append(CreateLNCSAuthorStyle());
// ── LNCS Abstract style: 9pt, for the abstract body text ──
styles.Append(CreateLNCSAbstractStyle());
// ── Heading 1 (Section): 12pt bold flush left ──
// LNCS sections are numbered "1 Introduction", "2 Related Work", etc.
// Numbering is manual in the sample content for simplicity.
styles.Append(CreateHeadingStyle(
level: 1,
fontAscii: "Times New Roman",
fontHAnsi: "Times New Roman",
sizeHalfPts: "24", // 12pt
color: "000000",
bold: true,
spaceBefore: "240", // 12pt before
spaceAfter: "120", // 6pt after
uiPriority: 9
));
// ── Heading 2 (Subsection): 10pt bold flush left ──
// Numbered "1.1", "1.2", etc.
styles.Append(CreateHeadingStyle(
level: 2,
fontAscii: "Times New Roman",
fontHAnsi: "Times New Roman",
sizeHalfPts: "20", // 10pt — same as body
color: "000000",
bold: true,
spaceBefore: "200", // 10pt before
spaceAfter: "100", // 5pt after
uiPriority: 9
));
// ── Heading 3 (Subsubsection): 10pt bold italic, run-in ──
// LNCS discourages subsubsections but allows them.
// Run-in headings are composed manually (bold italic run + regular run).
styles.Append(CreateLNCSHeading3Style());
// ── Heading 4 (Paragraph): 10pt italic, run-in, unnumbered ──
styles.Append(CreateLNCSHeading4Style());
// ── Caption style: 9pt (sz=18) ──
styles.Append(CreateCaptionStyle(
fontSizeHalfPts: "18", // 9pt
color: "000000",
italic: false
));
// ── References style: 9pt (sz=18) ──
styles.Append(CreateLNCSReferencesStyle());
// ── Page setup: US Letter with LNCS text area 122x193mm ──
// US Letter = 215.9mm x 279.4mm = 12240 x 15840 DXA
// Text area = 122mm x 193mm centered on page
// Left/Right margin: (215.9-122)/2 ≈ 47mm ≈ 2669 DXA — but LNCS specifies ~44mm
// Top margin: ~47mm = 2669 DXA, Bottom: ~55mm = 3118 DXA
var sectPr = new SectionProperties(
new WpPageSize { Width = 12240U, Height = 15840U },
new PageMargin
{
Top = 2669, Bottom = 3118,
Left = 2494U, Right = 2494U,
Header = 720U, Footer = 720U, Gutter = 0U
}
);
// ── Page numbers: centered bottom ──
AddPageNumberFooter(mainPart, sectPr,
alignment: JustificationValues.Center,
fontSizeHalfPts: "20", // 10pt
color: "000000",
format: PageNumberFormat.Plain
);
// ── Sample content ──
// Title — 14pt bold centered
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "LNCSTitle" }
),
new Run(new Text("Efficient Algorithms for Document Layout Analysis"))
));
// Author — 12pt centered
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "LNCSAuthor" }
),
new Run(new Text("Jane Smith"))
));
// Author affiliation — 9pt centered
body.Append(new Paragraph(
new ParagraphProperties(
new Justification { Val = JustificationValues.Center },
new SpacingBetweenLines { After = "240" },
new Indentation { FirstLine = "0" }
),
new Run(
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }
),
new Text("Department of Computer Science, Example University, City, Country")
)
));
// Abstract — "Abstract." bold prefix + 9pt body
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "LNCSAbstract" }
),
new Run(
new RunProperties(
new Bold(),
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }
),
new Text("Abstract.") { Space = SpaceProcessingModeValues.Preserve }
),
new Run(
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }
),
new Text(" This paper presents efficient algorithms for analyzing the layout structure "
+ "of digitally typeset documents. We propose a novel approach based on hierarchical "
+ "decomposition that achieves O(n log n) complexity while maintaining high accuracy "
+ "on standard benchmarks. Experimental results on the ICDAR dataset demonstrate "
+ "a 12% improvement over existing methods.") { Space = SpaceProcessingModeValues.Preserve }
)
));
// Section 1 — numbered manually
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading1" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("1 Introduction"))
));
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Normal" },
new Indentation { FirstLine = "0" } // First para after heading: no indent
),
new Run(new Text("Document layout analysis is a fundamental task in document image processing. "
+ "Given a document page, the goal is to identify and classify regions such as text blocks, "
+ "figures, tables, and captions. Accurate layout analysis is a prerequisite for downstream "
+ "tasks including optical character recognition and information extraction."))
));
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Normal" }
),
new Run(new Text("Previous approaches to this problem can be broadly categorized into "
+ "rule-based methods, which rely on hand-crafted heuristics, and learning-based methods, "
+ "which train classifiers on annotated datasets. While learning-based methods have shown "
+ "superior accuracy, their computational cost often limits practical deployment."))
));
// Section 2
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading1" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("2 Related Work"))
));
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Normal" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("The literature on document layout analysis spans several decades. "
+ "Early systems employed top-down recursive decomposition, while more recent work "
+ "has explored bottom-up aggregation of connected components."))
));
// Subsection 2.1
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading2" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("2.1 Top-Down Approaches"))
));
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Normal" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("Top-down methods recursively partition the document page into smaller "
+ "regions. The X-Y cut algorithm is the canonical example, splitting the page "
+ "alternately along horizontal and vertical whitespace gaps."))
));
// Section 3
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading1" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("3 Proposed Method"))
));
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Normal" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("We propose a hierarchical decomposition algorithm that combines the "
+ "efficiency of top-down splitting with the accuracy of bottom-up region growing."))
));
// Table — three-line style, common in CS papers
body.Append(CreateThreeLineTable(
new[] { "Method", "Precision", "Recall", "F1", "Time (ms)" },
new[]
{
new[] { "X-Y Cut", "0.82", "0.79", "0.80", "12" },
new[] { "RLSA", "0.85", "0.83", "0.84", "45" },
new[] { "Ours", "0.94", "0.91", "0.92", "18" }
}
));
// Caption — 9pt
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Caption" },
new Justification { Val = JustificationValues.Center },
new Indentation { FirstLine = "0" }
),
new Run(
new RunProperties(new Bold()),
new Text("Table 1.") { Space = SpaceProcessingModeValues.Preserve }
),
new Run(new Text(" Comparison of layout analysis methods on the ICDAR 2019 dataset.") { Space = SpaceProcessingModeValues.Preserve })
));
// References section
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading1" },
new Indentation { FirstLine = "0" }
),
new Run(new Text("References"))
));
// Reference entries — 9pt, numbered [1], [2], etc.
AddLNCSReference(body, "1", "Smith, J., Doe, A.: Document layout analysis using recursive decomposition. "
+ "In: Proceedings of ICDAR, pp. 112\u2013120 (2019)");
AddLNCSReference(body, "2", "Johnson, R.: A survey of page segmentation algorithms. "
+ "Pattern Recognition 45(3), 234\u2013251 (2018)");
AddLNCSReference(body, "3", "Williams, K., Brown, L.: Hierarchical methods for structured document "
+ "understanding. Int. J. Document Analysis 12(1), 45\u201367 (2020)");
// Section properties must be last child of body
body.Append(sectPr);
}
///
/// LNCS Title style: 14pt bold centered, with spacing after for author line.
/// The title is the largest element in an LNCS paper — everything else is compact.
///
private static Style CreateLNCSTitleStyle()
{
return new Style(
new StyleName { Val = "LNCS Title" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 10 },
new PrimaryStyle(),
new StyleParagraphProperties(
new Justification { Val = JustificationValues.Center },
new SpacingBetweenLines { Before = "0", After = "240" },
new Indentation { FirstLine = "0" }
),
new StyleRunProperties(
new Bold(),
new FontSize { Val = "28" }, // 14pt
new FontSizeComplexScript { Val = "28" }
)
)
{
Type = StyleValues.Paragraph,
StyleId = "LNCSTitle",
Default = false
};
}
///
/// LNCS Author style: 12pt centered, no bold.
/// Authors are listed below the title, followed by affiliations in smaller text.
///
private static Style CreateLNCSAuthorStyle()
{
return new Style(
new StyleName { Val = "LNCS Author" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 10 },
new PrimaryStyle(),
new StyleParagraphProperties(
new Justification { Val = JustificationValues.Center },
new SpacingBetweenLines { Before = "0", After = "60" },
new Indentation { FirstLine = "0" }
),
new StyleRunProperties(
new FontSize { Val = "24" }, // 12pt
new FontSizeComplexScript { Val = "24" }
)
)
{
Type = StyleValues.Paragraph,
StyleId = "LNCSAuthor",
Default = false
};
}
///
/// LNCS Abstract style: 9pt body, slightly indented from both margins.
/// The abstract in LNCS papers is preceded by "Abstract." in bold.
///
private static Style CreateLNCSAbstractStyle()
{
return new Style(
new StyleName { Val = "LNCS Abstract" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 10 },
new PrimaryStyle(),
new StyleParagraphProperties(
new SpacingBetweenLines { Before = "120", After = "240" },
new Indentation { Left = "283", Right = "283", FirstLine = "0" }
),
new StyleRunProperties(
new FontSize { Val = "18" }, // 9pt
new FontSizeComplexScript { Val = "18" }
)
)
{
Type = StyleValues.Paragraph,
StyleId = "LNCSAbstract",
Default = false
};
}
///
/// LNCS Heading 3 (Subsubsection): 10pt bold italic.
/// Run-in style — the heading is followed by body text on the same line.
/// Numbering (e.g., "1.1.1") is manual. LNCS discourages deep nesting.
///
private static Style CreateLNCSHeading3Style()
{
return new Style(
new StyleName { Val = "heading 3" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 9 },
new PrimaryStyle(),
new StyleParagraphProperties(
new KeepNext(),
new KeepLines(),
new SpacingBetweenLines { Before = "200", After = "100" },
new Indentation { FirstLine = "0" },
new OutlineLevel { Val = 2 }
),
new StyleRunProperties(
new RunFonts
{
Ascii = "Times New Roman",
HighAnsi = "Times New Roman",
EastAsia = "SimSun",
ComplexScript = "Times New Roman"
},
new FontSize { Val = "20" }, // 10pt — same as body
new FontSizeComplexScript { Val = "20" },
new Color { Val = "000000" },
new Bold(),
new Italic()
)
)
{
Type = StyleValues.Paragraph,
StyleId = "Heading3",
Default = false
};
}
///
/// LNCS Heading 4 (Paragraph level): 10pt italic, run-in, unnumbered.
/// The lowest heading level in LNCS — used for paragraph-level subdivisions.
///
private static Style CreateLNCSHeading4Style()
{
return new Style(
new StyleName { Val = "heading 4" },
new BasedOn { Val = "Normal" },
new NextParagraphStyle { Val = "Normal" },
new UIPriority { Val = 9 },
new PrimaryStyle(),
new StyleParagraphProperties(
new KeepNext(),
new KeepLines(),
new SpacingBetweenLines { Before = "200", After = "100" },
new Indentation { FirstLine = "0" },
new OutlineLevel { Val = 3 }
),
new StyleRunProperties(
new RunFonts
{
Ascii = "Times New Roman",
HighAnsi = "Times New Roman",
EastAsia = "SimSun",
ComplexScript = "Times New Roman"
},
new FontSize { Val = "20" }, // 10pt — same as body
new FontSizeComplexScript { Val = "20" },
new Color { Val = "000000" },
new Italic() // Italic only, no bold
)
)
{
Type = StyleValues.Paragraph,
StyleId = "Heading4",
Default = false
};
}
///
/// LNCS References style: 9pt (sz=18), with hanging indent for numbered entries.
/// References in LNCS use numbered format [1], [2], etc.
///
private static Style CreateLNCSReferencesStyle()
{
return new Style(
new StyleName { Val = "LNCS Reference" },
new BasedOn { Val = "Normal" },
new UIPriority { Val = 30 },
new PrimaryStyle(),
new StyleParagraphProperties(
new SpacingBetweenLines { After = "40" },
new Indentation
{
Left = "360", // Hanging indent body
Hanging = "360" // Hanging amount (overrides first-line indent)
}
),
new StyleRunProperties(
new FontSize { Val = "18" }, // 9pt
new FontSizeComplexScript { Val = "18" }
)
)
{
Type = StyleValues.Paragraph,
StyleId = "LNCSReference",
Default = false
};
}
///
/// Helper to add an LNCS-formatted reference entry with [N] numbering.
///
private static void AddLNCSReference(Body body, string number, string text)
{
body.Append(new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "LNCSReference" }
),
new Run(
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }
),
new Text($"[{number}] ") { Space = SpaceProcessingModeValues.Preserve }
),
new Run(
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }
),
new Text(text)
)
));
}
}