在现有 pdf-generation SKILL.md 的"已知坑"清单末尾(坑9之后)追加以下条目,其余内容保持不变:
坑10(新增,2026-07-30):正文出现多个美元金额($760B、$5.71等)时,被pandoc/xelatex当成LaTeX数学模式分隔符,导致数字乱序/丢字
现象: 某一段落里连续出现2个以上$数字(如"资本开支约$760B,但当期只费用化约$211B,约$549B递延...五家合计净利润增长25%至约$506B,但合计自由现金流反而下降约91%至约$16B"),渲染后该段落内的数字全部错位、部分数字消失、单位字母(B)脱离原位置。用image工具做视觉检查最容易发现(表现为看起来像"乱码",但pdftotext提取文本会更清楚地看出数字顺序被打乱、部分$金额整体消失)。类似地,单个孤立的$数字(如"布伦特原油+7.2%至$90.12")本身不会立刻报错,但会和文档后面某处配对的下一个$一起组成一对数学模式分隔符,把中间大段正文都吞进数学模式渲染,导致下游多页出现同样的乱序问题——不能只查当前这一句,要查全文所有$出现的奇偶性。
根因: Markdown里的$...$会被pandoc转换为LaTeX的inline math模式($...$包裹的内容按数学公式解析)。原始研报草稿里的美元金额($760B、$5.71等)不是数学公式,但字符层面和LaTeX数学分隔符完全一样,pandoc/xelatex无法区分意图,只能按第一个$到下一个$之间的内容强制走数学排版规则,导致普通数字、单位字母被当成数学变量重新排列或丢弃。
修复: 生成PDF前,对markdown源文件里所有紧跟数字的美元符号做批量转义,把$替换成\$(反斜杠转义,pandoc会将其识别为字面美元符号,不触发数学模式)。可用如下检查+替换流程:
# 检查是否存在未转义的 $数字(正则要求$前面不是反斜杠)
grep -n '[^\\]\$[0-9]' report.md
# 用python批量转义(比sed更安全处理UTF-8中文上下文)
python3 -c "
import re
path = 'report.md'
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
new_content = re.sub(r'(?<!\\\\)\\\$(?=[0-9])', r'\\\\\$', content)
with open(path, 'w', encoding='utf-8') as f:
f.write(new_content)
"
渲染完成后必须用pdftotext -f <页码> -l <页码> output.pdf -核对含美元金额的段落,确认数字顺序和金额完整,不能只看xelatex编译有没有报错退出——这类问题编译时通常不会报错或只报无害的"Missing character"警告,容易被误判为字体fallback问题而忽略真正的数学模式吞字问题。
教训: 遇到pdflatex/xelatex渲染警告里出现"Missing character",不能默认归因为"字体缺少中文字形做fallback"就跳过——先用pdftotext把对应页面的文本提取出来做逐字核对,确认是否存在数字/单位错位、消失、或大段文字被跳过,再决定是否是无害警告还是需要修复的实质性排版错误。视觉检查(image工具截图)配合pdftotext文本提取双重核验,比单独用image工具肉眼检查更容易发现"看起来像乱码但实际是数学模式吞字"这类问题。