KotlinTeX
0.3.3indexedCross-platform LaTeX math expression rendering library, offering high-quality renderings on Android and iOS with easy integration, leveraging Compose Multiplatform for UI support.
Cross-platform LaTeX math expression rendering library, offering high-quality renderings on Android and iOS with easy integration, leveraging Compose Multiplatform for UI support.
一个基于 Kotlin Multiplatform 的跨平台 LaTeX 数学表达式渲染库,支持 Android / iOS / Jvm 平台。
https://github.com/user-attachments/assets/b240a3e7-7a29-437d-8f36-2c248b55669c
本项目基于开源项目 AndroidMath 改写而来,将所有代码转换为 Kotlin 并使用 Kotlin Multiplatform 技术实现跨平台支持。通过 Compose Multiplatform 为 Android / iOS / Jvm 平台提供高质量的 LaTeX 数学表达式渲染功能。
将以下内容添加到 settings.gradle.kts:
pluginManagement {
repositories {
mavenCentral() // 或者 maven { url = uri("https://jitpack.io") }
}
}
然后,在你的 build.gradle.kts 中添加依赖:
dependencies {
implementation("io.github.darriousliu:katex-core:0.3.2")
}
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.github.darriousliu:katex-core:0.3.2")
}
}
}
请确保您的项目已正确配置 Kotlin Multiplatform 和 Compose Multiplatform。
在JVM平台上使用时,需要添加平台特定的FreeType本地库依赖:
@Composable
fun LatexExample() {
MTMathView(
latex = "\\frac{a}{b}",
modifier = Modifier.fillMaxWidth(),
fontSize = 20.sp,
textColor = Color.Black,
font = null,
mode = MTMathViewMode.KMTMathViewModeDisplay,
textAlignment = MTTextAlignment.KMTTextAlignmentLeft,
displayErrorInline = true,
errorFontSize = 20.sp,
)
}
latexFormulas = listOf(
,
,
,
)
: () {
state = MutableStateFlow(emptyList<MTMathList>())
{
viewModelScope.launch(Dispatchers.Default) {
state.value = latexFormulas.mapNotNull { latex ->
(latex.isNotEmpty()) {
newParseError = MTParseError()
list = MTMathListBuilder.buildFromString(latex, newParseError)
(newParseError.errorCode != MTParseErrors.ErrorNone) {
} {
list
}
} {
}
}
}
}
}
@Composable
fun LatexList(
viewModel: LatexViewModel = koinViewModel(),
modifier: Modifier = Modifier
) {
LaunchedEffect(Unit) {
viewModel.parseLatex()
}
val state by viewModel.state.collectAsStateWithLifecycle()
LazyColumn(modifier = modifier) {
items(state) { mathList ->
MTMathView(
mathList = mathList,
fontSize = 20.sp,
textColor = Color.Black,
font = ,
mode = MTMathViewMode.KMTMathViewModeDisplay,
textAlignment = MTTextAlignment.KMTTextAlignmentLeft,
displayErrorInline = ,
errorFontSize = sp,
)
}
}
}
同步加载预定义字体:
@Composable
fun CustomFontLatexExample() {
val predefinedFont = rememberMTFont(
fontSize = 20.sp,
mathFont = MTMathFont.LatinModernMath,
)
MTMathView(
latex = "\\frac{a}{b}",
modifier = Modifier.fillMaxWidth(),
fontSize = 20.sp,
textColor = Color.Black,
font = predefinedFont,
mode = MTMathViewMode.KMTMathViewModeDisplay,
textAlignment = MTTextAlignment.KMTTextAlignmentLeft,
displayErrorInline = true,
errorFontSize = 20.sp,
)
}
异步加载自定义字体并应用到 LaTeX 渲染中:
@Composable
fun CustomFontLatexExample() {
val customFont rememberMTFont(
fontSize = sp,
fontName =
) {
Res.readBytes()
}
(customFont != ) {
MTMathView(
latex = ,
modifier = Modifier.fillMaxWidth(),
fontSize = sp,
textColor = Color.Black,
font = customFont,
mode = MTMathViewMode.KMTMathViewModeDisplay,
textAlignment = MTTextAlignment.KMTTextAlignmentLeft,
displayErrorInline = ,
errorFontSize = sp,
)
}
}
# 构建iOS产物
# 下载freetype库到external目录
git submodule update --init --recursive
cd external/freetype
# 构建 FreeType 库
./build-ios-cmake.sh
对于分发不同平台的JVM应用,通过在不同平台(Windows/macOS/Linux)上构建来自动选择合适的本地库。
本项目基于 AndroidMath 项目开发,感谢原作者的贡献。
欢迎提交 Issue 和 Pull Request 来帮助改进这个项目。
如有问题或建议,请通过 GitHub Issues 联系我们。
jvmMain.dependencies {
implementation(compose.desktop.currentOs)
// 检测平台
val currentOs = OperatingSystem.current()
val lwjglPlatform = when {
currentOs.isMacOsX -> "macos"
currentOs.isWindows -> "windows"
currentOs.isLinux -> "linux"
else -> error("Unsupported OS: $currentOs")
}
val processor = ArchUtils.getProcessor()
val lwjglArch = when {
processor.isAarch64 -> "arm64"
processor.is64Bit -> "x64"
else -> error("Unsupported architecture: ${processor.arch} ${processor.type}")
}
val lwjglNatives = "natives-$lwjglPlatform-$lwjglArch"
// 平台特定的本地库
runtimeOnly("org.lwjgl:lwjgl:${版本号}:$lwjglNatives")
runtimeOnly("org.lwjgl:lwjgl-freetype:${版本号}:$lwjglNatives")
}
Surfaced from shared tags and platforms — no rankings paid for.