feat(latex): 新增 LaTeX 排版系统,从 Markdown 生成 ctexbook

- 新增 officefile/latex/ 目录,包含 main.tex、preamble.tex 及 14 个章节 + 10 个附录 tex 文件
- md→tex 转换流程:pandoc 转换 + _postprocess.py 后处理(去编号、修破折号、清标签)
- 修复 5 个 md 源文件的标题层级(H1→H2 降级,统一层级结构)
- 配置 VS Code LaTeX Workshop(xelatex + ctexbook 编译链)
- 新增 VS Code workspace 和 .gitignore(排除 LaTeX 编译产物)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-29 12:21:15 +08:00
commit d4665a362e
30 changed files with 12168 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
import os
outdir = os.path.join(os.path.dirname(__file__), 'chapters')
for fname in sorted(os.listdir(outdir)):
if not fname.endswith('.tex'):
continue
fpath = os.path.join(outdir, fname)
with open(fpath, 'r', encoding='utf-8') as fh:
content = fh.read()
lines = content.split('\n')
prev_cmd = ''
prev_title = ''
for i, line in enumerate(lines):
s = line.strip()
matched = None
for cmd in ['\\chapter{', '\\section{', '\\subsection{', '\\subsubsection{']:
if s.startswith(cmd):
matched = cmd
break
if matched:
# Check for level jumps (skip of 1 or more intermediate levels)
levels = {'\\chapter{': 0, '\\section{': 1, '\\subsection{': 2, '\\subsubsection{': 3}
if prev_cmd and matched in levels and prev_cmd in levels:
jump = levels[matched] - levels[prev_cmd]
if jump > 1:
title = s[len(matched):-1]
print(f'{fname}:{i+1}: {prev_cmd.replace("{","")} -> {matched.replace("{","")} ({jump} levels): {title[:60]}')
prev_cmd = matched