Go to file
copilot-swe-agent[bot] 333618bb57 Fix glue parameter caching inconsistency for multi-font paragraphs
When multiple paragraphs with different fonts were processed, subsequent
executions would use wrong glue parameters from the cache. This caused
misalignment because different fonts have different spacing values.

Changes:
- Add glue-params field to ekp-para struct to store params at creation
- Add helper functions: ekp--para-glue-ideal/shrink/stretch/min/max
- Update all C module interface functions to use para's stored params
- Update all glue computation functions for consistency

Co-authored-by: Kinneyzhang <38454496+Kinneyzhang@users.noreply.github.com>
2026-01-25 10:52:45 +00:00
.phrase add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00
dictionaries first commit 2025-07-26 23:52:04 +08:00
ekp_c Fix C module to match Elisp behavior for last-line overflow handling 2026-01-25 10:32:06 +00:00
images update readme 2025-07-27 21:35:44 +08:00
tests refactor ekp cache and code improve 2026-01-24 22:40:53 +08:00
_codeql_detected_source_root Fix C module to match Elisp behavior for last-line overflow handling 2026-01-25 10:32:06 +00:00
.gitignore add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00
AGENTS.md code improve 2026-01-24 20:44:38 +08:00
DEVELOPER_ZH.md add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00
DEVELOPER.md add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00
ekp-hyphen.el refactor ekp cache and code improve 2026-01-24 22:40:53 +08:00
ekp-utils.el add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00
ekp.el Fix glue parameter caching inconsistency for multi-font paragraphs 2026-01-25 10:52:45 +00:00
readme_zh.md add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00
readme.md add dynamic moudle to improve prefermance 2026-01-25 13:50:46 +08:00

Emacs-KP: Knuth-Plass Line Breaking for Emacs

中文文档 | Developer Guide

Emacs-kp implements the Knuth-Plass optimal line breaking algorithm with full support for CJK (Chinese, Japanese, Korean) and Latin mixed text typesetting.

Demo

Features

  • Optimal Line Breaking: Uses Knuth-Plass algorithm for globally optimal paragraph layout.
  • CJK Support: Full support for Chinese, Japanese, Korean with mixed Latin text.
  • Hyphenation: Frank Liang's algorithm with language-specific dictionaries.
  • Text Properties Preserved: Font faces, colors, and other Emacs text properties are maintained.
  • C Module Acceleration: Optional multi-threaded C module for 16-29x speedup.
  • Automatic Font Handling: Spacing parameters computed from actual font metrics.

User Guide

Quick Start

  1. Install Dependencies: Ensure you have a C compiler if you plan to use the C module (recommended for performance).

  2. Configuration:

(add-to-list 'load-path "/path/to/emacs-kp")
(require 'ekp)

;; Basic usage: justify text to 600 pixels width
(ekp-pixel-justify "Your paragraph text here..." 600)

;; Find optimal width in a range (returns (text . optimal-width))
(ekp-pixel-range-justify "Your text" 400 800)

Configuration

Language Settings

ekp-latin-lang (default: "en_US")

Primary Latin language for hyphenation. Supported languages are in dictionaries/ directory:

  • en_US, en_GB - English
  • de_DE - German
  • fr - French
  • es - Spanish
  • And many more...
(setq ekp-latin-lang "de_DE")

Spacing Parameters

Use ekp-param-set to configure spacing (in pixels). If not set, defaults are computed automatically from font metrics.

(ekp-param-set lws-ideal lws-stretch lws-shrink
               mws-ideal mws-stretch mws-shrink
               cws-ideal cws-stretch cws-shrink)
Parameter Group Description
lws-* Latin Word Space: between Latin words
mws-* Mixed Word Space: between Latin and CJK
cws-* CJK Word Space: between CJK characters

K-P Algorithm Parameters

Variable Default Description
ekp-line-penalty 10 Base cost per line break
ekp-hyphen-penalty 50 Extra cost for hyphenated breaks
ekp-adjacent-fitness-penalty 100 Cost for inconsistent line tightness
ekp-last-line-min-ratio 0.5 Minimum fill ratio for last line
ekp-looseness 0 Target line count offset (±n lines)

For large texts, the optional C module provides significant performance improvement through multi-threaded parallel computation.

Building

cd ekp_c
make

Requirements: C11 compiler, Emacs 27.1+

Loading

(require 'ekp-utils)

;; Load and initialize C module
(ekp-c-module-load)

;; Optional: Load hyphenation dictionary for C module
(ekp-c-load-dictionary "en_US")

Once loaded, ekp-use-c-module defaults to t, and all justification functions will automatically use the C module.


Algorithm & Architecture

For a detailed explanation of the internal architecture, algorithms, and API reference, please refer to the Developer Guide.

Credits