|
@@ -2,6 +2,8 @@
|
|
|
|
|
|
|
|
namespace App\Services;
|
|
namespace App\Services;
|
|
|
|
|
|
|
|
|
|
+use Illuminate\Support\Facades\Log;
|
|
|
|
|
+
|
|
|
class MathFormulaProcessor
|
|
class MathFormulaProcessor
|
|
|
{
|
|
{
|
|
|
/**
|
|
/**
|
|
@@ -89,19 +91,48 @@ class MathFormulaProcessor
|
|
|
// 保留 \\+大写字母 的情况(换行符后跟文本,如 \\CD 应保持为 \\CD)
|
|
// 保留 \\+大写字母 的情况(换行符后跟文本,如 \\CD 应保持为 \\CD)
|
|
|
// 保留 \\+数字 或 \\+空白 的情况(矩阵换行符)
|
|
// 保留 \\+数字 或 \\+空白 的情况(矩阵换行符)
|
|
|
$fixEscapedCommands = function ($tex) {
|
|
$fixEscapedCommands = function ($tex) {
|
|
|
- // 保护 cases 环境中的换行符 \\,避免被误判为 LaTeX 命令
|
|
|
|
|
- $placeholder = '__KATEX_CASES_BR__';
|
|
|
|
|
- $tex = preg_replace_callback('/\\\\begin\{cases\}([\s\S]*?)\\\\end\{cases\}/', function ($m) use ($placeholder) {
|
|
|
|
|
- $content = str_replace('\\\\', $placeholder, $m[1]);
|
|
|
|
|
- return '\\begin{cases}' . $content . '\\end{cases}';
|
|
|
|
|
- }, $tex);
|
|
|
|
|
|
|
+ // 保护多行环境中的换行符 \\,避免被误判为 LaTeX 命令
|
|
|
|
|
+ $placeholder = '__KATEX_BR__';
|
|
|
|
|
+ $originalTex = $tex;
|
|
|
|
|
+ $protectedEnvs = [];
|
|
|
|
|
+ $environments = [
|
|
|
|
|
+ 'cases',
|
|
|
|
|
+ 'aligned',
|
|
|
|
|
+ 'align',
|
|
|
|
|
+ 'align*',
|
|
|
|
|
+ 'array',
|
|
|
|
|
+ 'matrix',
|
|
|
|
|
+ 'pmatrix',
|
|
|
|
|
+ 'bmatrix',
|
|
|
|
|
+ 'vmatrix',
|
|
|
|
|
+ 'Vmatrix',
|
|
|
|
|
+ 'gather',
|
|
|
|
|
+ 'split',
|
|
|
|
|
+ 'eqnarray',
|
|
|
|
|
+ ];
|
|
|
|
|
+ foreach ($environments as $env) {
|
|
|
|
|
+ $pattern = '/\\\\begin\{' . preg_quote($env, '/') . '\}([\s\S]*?)\\\\end\{' . preg_quote($env, '/') . '\}/';
|
|
|
|
|
+ $tex = preg_replace_callback($pattern, function ($m) use ($env, $placeholder) {
|
|
|
|
|
+ $content = str_replace('\\\\', $placeholder, $m[1]);
|
|
|
|
|
+ return '\\begin{' . $env . '}' . $content . '\\end{' . $env . '}';
|
|
|
|
|
+ }, $tex);
|
|
|
|
|
+ if ($tex !== $originalTex && !in_array($env, $protectedEnvs, true)) {
|
|
|
|
|
+ $protectedEnvs[] = $env;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// \\sqrt -> \sqrt, \\frac -> \frac, 但 \\CD 或 \\2 保持不变
|
|
// \\sqrt -> \sqrt, \\frac -> \frac, 但 \\CD 或 \\2 保持不变
|
|
|
// 【修复】只匹配小写字母,因为 LaTeX 命令都是小写
|
|
// 【修复】只匹配小写字母,因为 LaTeX 命令都是小写
|
|
|
$tex = preg_replace('/\\\\\\\\([a-z])/', '\\\\$1', $tex);
|
|
$tex = preg_replace('/\\\\\\\\([a-z])/', '\\\\$1', $tex);
|
|
|
|
|
|
|
|
- // 还原 cases 换行
|
|
|
|
|
- return str_replace($placeholder, '\\\\', $tex);
|
|
|
|
|
|
|
+ // 还原多行环境换行
|
|
|
|
|
+ $tex = str_replace($placeholder, '\\\\', $tex);
|
|
|
|
|
+ if ($protectedEnvs) {
|
|
|
|
|
+ Log::debug('MathFormulaProcessor: protected multiline line breaks', [
|
|
|
|
|
+ 'envs' => $protectedEnvs,
|
|
|
|
|
+ ]);
|
|
|
|
|
+ }
|
|
|
|
|
+ return $tex;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 1. 处理 $$...$$ 块级公式
|
|
// 1. 处理 $$...$$ 块级公式
|