| name | codex-claude-academic-skills |
| description | Chinese-first academic research skills for paper writing, Office document generation, and scientific computing (MATLAB/Python) |
| triggers | ["help me write a research paper in Chinese","generate academic PPT from my paper","create literature review Word document","run MATLAB simulation for my experiment","polish my paper abstract and introduction","make a thesis defense presentation","analyze scientific data with Python","respond to reviewer comments"] |
Codex Claude Academic Skills
Skill by ara.so — Codex Skills collection.
A collection of three complementary skills for Chinese academic researchers covering paper writing, academic Office document generation, and scientific computing. All skills work in both Claude Code and Codex platforms.
What This Project Does
This project provides three specialized skills for academic workflows:
- research-writing-skill: Paper writing, editing, and reviewer response in Chinese
- office-academic-skill: Generate editable Word reports and PowerPoint presentations
- scientific-toolkit-skill: Scientific computing with MATLAB/Python and publication-quality figures
The skills are designed to work together across the research pipeline: data analysis → paper writing → presentation generation.
Installation
For Claude Code
git clone https://github.com/zLanqing/codex-claude-academic-skills.git
cd codex-claude-academic-skills
cp -r research-writing-skill ~/.claude/skills/
cp -r office-academic-skill ~/.claude/skills/
cp -r scientific-toolkit-skill ~/.claude/skills/
/plugin install zLanqing/codex-claude-academic-skills
For Codex
cd codex-claude-academic-skills
cp -r research-writing-skill ~/.codex/skills/
cp -r office-academic-skill ~/.codex/skills/
cp -r scientific-toolkit-skill ~/.codex/skills/
codex --plugin-url https://github.com/zLanqing/codex-claude-academic-skills
Project-Level Installation
Place skill directories in your project root:
mkdir -p .claude/skills/
cp -r path/to/research-writing-skill .claude/skills/
mkdir -p .codex/skills/
cp -r path/to/office-academic-skill .codex/skills/
Skill 1: research-writing-skill
Core Capabilities
- Write paper sections: abstract, introduction, related work, methods, experiments, discussion, conclusion
- Edit and polish existing drafts for logic, consistency, and terminology
- Generate reviewer response letters (rebuttal)
- Plan paper structure from vague ideas to detailed outlines
Usage Patterns
Writing a new section:
Polishing existing text:
"""
我们提出了一种新的算法,它很有效,实验结果显著优于传统方法。
"""
"""
我们提出了基于小波去噪的 BGS 重构算法。在 100 组实验数据集上,
相比传统高斯拟合方法,本方法的温度测量误差从 ±2.5°C 降低至 ±0.8°C,
空间分辨率从 1m 提升至 0.5m。
"""
Reviewer response:
"""
**Reviewer Comment:**
The sample size (n=30) is insufficient for statistical significance.
**Response:**
感谢审稿人的建议。我们已补充实验至 n=100(新增数据见附录 A)。
更新后的统计检验结果(t-test, p<0.01)已添加至第 4.2 节表 3。
修订稿中已说明样本量选择依据 Cohen's d 效应量计算(d=0.85, power=0.95)。
**Changes in manuscript:**
- Line 203-205: 补充样本量计算依据
- Table 3: 更新统计检验结果
- Appendix A: 新增 70 组实验数据
"""
Key Principles
- Chinese-first: Explanations, body text in Chinese; preserve English for paper titles, formulas, variable names, software commands, citations
- No fabrication: Never invent DOI, journal names, experimental values, or figure numbers
- Source marking: Label claims as "from user", "inferred", "suggested extension", or "original text"
- Measurable claims: Replace "significant improvement" with "error reduced from X to Y"
Reference Files
The skill includes built-in references under paper-writing/:
references/
├── section_rhetorical_moves/
│ ├── abstract.md # IMRaD structure for abstracts
│ ├── introduction.md # Hook → Gap → Contribution pattern
│ ├── methods.md # Replicability checklist
│ └── results.md # Figure-first narrative
├── writing_checklists/
│ ├── before_submission.md # Pre-submission self-check
│ └── revision_guide.md # Responding to major revisions
├── figure_templates/
│ └── multi_panel.md # Standards for composite figures
└── brainstorming_guide.md # From idea to paper blueprint
Skill 2: office-academic-skill
Core Capabilities
Word Documents:
- PDF → structured literature review report (.docx)
- Generate editable reports with headings, tables, figure placeholders, citations
- Version-controlled editing of existing .docx files
PowerPoint Presentations:
- Literature report slides, group meeting presentations
- Thesis defense slides (proposal, mid-term, final defense)
- Scientific poster presentations, outreach slides
Usage Patterns
Generate literature report from PDF:
from docx import Document
from docx.shared import Pt, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
title = doc.add_heading('文献阅读报告', level=1)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_heading('基本信息', level=2)
table = doc.add_table(rows=4, cols=2)
table.cell(0, 0).text = '标题'
table.cell(0, 1).text = 'Distributed Optical Fiber Sensing Using BOTDR'
table.cell(1, 0).text = '作者'
table.cell(1, 1).text = 'Zhang, Y., et al.'
table.cell(2, 0).text = '期刊'
table.cell(2, 1).text = 'J. Lightwave Tech., 2023, 41(5), 1234-1245'
table.cell(3, 0).text = 'DOI'
table.cell(3, 1).text = '10.1109/JLT.2023.1234567'
doc.add_heading('研究背景', level=2)
doc.add_paragraph('【来源: 论文第1节】分布式光纤传感技术...')
doc.add_heading('核心方法', level=2)
doc.add_paragraph('【来源: 论文图2及第3.1节】本文提出...')
doc.add_paragraph('[图2占位符: BOTDR系统示意图]')
doc.add_heading('实验结果', level=2)
doc.add_paragraph('【来源: 论文表1】在50km光纤上测试...')
doc.add_heading('个人评价', level=2)
doc.add_paragraph('【评价】优点: 空间分辨率达到0.5m;局限: 仅测试单模光纤...')
doc.save('文献报告_BOTDR_2023.docx')
Create thesis defense PPT:
from pptx import Presentation
from pptx.util import Inches, Pt
template = Presentation('template.pptx')
prs = Presentation()
prs.slide_master = template.slide_master
slide = prs.slides.add_slide(prs.slide_layouts[1])
title = slide.shapes.title
title.text = 'BOTDR空间分辨率提升至0.5m'
left = Inches(1)
top = Inches(2)
pic_placeholder = slide.shapes.add_textbox(left, top, Inches(8), Inches(4))
pic_placeholder.text = '[插入论文图3: 分辨率对比实验结果]'
source = slide.shapes.add_textbox(Inches(0.5), Inches(6.5), Inches(9), Inches(0.3))
source.text = '数据来源: 论文第4.2节, 表2'
source.text_frame.paragraphs[0].font.size = Pt(10)
prs.save('答辩PPT_初稿.pptx')
Edit existing PowerPoint:
from pptx import Presentation
prs = Presentation('答辩PPT_初稿.pptx')
slide = prs.slides[4]
slide.shapes.title.text = '实验验证与结果分析'
for shape in slide.shapes:
if shape.has_text_frame and '[插入论文图' in shape.text:
shape.left = Inches(5)
shape.top = Inches(1.5)
shape.width = Inches(4)
prs.save('答辩PPT_修订.pptx')
PPT Quality Standards
The skill enforces these rules:
- Action titles: "温度测量误差降低60%" not "实验结果"
- One idea per slide: No bullet-point essays
- Figure-driven: Technical claims backed by charts/equations
- Scientific rigor: Axes labels, units, legends, data sources
- Academic aesthetics: White/neutral backgrounds, color for emphasis only
Built-in Tools
Under references/:
office-docx/
├── ooxml_validator.py # Check DOCX against Office Open XML schema
└── schemas/ # XSD schemas for validation
office-pptx/
├── pptx_structure.md # PPTX OOXML anatomy
└── layout_examples/ # Common academic slide layouts
thesis-defense-pptx/scripts/
├── extract_thesis_context.py # Parse LaTeX/PDF for key content
├── clone_template.py # Preserve master slide styles
├── export_slides_png.py # Slide → PNG for review
└── check_text_overflow.py # Detect text box overflow
Skill 3: scientific-toolkit-skill
Core Capabilities
MATLAB/Octave:
- Signal/image processing, FFT, filtering, matrix operations
- Simulation, numerical methods
- Publication-quality figure export
Python Scientific Stack:
- NumPy, SciPy: Numerical computing, optimization
- pandas: Data manipulation and analysis
- matplotlib, seaborn: Publication-grade plots
- scikit-learn: Machine learning (classification, regression, clustering, PCA)
- statsmodels: Statistical modeling, time series
- SymPy: Symbolic math, equation derivation
- QuTiP: Quantum optics simulations
- pymatgen: Materials science (crystal structures, band structure)
- TimesFM: Time series forecasting
- NetworkX: Graph and network analysis
- Astropy: Astronomical/optical imaging data
Literature & Citations:
- Search: arXiv, PubMed, CrossRef, Semantic Scholar, OpenAlex
- DOI → BibTeX conversion, citation validation
Usage Patterns
MATLAB signal processing:
% User: "帮我用MATLAB分析这个BOTDR信号,提取BGS并计算温度"
% Skill generates:
% === BOTDR Signal Analysis ===
% Parameters (用户需确认):
fs = 1e9; % 采样率 [Hz] - 来源: 用户确认
fiber_length = 50e3; % 光纤长度 [m] - 来源: 用户确认
v_B0 = 10.86e9; % 参考Brillouin频移 [Hz] - 来源: 文献默认值 (SMF-28)
C_T = 1.0e6; % 温度系数 [Hz/°C] - 来源: 文献默认值
% Load signal
data = load('botdr_signal.mat');
raw_signal = data.raw; % [时间 x 频率扫描]
% Extract BGS (Brillouin Gain Spectrum)
[n_points, n_freq] = size(raw_signal);
freq_axis = linspace(10.5e9, 11.5e9, n_freq); % 频率扫描范围 [Hz]
BGS_peak_freq = zeros(n_points, 1);
for i = 1:n_points
[~, peak_idx] = max(raw_signal(i, :));
BGS_peak_freq(i) = freq_axis(peak_idx);
end
% Convert to temperature
delta_v_B = BGS_peak_freq - v_B0; % 频移差 [Hz]
temperature = delta_v_B / C_T; % 温度 [°C]
% Calculate spatial resolution
spatial_res = 0.5 * 3e8 / fs; % = c/(2*fs) [m]
% Plot results
figure('Position', [100, 100, 800, 600]);
subplot(2,1,1);
plot(1:n_points, BGS_peak_freq/1e9, 'LineWidth', 1.5);
xlabel('测量点', 'FontSize', 12);
ylabel('Brillouin频移 (GHz)', 'FontSize', 12);
title('沿光纤的BGS频移分布', 'FontSize', 14);
grid on;
subplot(2,1,2);
plot((1:n_points)*spatial_res/1000, temperature, 'LineWidth', 1.5);
xlabel('距离 (km)', 'FontSize', 12);
ylabel('温度 (°C)', 'FontSize', 12);
title(sprintf('温度分布 (空间分辨率: %.2f m)', spatial_res), 'FontSize', 14);
grid on;
% Export figure for paper
print('BGS_temperature_profile.png', '-dpng', '-r300');
% 【注释】未编造数据,所有物理量已标注来源
Python data analysis with scikit-learn:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
features = pd.read_csv('features.csv')
labels = pd.read_csv('labels.csv').values.ravel()
X_train, X_test, y_train, y_test = train_test_split(
features, labels, test_size=0.2, random_state=42, stratify=labels
)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
param_grid = {
'C': [0.1, 1, 10, 100],
'gamma': ['scale', 'auto', 0.001, 0.01],
'kernel': ['rbf', 'linear']
}
svm = SVC(random_state=42)
grid_search = GridSearchCV(svm, param_grid, cv=5, scoring='f1_macro', n_jobs=-1)
grid_search.fit(X_train_scaled, y_train)
best_model = grid_search.best_estimator_
print(f"最佳参数: {grid_search.best_params_}")
print(f"交叉验证F1分数: {grid_search.best_score_:.3f}")
y_pred = best_model.predict(X_test_scaled)
print("\n测试集分类报告:")
print(classification_report(y_test, y_pred))
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=np.unique(labels),
yticklabels=np.unique(labels))
plt.xlabel('预测标签', fontsize=12)
plt.ylabel('真实标签', fontsize=12)
plt.title('混淆矩阵 (SVM分类器)', fontsize=14)
plt.tight_layout()
plt.savefig('confusion_matrix.png', dpi=300)
Publication-quality matplotlib figure:
import matplotlib.pyplot as plt
import numpy as np
distance = np.linspace(0, 50, 100)
temperature = 25 + 5*np.sin(2*np.pi*distance/10)
strain = 100 + 50*np.cos(2*np.pi*distance/15)
plt.rcParams.update({
'font.size': 11,
'font.family': 'Arial',
'axes.linewidth': 1.2,
'xtick.major.width': 1.2,
'ytick.major.width': 1.2,
'lines.linewidth': 1.5
})
fig, ax1 = plt.subplots(figsize=(7, 4))
color_temp = 'tab:red'
ax1.set_xlabel('Distance (km)', fontsize=12)
ax1.set_ylabel('Temperature (°C)', color=color_temp, fontsize=12)
line1 = ax1.plot(distance, temperature, color=color_temp, label='Temperature')
ax1.tick_params(axis='y', labelcolor=color_temp)
ax1.grid(True, alpha=0.3)
ax2 = ax1.twinx()
color_strain = 'tab:blue'
ax2.set_ylabel('Strain (με)', color=color_strain, fontsize=12)
line2 = ax2.plot(distance, strain, color=color_strain, linestyle='--', label='Strain')
ax2.tick_params(axis='y', labelcolor=color_strain)
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper right', frameon=True, fontsize=10)
plt.title('Temperature and Strain Distribution along Fiber', fontsize=13, pad=10)
plt.tight_layout()
plt.savefig('dual_axis_plot.pdf', dpi=300, bbox_inches='tight')
plt.savefig('dual_axis_plot.png', dpi=300, bbox_inches='tight')
DOI to BibTeX:
import requests
doi = "10.1109/JLT.2023.1234567"
url = f"https://doi.org/{doi}"
headers = {"Accept": "application/x-bibtex"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
bibtex = response.text
print(bibtex)
with open('reference.bib', 'w', encoding='utf-8') as f:
f.write(bibtex)
else:
print(f"错误: 无法获取DOI {doi} 的元数据 (状态码: {response.status_code})")
Domain Focus
The skill is optimized for:
- Optics, optoelectronics, optical communications, fiber sensing
- BOTDR/BOTDA, Brillouin gain spectrum (BGS), stimulated scattering
- Spectroscopy, detector data, sensor time series
- Calibration, uncertainty quantification
Reference Documentation
Over 20 sub-modules under references/scientific-skills/:
matlab_octave/
├── signal_processing.md # FFT, filtering, convolution
├── figure_export.md # Export settings for journals
└── numerical_methods.md # ODE solvers, optimization
python_libraries/
├── matplotlib_templates.md # Plot styles for Nature/IEEE
├── sklearn_workflows.md # ML pipelines, hyperparameter tuning
├── statsmodels_guide.md # Regression, ANOVA, time series
└── scipy_optimization.md # Curve fitting, global optimization
literature_tools/
├── arxiv_search.md # API usage, metadata extraction
├── crossref_api.md # DOI resolution, citation data
└── bibtex_management.md # Parsing, validation, deduplication
Cross-Skill Workflows
Example 1: Complete Research Pipeline
Example 2: Literature to Presentation
Configuration
Environment Variables
export SEMANTIC_SCHOLAR_API_KEY=your_key_here
export PUBMED_API_KEY=your_key_here
export PAPER_FIGURES_DIR=./figures
export PPT_TEMPLATE_PATH=./templates/school_template.pptx
export WORD_TEMPLATE_PATH=./templates/report_template.docx
Skill Configuration Files
Each skill includes a SKILL.md with customizable parameters:
defaults:
language: zh-CN
preserve_english: true
evidence_labels: true
allow_fabrication: false
ppt_standards:
action_titles: true
one_idea_per_slide: true
max_text_length: 50
require_sources: true
plotting:
default_dpi: 300
default_format: [pdf, png]
font_family: Arial
color_scheme: scientific
Common Patterns
Pattern 1: Annotate Data Sources
All three skills mark information origins:
"【来源: 论文图3】空间分辨率为0.5m"
"温度系数取 1.0 MHz/°C(文献默认值,参考[3])"
Pattern 2: Avoid Fabrication
"根据Smith et al. (2020, doi:10.xxxx/made_up) 的研究..."
"【需要补充引用】根据文献,BOTDR温度系数通常为1.0 MHz/°C"
"【建议用户确认】该结论需要文献支持,请提供DOI或论文PDF"
Pattern 3: Chinese Explanations, English Technicalities
"本文提出了基于 wavelet denoising 的 Brillouin gain spectrum (BGS) 重构方法。"
signal_smooth = savgol_filter(signal, window_length=11, polyorder=3)
slide.title.text = "基于小波去噪的BGS重构算法"
Troubleshooting
Issue: Skills Not Loaded
ls ~/.claude/skills/research-writing-skill
ls ~/.codex/skills/office-academic-skill
cat ~/.claude/skills/scientific-toolkit-skill/SKILL.md
/reload skills
codex --reload-skills
Issue: MATLAB Code Not Running
octave --version
octave --eval "pkg install -forge signal"
octave --eval "pkg load signal"
octave --eval "run('botdr_analysis.m')"
Issue: Python Package Missing
pip install numpy scipy pandas matplotlib seaborn scikit-learn statsmodels
pip install qutip
pip install pymatgen
pip install timesfm
python -c "import matplotlib; import sklearn; import statsmodels; print('OK')"
Issue: PowerPoint Text Overflow
cd ~/.claude/skills/office-academic-skill/references/thesis-defense-pptx/scripts
python check_text_overflow.py /path/to/presentation.pptx
from pptx import Presentation
prs = Presentation('presentation.pptx')
slide = prs.slides[4]
shape = slide.shapes[2]
shape.height = Inches(3)
prs.save('presentation_fixed.pptx')
Issue: DOI Lookup Fails
import requests
doi = "10.1109/JLT.2023.1234567"
url = f"https://api.crossref.org/works/{doi}"
response = requests.get(url)
if response.status_code == 200:
data = response.json()['message']
author = data['author'][0]['family']
title = data['title'][0]
print(f"Author: {author}, Title: {title}")
else:
print("【建议】请手动从期刊网站复制BibTeX条目")
Issue: Figure Quality Too Low
print('figure.png', '-dpng', '-r600'); % 600 DPI for print
plt.savefig('figure.pdf', format='pdf', bbox_inches='tight')
plt.savefig('figure.eps', format='eps', bbox_inches='tight')
import matplotlib