
简介一份适合直接A4打印的48个国际音标速查表面向英语初学者、备考学生及口语爱好者也适合教师课堂辅助教学使用。资源为单个PDF文件包体约695KB排版简洁、标音清晰既可打印成纸质卡贴墙备查也可存入手机随时翻阅。预览中可见该表按元音、辅音分类排版元音细分长元音、短元音与双元音辅音覆盖清浊辅音、鼻音、似拼音和半元音每个音标还配有发音要领、词汇拓展与实用句型例如用we、she、meet练习长元音[i:]用that、bag、apple体会[æ]的开口度同时列出常见单词和例句便于边看边读在跟读中自然记住发音位置和口型变化。目前已有1041人下载学习无论日常口语纠音还是考试前快速过一遍音标这份材料都能提供有效的参照。1. A4打印版48音标表为什么一个PDF也能做得很有技术含量一张48个国际音标的A4打印PDF表面上只是把音标符号列成表格实际却要跨过字体覆盖、网格排版、页面边距、字体嵌入和打印缩放几道坎。很多人在网上下载现成PDF打印后音标符号变成方框或者长音符号“ː”被替换成普通冒号问题往往不在打印机而在PDF里的字体没有被正确内嵌又或者用了不支持Unicode IPA扩展区的字体。这行需求背后是一类很具体的自动化任务数据固定、版式固定但需要按A4规格生成可打印文件。这篇文章会顺着这条线先理清48个音标的机器可读数据再分别用Python和XeLaTeX生成PDF最后给出一套打印前校验手段。适合做教学资料生成器、课程模板工具也适合想彻底弄懂PDF字体与A4排版的工程师。2. 先锁定48个音标的集合与字体Unicode分布这一步不做后面排版就是空转。先要把“48个”到底是哪48个写死再确认这些符号在Unicode里的位置和需要的字体覆盖范围。2.1 48个音标的准确数据集元音20、辅音28英语音标示例中的“48个”是国内英语教学常用归类并不是国际语音学协会的完整IPA表。IPA官方表包含上百个符号这里只保留英语发音教学常用的元音20个、辅音28个。国内教材有时把/tr/ /dr/ /ts/ /dz/ 计入辅音虽然严格来说它们是辅音连缀但作为音标表使用时收入进去更贴近课堂需要。元音分为单元音12个和双元音8个。单元音里有长音符号 ːU02D0参与例如/iː/、/ɜː/、/ɑː/这个符号不是ASCII冒号而是独立的Unicode字符字体必须单独覆盖。下面是完整分类分类数量符号一览单元音12iː ɪ e æ ɜː ə ʌ ɑː ɒ ɔː ʊ uː双元音8eɪ aɪ ɔɪ aʊ əʊ ɪə eə ʊə辅音28p b t d k ɡ f v s z θ ð ʃ ʒ tʃ dʒ tr dr ts dz h m n ŋ l r j w在代码里把这些数据做成字典标签用“元音”和“辅音”值是二元组列表每个二元组由音标符号和例词组成。这样后续无论用ReportLab还是LaTeX都能直接从同一份数据源出PDF。# ipa_data.py # -*- coding: utf-8 -*- 48个英语国际音标数据符号字段保留Unicode原样。 PHONEMES { 元音: [ (iː, see), (ɪ, sit), (e, bed), (æ, cat), (ɜː, bird), (ə, about), (ʌ, cup), (ɑː, car), (ɒ, hot), (ɔː, door), (ʊ, book), (uː, food), (eɪ, day), (aɪ, my), (ɔɪ, boy), (aʊ, now), (əʊ, go), (ɪə, ear), (eə, air), (ʊə, tour), ], 辅音: [ (p, pen), (b, bad), (t, tea), (d, dog), (k, cat), (ɡ, go), (f, fish), (v, very), (s, sun), (z, zoo), (θ, think), (ð, this), (ʃ, she), (ʒ, pleasure), (tʃ, cheese), (dʒ, jump), (tr, tree), (dr, dress), (ts, cats), (dz, beds), (h, hot), (m, milk), (n, nose), (ŋ, sing), (l, leg), (r, red), (j, yes), (w, wet), ], }这个字典是后面所有生成脚本的共享数据源。字段顺序就是打印顺序元音在上、辅音在下双元音排在单元音后面正好覆盖常见课堂讲解顺序。注意“ɡ”是U0261不是ASCII字母g如果生成数据时从键盘输入了普通的g很多IPA字体会把它渲染成错误的字形。同样“ɪ”也不是英文大写字母I它是U026A字体里专门有对应字形。2.2 IPA符号不是普通字符字体覆盖与组合用符IPA Extensions区段的起始位置在U0250很多常见字体根本没有实现这一块。制作PDF之前先确认目标字体是否覆盖以下三个区段Unicode区段涉及本例的符号U0250–U02AF IPA Extensionsə ɜː ɡ ʃ ʒ ŋ ʊ ɒ ɔ ɪ ɑ ʌ θ ð 等U02B0–U02FF Spacing Modifier Lettersː 长音符号 U02D0U1D00–U1D7F Phonetic Extensions部分音标附加符数据和代码可以写得很规整但如果字体不覆盖生成出来就是豆腐块。最稳妥的选择是开源的 Charis SIL、Doulos SIL 或 DejaVu Sans。DejaVu Sans 在Linux发行版里几乎都自带适合快速验证Charis SIL 的字形更接近英语教材的印刷体适合最终打印。字体确认后后续代码只要注册一次所有音标符号都用它渲染。另一个容易踩的点是双元音在数据里存成两个码位比如/eɪ/就是“e”加“ɪ”中间没有零宽连接符。ReportLab和XeLaTeX会按普通文本流渲染只要字体支持会自动连排。而长音符号“ː”的位置容易被忽略很多PDF生成工具默认字体不支持U02D0就会回退到系统字体导致打印出来在中间某个位置变框。所以后面的每一步校验都会重点检查这个符号。3. 用 Python ReportLab 生成一个真正可打印的A4音标表PDF有了数据源接下来用ReportLab把它变成PDF。ReportLab的Platypus框架适合做这种固定网格的内容核心是Table和ParagraphStyle。3.1 最小项目结构数据与生成脚本分开我一般会把音标数据放在单独文件中生成脚本只负责排版。目录结构大致如下ipa_a4/ ├── ipa_data.py ├── build_pdf.py └── fonts/ └── CharisSIL-Regular.ttf字体文件放到fonts目录脚本里用相对路径引用。这样后续换字体或者加版本不需要动数据文件。ReportLab本身不带IPA字体必须先把TTF字体注册到pdfmetrics里。3.2 注册支持IPA的TTF字体ReportLab的标准内置字体不支持IPA扩展区常见做法是调用TTFont注册。下面这段代码放在build_pdf.py开头把Charis SIL注册为“IPAFont”# build_pdf.py from pathlib import Path from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle from ipa_data import PHONEMES BASE_DIR Path(__file__).parent FONT_PATH BASE_DIR / fonts / CharisSIL-Regular.ttf pdfmetrics.registerFont(TTFont(IPAFont, str(FONT_PATH))) ipa_style ParagraphStyle( IPAStyle, fontNameIPAFont, fontSize14, leading18, )registerFont这一步决定了PDF里是否能内嵌对应字形。TTFont会把TTF文件的字形数据带进PDF只要路径正确生成的PDF即使拿到没有装字体的机器上也不会变方框。ParagraphStyle里的leading设为18pt是为了让音标字符在单元格内不挤在一起。3.3 用Platypus Table做三列网格A4宽度210mm左右边距各15mm内容区宽度180mm。每个音标单元格放“音标 例词”音标用14号例词用10号列宽取180/3 60mm在三列网格下文字不会换行。生成脚本如下def build_pdf(): doc SimpleDocTemplate( str(BASE_DIR / ipa_a4.pdf), pagesizeA4, leftMargin15, rightMargin15, topMargin15, bottomMargin15, ) story [] story.append(Paragraph(英语国际音标表48个, getSampleStyleSheet()[Title])) story.append(Spacer(1, 12)) for group, items in PHONEMES.items(): story.append(Paragraph(group, getSampleStyleSheet()[Heading2])) story.append(Spacer(1, 6)) rows [] row [] for symbol, word in items: text f{symbol} font size10{word}/font row.append(Paragraph(text, ipa_style)) if len(row) 3: rows.append(row) row [] if row: while len(row) 3: row.append() rows.append(row) col_width doc.width / 3.0 table Table(rows, colWidths[col_width] * 3) table.setStyle(TableStyle([ (FONT, (0, 0), (-1, -1), IPAFont, 14), (GRID, (0, 0), (-1, -1), 0.5, colors.grey), (LEFTPADDING, (0, 0), (-1, -1), 6), (RIGHTPADDING, (0, 0), (-1, -1), 6), (TOPPADDING, (0, 0), (-1, -1), 6), (BOTTOMPADDING, (0, 0), (-1, -1), 6), ])) story.append(table) story.append(Spacer(1, 10)) doc.build(story) if __name__ __main__: build_pdf()代码里的TableStyle指定了整张表的默认字体和边距但Paragraph内部实际渲染用的是自己的样式。所以真正管用的是在创建Paragraph时传入的ipa_style。把音标字符放在Paragraph里而不是直接作为Table字符串是为了便于配置字号和行距PDF里也不会因为文本太长被Table自动剪切。空行用空字符串补齐是为了保持表格的行数和边框完整性否则最后一行只有单个音标时三列边框会缺一块。3.4 运行命令与输出验证在项目根目录执行python build_pdf.py正常会生成ipa_a4.pdf。打开PDF第一件事是看/iː/里的长音符号是否显示为一根细竖线而不是两个短横。如果显示正常说明字体对U02D0的覆盖生效如果是方框多半是字体没注册成功或路径写错。此时检查脚本输出TTFont只支持单个TTF如果字体文件是TTC集合需要先拆出单独的TTF再用。4. 想走出版级排版XeLaTeX Charis SIL 的方案ReportLab适合快速生成但排版细节还是LaTeX更好。音标表虽然简单但用上XeLaTeX的字体直接映射和booktabs表格会显得干净得多。4.1 XeLaTeX 和 LaTeX 的字体兼容差异传统LaTeX要安装tipa宏包才能打音标而且和许多自定义字体配合麻烦。XeLaTeX直接使用系统字体Unicode码位怎么编码就怎么渲染不需要额外的音标转义命令。常见做法是在fontspec里把主字体设为Charis SIL然后直接在表格里写音标字符。注意这段代码不能用pdflatex编译必须用xelatex编译因为fontspec和Unicode字符都依赖XeTeX引擎。如果系统里没有Charis SIL可以用fc-list先查一下有哪些字体fc-list | grep -i charis输出为空时把主字体换成DejaVu Sans\setmainfont{DejaVu Sans}DejaVu Sans的IPA字形比Charis SIL略细但胜在几乎所有Linux发行版默认都装。macOS和Windows上只要系统装了对应字体fontspec也能直接调用。4.2 一份可编译的.tex模板下面是一份简化的可编译模板把元音和辅音分别放在两个table里用booktabs画线。实际使用时不建议手写音标可以把ipa_data.py里的数据用一个Python小脚本转成LaTeX表格行但这里先给出手写模板方便对照。% ipa_a4.tex % 编译xelatex ipa_a4.tex \documentclass[a4paper,12pt]{article} \usepackage{fontspec} \usepackage{booktabs} \usepackage[margin15mm]{geometry} \setmainfont{Charis SIL} \begin{document} \begin{center} {\LARGE\bfseries 英语国际音标表48个} \end{center} \section*{元音20个} \begin{tabular}{{}llllll{}} \toprule iː ɪ e æ ɜː ə \\ ʌ ɑː ɒ ɔː ʊ uː \\ eɪ aɪ ɔɪ aʊ əʊ ɪə \\ eə ʊə \\ \bottomrule \end{tabular} \section*{辅音28个} \begin{tabular}{{}lllllll{}} \toprule p b t d k ɡ f \\ v s z θ ð ʃ ʒ \\ tʃ dʒ tr dr ts dz h \\ m n ŋ l r j w \\ \bottomrule \end{tabular} \end{document}这里用tabular直接摆放符号不写例词适合做教室张贴版。如果要把例词也放进去可以用三列一行的嵌套表格和ReportLab版做法类似。booktabs的\toprule和\bottomrule让表格更接近正式出版物的印刷风格。4.3 用geometry控制A4边距和字号模板里用geometry包设定A4纸和15mm边距。A4纸宽210mm边距15mm时表格宽度默认会填满整个文本区。辅音表有7列如果列宽紧张可以把字号调小一档在tabular环境前加\small或者把边距放宽到12mm。字符间距紧一点打印出来反而更清晰。还有一点容易忽略.tex文件必须保存为UTF-8无BOM。如果编辑器另存为GBKXeLaTeX读入的音标字符会乱码甚至变成方框。提交到CI流程前可以在终端里用file命令确认编码格式避免在别人机器上编译时出现奇怪结果。5. 打印前的校验与A4适配技巧5.1 用pdffonts检查字体嵌入生成PDF后用poppler-utils提供的pdffonts检查pdffonts ipa_a4.pdf输出会列出每款字体的名称和嵌入状态。重点关注emb列如果显示no说明字体没有嵌入PDF换到别的设备打印时很可能被替换成不支持IPA的字体。Charis SIL在ReportLab里通过TTFont注册后正常emb是yes。XeLaTeX也默认嵌入TrueType或OpenType字体。如果pdffonts输出里出现了某个回退字体名称比如DejaVuSans旁边的emb是no说明字体注册不彻底需要回到生成脚本里排查路径。type列如果是TrueType或CID TrueType都没问题如果出现Type 3说明字形不是标准字体打印时容易出问题。5.2 Ghostscript渲染页面检查符号字体嵌入状态正常不代表字形渲染就正确。用Ghostscript把第一页转成高清PNGgs -dNOPAUSE -dBATCH -sDEVICEpng16m -r150 -dFirstPage1 -dLastPage1 \ -sOutputFileipa_page1.png ipa_a4.pdf用看图工具放大到200%逐个检查/iː/、/ɜː/、/ʊə/这些含长音和双元音的位置。重点看长音符号“ː”是否是一条清晰的竖线而不是一个小方块/ɡ/是否显示为印刷体的g/ŋ/和/ɪ/的词形是否和ASCII字母有明显区别。150dpi足够观察字形轮廓不需要更高分辨率。5.3 A4打印时禁用自动缩放最后是实际打印。很多PDF阅读器默认“适合打印”会把A4缩放到可打印区域造成整张表缩放比例不统一。打印设置里选择“实际大小”或“自定义缩放100%”页面尺寸选A4。如果打印机是U盘直打的工程机还要在驱动里确认纸盒规格是A4。一个更隐蔽的坑是PDF本身不是A4。用pdfinfo查一下pdfinfo ipa_a4.pdf | grep Page sizeA4对应的点数是595 x 841 pts如果显示612 x 792 pts就是Letter。打印前发现尺寸不对最稳的处理是回到生成脚本里显式传入pagesizeA4不要在打印驱动里强行缩放。提示如果打印后音标符号正常但例词发虚通常是主字体和例词字体不是同一个渲染引擎。ReportLab里可以给例词单独设置一个ParagraphStyle用系统默认字体避免和IPA字体混排。本文还有配套的精品资源点击获取