本系统为 Laravel + Livewire + Filament 项目提供完整的 KaTeX 数学公式渲染解决方案,支持本地部署,无需依赖外网 CDN。
project/
├── app/
│ ├── Filament/
│ │ ├── Fields/
│ │ │ └── MathEditor.php
│ │ └── ...
│ ├── Livewire/
│ │ ├── Traits/
│ │ │ └── WithMathRender.php
│ │ └── MathRenderTest.php
│ └── ...
├── public/
│ ├── js/
│ │ ├── katex.min.js
│ │ └── math-render.js
│ └── css/
│ └── katex/
│ └── katex.min.css
├── resources/
│ ├── views/
│ │ ├── components/
│ │ │ └── math-render.blade.php
│ │ ├── filament/
│ │ │ └── fields/
│ │ │ └── math-editor.blade.php
│ │ ├── examples/
│ │ │ └── math-render-example.blade.php
│ │ └── livewire/
│ │ └── math-render-test.blade.php
│ └── ...
└── config/
└── math-render.php
# 下载 CSS
curl -s https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css -o public/css/katex/katex.min.css
# 下载 JavaScript
curl -s https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js -o public/js/katex.min.js
将提供的所有文件复制到对应目录。
在 resources/views/layouts/app.blade.php 或主布局文件中添加:
@push('scripts')
<script src="/js/math-render.js"></script>
@endpush
@push('styles')
<link rel="stylesheet" href="/css/katex/katex.min.css">
@endpush
<x-math-render content="已知二次函数 $f(x) = ax^2 + bx + c$" />
参数:
content: 包含 LaTeX 公式的文本class: 可选的自定义 CSS 类inline: 是否为行内模式(默认 false)@foreach($questions as $question)
<tr>
<td>{{ $question['code'] }}</td>
<td>
<x-math-render :content="$question['content']" />
</td>
</tr>
@endforeach
<?php
namespace App\Livewire;
use App\Livewire\Traits\WithMathRender;
use Livewire\Component;
class QuestionList extends Component
{
use WithMathRender;
public string $search = '';
#[Computed]
public function questions(): array
{
// 获取数据...
}
public function render()
{
return view('livewire.question-list');
}
}
{{-- 在 Livewire 视图中 --}}
<div class="math-render">
{{ $this->getMathContent($question['content']) }}
</div>
<?php
namespace App\Filament\Resources;
use App\Filament\Fields\MathEditor;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
class QuestionResource extends Resource
{
public static function form($form): Form
{
return $form
->schema([
// ...
MathEditor::make('stem')
->label('题目内容')
->required(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('stem')
->label('题目内容')
->formatStateUsing(fn ($state) => view('components.math-render', ['content' => $state])),
]);
}
}
已知函数 $f(x) = ax^2 + bx + c$
或者使用反斜杠:\(x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}\)
计算定积分:
$$
\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}
$$
或者:
\[
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
\]
分数:$\frac{a}{b}$
根号:$\sqrt{x}$ 或 $\sqrt[n]{x}$
上标:$x^2$ 或 $x^{2n}$
下标:$x_1$ 或 $x_{i,j}$
求和:$\sum_{i=1}^{n}$
积分:$\int_{a}^{b}$
极限:$\lim_{x \to 0}$
矩阵:
$$
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
$$
希腊字母:$\alpha, \beta, \gamma, \Delta$
运算符:$\pm, \times, \div, \infty$
// 触发所有数学公式重新渲染
window.MathRender.renderAll();
// 触发特定元素渲染
window.MathRender.render(document.getElementById('math-element'));
// 手动设置内容并渲染
const element = document.querySelector('.math-render');
element.dataset.mathContent = '新内容:$f(x) = x^2$';
window.MathRender.render(element);
document.addEventListener('math:rendered', () => {
console.log('数学公式渲染完成');
});
// 或者
document.addEventListener('math:render', () => {
console.log('触发数学公式渲染');
});
window.MathRenderConfig.maxAttempts = 100; // 最大重试次数
window.MathRenderConfig.delay = 50; // 重试延迟(毫秒)
window.MathRenderConfig.selector = '.my-math'; // 自定义选择器
默认启用错误容错,渲染失败会显示原始 LaTeX 代码。可以在控制台查看错误信息:
window.MathRenderConfig.errorHandling = false; // 禁用错误日志
属性:
content (string): 包含 LaTeX 的文本内容class (string, optional): 自定义 CSS 类inline (bool, optional): 是否行内显示示例:
<x-math-render
content="$f(x) = ax^2 + bx + c$"
class="text-lg"
:inline="true"
/>
可用方法:
columns(int $columns): 设置网格列数helperText(string $text): 设置帮助文本示例:
MathEditor::make('content')
->columns(12)
->helperText('支持 $...$, $$...$$ 格式')
可用方法:
renderMathContent(string $content): 预处理数学内容(服务器端)getMathContent($content): 获取待渲染内容triggerMathRender(): 手动触发渲染全局对象: window.MathRender
方法:
render(element): 渲染单个元素renderAll(): 渲染所有元素trigger(): 触发渲染事件config: 配置对象A: 检查以下几点:
.math-render 类A: 系统会自动监听 Livewire 事件,如果仍有问题:
// 手动触发
document.dispatchEvent(new Event('math:render'));
A: 在配置文件中添加:
// config/math-render.php
'macros' => [
'\\f' => '#1f(#2)',
],
A: 设置环境变量:
KATEX_AUTO_INIT=false
或 JavaScript:
window.MathRenderConfig.autoInit = false;
P06_SK001_59555 的选项出现 x2+4y2x^2+4y^2 连写,应在入库前拆分、补 ^ 或用 $...$ 包裹。当前渲染器正常,剩余问题属于内容质量,后续在题目生成与 OCR 导入时统一修复。完整示例请参考:
/resources/views/examples/math-render-example.blade.php/app/Livewire/MathRenderTest.php/resources/views/livewire/math-render-test.blade.php本系统使用 MIT 许可证。
如有问题,请查看浏览器控制台或参考本文档。