아래와 같이, 한글에서 설정하는 것과 완전히 동일하게, 편집 가능한 모든 요소를 수정하여 출력하도록 할 수 있습니다.

아래는 순서대로 스타일, 문단 속성, 글자 속성에 해당하는 코드의 일부분입니다.

/**
 * Unified Styles (HWPX Style 정의)
 *
 * HWPX 스타일을 unified-theme-v2 기반으로 동적 생성합니다.
 *
 */

import type { ParaStyleKey, CharStyleKey } from "./style-keywords";
import { getParaStyleId, getCharStyleId } from "./theme-to-hwpx-mapper";

/**
 * HWPX 스타일 인터페이스
 */
export interface HwpxStyle {
  // 스타일 메타데이터
  id: number; // 스타일 ID
  type: string; // 스타일 타입 ("PARA", "CHAR" 등)
  name: string; // 한글 이름
  engName?: string; // 영문 이름
  langID: number; // 언어 ID (1042 = 한국어)

  // 속성 참조 ID (숫자로 저장, 사용시 문자열 변환)
  paraPrIDRef: number; // ParaProperty 참조
  charPrIDRef: number; // CharProperty 참조
  nextStyleIDRef: number; // 다음 스타일 참조

  // 선택적 속성
  lockForm?: number; // 스타일 잠금 여부
}

/**
 * 스타일 정의 (Style Definition)
 *
 * 각 스타일은 ParaProperty와 CharProperty의 조합입니다.
 *
 * 새 스타일 추가 방법:
 * 1. 배열에 새 항목 추가
 * 2. paraStyleName: 사용할 Para 속성 이름 (unified-paras.ts 참조)
 * 3. charStyleName: 사용할 Char 속성 이름 (unified-chars.ts 참조)
 * 4. displayName: 한글 표시 이름 (예: "발문", "선지")
 * 5. engName: 영문 이름 (선택, 예: "Default")
 *
 */
const STYLE_DEFINITIONS = [
  // 기본 스타일
  {
    paraStyleName: "Default" as ParaStyleKey,
    charStyleName: "Default" as CharStyleKey,
    displayName: "바탕글",
    engName: "Default",
  },

  // 발문 관련 스타일
  {
    paraStyleName: "Statement" as ParaStyleKey,
    charStyleName: "Statement" as CharStyleKey,
    displayName: "발문",
    engName: "",
  },
  {
    paraStyleName: "StatementSub" as ParaStyleKey,
    charStyleName: "Statement" as CharStyleKey,
    displayName: "발문하단",
    engName: "",
  },
  ...
] as const;

/**
 *
 * ID는 name의 알파벳 순으로 자동 할당됩니다:
 * - Default: 0 (항상 첫 번째)
 * - 나머지: 알파벳 순으로 자동 정렬
 * - 새 스타일 추가 시 아무 위치에나 추가 가능
 */
export const UNIFIED_PARAS = [
  // 0: Default (기본 문단 - 바탕글)
  {
    name: "Default",
    tabName: "Default",
    borderFillName: "Default",

    condense: 0,
    snapToGrid: 1,
    align: { horizontal: "JUSTIFY", vertical: "BASELINE" },
    heading: { type: "NONE", level: 0 },
    breakSetting: {
      breakLatinWord: "KEEP_WORD",
      breakNonLatinWord: "KEEP_WORD",
      widowOrphan: 0,
      keepWithNext: 0,
      keepLines: 0,
      pageBreakBefore: 0,
      lineWrap: "BREAK",
    },
    margin: { intent: 0, left: 0, right: 0, prev: 0, next: 0 },
    marginDefault: { intent: 0, left: 0, right: 0, prev: 0, next: 0 },
    lineSpacing: { type: "PERCENT", value: 165 },
    border: {
      offsetLeft: 0,
      offsetRight: 0,
      offsetTop: 0,
      offsetBottom: 0,
      connect: 0,
      ignoreMargin: 0,
    },
  },

  // 1: Statement (발문 - 문항의 주요 본문)
  {
    name: "Statement",
    tabName: "Statement",
    borderFillName: "None",
    numberingName: "Statement",

    condense: 50,
    snapToGrid: 0,
    align: { horizontal: "LEFT", vertical: "CENTER" },
    heading: { type: "NUMBER", level: 0 },
    breakSetting: {
      breakLatinWord: "KEEP_WORD",
      breakNonLatinWord: "BREAK_WORD",
      widowOrphan: 0,
      keepWithNext: 0,
      keepLines: 0,
      pageBreakBefore: 0,
      lineWrap: "BREAK",
    },
    margin: { intent: -1130, left: 0, right: 0, prev: 0, next: 1130 },
    marginDefault: {
      intent: -2260,
      left: 0,
      right: 0,
      prev: 0,
      next: 2260,
    },
    lineSpacing: { type: "PERCENT", value: 165 },
    border: {
      offsetLeft: 0,
      offsetRight: 0,
      offsetTop: 0,
      offsetBottom: 0,
      connect: 0,
      ignoreMargin: 0,
    },
  },
  ...
}

/**
 * 통합 글자 속성 정의
 *
 * ID는 name의 알파벳 순으로 자동 할당됩니다:
 * - Default: 0 (항상 첫 번째)
 * - 나머지: 알파벳 순으로 자동 정렬
 * - 새 스타일 추가 시 아무 위치에나 추가 가능
 */
export const UNIFIED_CHARS = [
  // 0: Default (기본 글자 - 바탕글)
  {
    name: "Default",
    borderFillName: "Default",

    fontNames: {
      HANGUL: "Default",
      LATIN: "Default",
      HANJA: "Default",
      JAPANESE: "Default",
      OTHER: "Default",
      SYMBOL: "Default",
      USER: "Default",
    },

    height: 1150, // 11.5 pt
    ratio: [100, 100, 100, 100, 100, 100, 100],
    spacing: [0, 0, 0, 0, 0, 0, 0],
  },

  // 1: Statement (발문 글자)
  {
    name: "Statement",
    borderFillName: "Default",

    fontNames: {
      HANGUL: "ShinmyungJoong",
      LATIN: "HanyangShinmyungjo",
      HANJA: "ShinmyungJoong",
      JAPANESE: "ShinmyungJoong",
      OTHER: "ShinmyungJoong",
      SYMBOL: "ShinmyungJoong",
      USER: "Myungjo",
    },

    height: 1150,
    ratio: [95, 95, 95, 95, 95, 95, 95],
    spacing: [-3, -5, -5, -5, -5, -5, -5],
  },
  ...
}