BibGuard / src /templates /base_template.py
thinkwee
init
46df5f0
"""
Conference template definitions.
Each template contains conference-specific formatting requirements
and rules for paper submission quality checking.
"""
from dataclasses import dataclass, field
from typing import List, Dict, Optional
from enum import Enum
class ConferenceField(Enum):
"""Research field categories."""
NLP = "Natural Language Processing"
CV = "Computer Vision"
ML = "Machine Learning"
@dataclass
class ConferenceTemplate:
"""
Template containing conference-specific submission requirements.
Attributes:
name: Full conference name (e.g., "ACL 2025")
short_name: Short identifier (e.g., "acl")
field: Research field category
page_limit_review: Page limit for review submission (main content only)
page_limit_camera: Page limit for camera-ready (main content only)
double_blind: Whether the conference uses double-blind review
caption_table_above: Whether table captions should be above
caption_figure_below: Whether figure captions should be below
mandatory_sections: List of required sections (e.g., ["Limitations"])
optional_sections: List of encouraged sections
style_package: Name of the LaTeX style package
checkers: List of checker names to run for this template
extra_rules: Additional conference-specific rules
"""
name: str
short_name: str
field: ConferenceField
page_limit_review: int
page_limit_camera: int
double_blind: bool = True
caption_table_above: bool = True
caption_figure_below: bool = True
mandatory_sections: List[str] = field(default_factory=list)
optional_sections: List[str] = field(default_factory=list)
style_package: str = ""
checkers: List[str] = field(default_factory=lambda: [
'caption', 'reference', 'ai_artifacts', 'formatting', 'anonymization'
])
extra_rules: Dict[str, str] = field(default_factory=dict)
def to_dict(self) -> dict:
return {
'name': self.name,
'short_name': self.short_name,
'field': self.field.value,
'page_limit_review': self.page_limit_review,
'page_limit_camera': self.page_limit_camera,
'double_blind': self.double_blind,
'mandatory_sections': self.mandatory_sections,
'optional_sections': self.optional_sections,
'checkers': self.checkers,
}
# ============================================================================
# NLP Conferences (ACL, EMNLP, NAACL)
# ============================================================================
ACL_TEMPLATE = ConferenceTemplate(
name="ACL 2025",
short_name="acl",
field=ConferenceField.NLP,
page_limit_review=8,
page_limit_camera=9,
double_blind=True,
mandatory_sections=["Limitations"],
optional_sections=["Ethical Considerations"],
style_package="acl2025",
extra_rules={
"format": "Two-column, A4 paper",
"references": "Unlimited pages for references",
"appendix": "Allowed after references, two-column format",
}
)
EMNLP_TEMPLATE = ConferenceTemplate(
name="EMNLP 2024",
short_name="emnlp",
field=ConferenceField.NLP,
page_limit_review=8,
page_limit_camera=9,
double_blind=True,
mandatory_sections=["Limitations"],
optional_sections=["Ethics Statement"],
style_package="emnlp2024",
extra_rules={
"format": "Two-column, single-spaced",
"short_paper": "4 pages for short papers (5 camera-ready)",
}
)
NAACL_TEMPLATE = ConferenceTemplate(
name="NAACL 2025",
short_name="naacl",
field=ConferenceField.NLP,
page_limit_review=8,
page_limit_camera=9,
double_blind=True,
mandatory_sections=["Limitations"],
optional_sections=["Ethics Statement"],
style_package="naacl2025",
extra_rules={
"review_system": "ACL Rolling Review (ARR)",
"format": "Two-column, A4 paper",
}
)
# ============================================================================
# Computer Vision Conferences (CVPR, ICCV, ECCV)
# ============================================================================
CVPR_TEMPLATE = ConferenceTemplate(
name="CVPR 2025",
short_name="cvpr",
field=ConferenceField.CV,
page_limit_review=8,
page_limit_camera=8, # No extra page for camera-ready
double_blind=True,
mandatory_sections=[],
optional_sections=[],
style_package="cvpr",
extra_rules={
"strict_anonymity": "No links to websites that reveal identity",
"supplementary": "Separate PDF allowed, no page limit",
"references": "No limit on references",
}
)
ICCV_TEMPLATE = ConferenceTemplate(
name="ICCV 2025",
short_name="iccv",
field=ConferenceField.CV,
page_limit_review=8,
page_limit_camera=8,
double_blind=True,
mandatory_sections=[],
optional_sections=[],
style_package="iccv",
extra_rules={
"format": "Two-column, 10pt Times font",
"supplementary": "Optional PDF for extra material",
}
)
ECCV_TEMPLATE = ConferenceTemplate(
name="ECCV 2024",
short_name="eccv",
field=ConferenceField.CV,
page_limit_review=14,
page_limit_camera=14,
double_blind=True,
mandatory_sections=[],
optional_sections=[],
style_package="eccv",
extra_rules={
"format": "Springer LNCS format",
"template": "Do not use TIMES font, use default template font",
"headings": "Capitalize except articles/prepositions/conjunctions",
}
)
# ============================================================================
# Machine Learning Conferences (NeurIPS, ICML, ICLR)
# ============================================================================
NEURIPS_TEMPLATE = ConferenceTemplate(
name="NeurIPS 2025",
short_name="neurips",
field=ConferenceField.ML,
page_limit_review=9,
page_limit_camera=10,
double_blind=True,
mandatory_sections=["Paper Checklist"],
optional_sections=["Broader Impact"],
style_package="neurips_2025",
extra_rules={
"checklist": "NeurIPS paper checklist is MANDATORY, desk reject without it",
"appendix": "Technical appendix after checklist, no page limit",
"format": "Single PDF including main content, references, and checklist",
}
)
ICML_TEMPLATE = ConferenceTemplate(
name="ICML 2025",
short_name="icml",
field=ConferenceField.ML,
page_limit_review=8,
page_limit_camera=9,
double_blind=True,
mandatory_sections=["Impact Statement"], # Required for camera-ready
optional_sections=["Acknowledgments"],
style_package="icml2025",
extra_rules={
"font": "10 point Times, embedded Type-1 fonts only",
"lay_summary": "Plain language summary required for accepted papers",
"format": "Use pdflatex for best results",
}
)
ICLR_TEMPLATE = ConferenceTemplate(
name="ICLR 2025",
short_name="iclr",
field=ConferenceField.ML,
page_limit_review=10,
page_limit_camera=10,
double_blind=True,
mandatory_sections=[],
optional_sections=["Ethics Statement", "Reproducibility Statement"],
style_package="iclr2025_conference",
extra_rules={
"format": "10pt Times New Roman, 11pt vertical spacing",
"submission": "Via OpenReview",
"min_pages": "Main text must be between 6 and 10 pages",
}
)
# ============================================================================
# Template Registry
# ============================================================================
TEMPLATE_REGISTRY: Dict[str, ConferenceTemplate] = {
# NLP
'acl': ACL_TEMPLATE,
'emnlp': EMNLP_TEMPLATE,
'naacl': NAACL_TEMPLATE,
# CV
'cvpr': CVPR_TEMPLATE,
'iccv': ICCV_TEMPLATE,
'eccv': ECCV_TEMPLATE,
# ML
'neurips': NEURIPS_TEMPLATE,
'icml': ICML_TEMPLATE,
'iclr': ICLR_TEMPLATE,
}
def get_template(name: str) -> Optional[ConferenceTemplate]:
"""Get a conference template by short name."""
return TEMPLATE_REGISTRY.get(name.lower())
def get_all_templates() -> Dict[str, ConferenceTemplate]:
"""Get all available templates."""
return TEMPLATE_REGISTRY.copy()
def get_templates_by_field(field: ConferenceField) -> List[ConferenceTemplate]:
"""Get templates filtered by research field."""
return [t for t in TEMPLATE_REGISTRY.values() if t.field == field]