207 lines
6.7 KiB
Python
Executable File
207 lines
6.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Customize Template Script
|
|
Customize LaTeX templates with author information and project details.
|
|
|
|
Usage:
|
|
python customize_template.py --template nature_article.tex --output my_paper.tex
|
|
python customize_template.py --template nature_article.tex --title "My Research" --output my_paper.tex
|
|
python customize_template.py --interactive
|
|
"""
|
|
|
|
import argparse
|
|
import re
|
|
from pathlib import Path
|
|
|
|
def get_skill_path():
|
|
"""Get the path to the venue-templates skill directory."""
|
|
script_dir = Path(__file__).parent
|
|
skill_dir = script_dir.parent
|
|
return skill_dir
|
|
|
|
def find_template(template_name):
|
|
"""Find template file in assets directory."""
|
|
skill_path = get_skill_path()
|
|
assets_path = skill_path / "assets"
|
|
|
|
# Search in all subdirectories
|
|
for subdir in ["journals", "posters", "grants"]:
|
|
template_path = assets_path / subdir / template_name
|
|
if template_path.exists():
|
|
return template_path
|
|
|
|
return None
|
|
|
|
def customize_template(template_path, output_path, **kwargs):
|
|
"""Customize a template with provided information."""
|
|
|
|
# Read template
|
|
with open(template_path, 'r') as f:
|
|
content = f.read()
|
|
|
|
# Replace placeholders
|
|
replacements = {
|
|
'title': (
|
|
[r'Insert Your Title Here[^}]*', r'Your [^}]*Title[^}]*Here[^}]*'],
|
|
kwargs.get('title', '')
|
|
),
|
|
'authors': (
|
|
[r'First Author\\textsuperscript\{1\}, Second Author[^}]*',
|
|
r'First Author.*Second Author.*Third Author'],
|
|
kwargs.get('authors', '')
|
|
),
|
|
'affiliations': (
|
|
[r'Department Name, Institution Name, City, State[^\\]*',
|
|
r'Department of [^,]*, University Name[^\\]*'],
|
|
kwargs.get('affiliations', '')
|
|
),
|
|
'email': (
|
|
[r'first\.author@university\.edu',
|
|
r'\[email protected\]'],
|
|
kwargs.get('email', '')
|
|
)
|
|
}
|
|
|
|
# Apply replacements
|
|
modified = False
|
|
for key, (patterns, replacement) in replacements.items():
|
|
if replacement:
|
|
for pattern in patterns:
|
|
if re.search(pattern, content):
|
|
content = re.sub(pattern, replacement, content, count=1)
|
|
modified = True
|
|
print(f"✓ Replaced {key}")
|
|
|
|
# Write output
|
|
with open(output_path, 'w') as f:
|
|
f.write(content)
|
|
|
|
if modified:
|
|
print(f"\n✓ Customized template saved to: {output_path}")
|
|
else:
|
|
print(f"\n⚠️ Template copied to: {output_path}")
|
|
print(" No customizations applied (no matching placeholders found or no values provided)")
|
|
|
|
print(f"\nNext steps:")
|
|
print(f"1. Open {output_path} in your LaTeX editor")
|
|
print(f"2. Replace remaining placeholders")
|
|
print(f"3. Add your content")
|
|
print(f"4. Compile with pdflatex or your preferred LaTeX compiler")
|
|
|
|
def interactive_mode():
|
|
"""Run in interactive mode."""
|
|
print("\n=== Template Customization (Interactive Mode) ===\n")
|
|
|
|
# List available templates
|
|
skill_path = get_skill_path()
|
|
assets_path = skill_path / "assets"
|
|
|
|
print("Available templates:\n")
|
|
templates = []
|
|
for i, subdir in enumerate(["journals", "posters", "grants"], 1):
|
|
subdir_path = assets_path / subdir
|
|
if subdir_path.exists():
|
|
print(f"{subdir.upper()}:")
|
|
for j, template_file in enumerate(sorted(subdir_path.glob("*.tex")), 1):
|
|
templates.append(template_file)
|
|
print(f" {len(templates)}. {template_file.name}")
|
|
|
|
print()
|
|
|
|
# Select template
|
|
while True:
|
|
try:
|
|
choice = int(input(f"Select template (1-{len(templates)}): "))
|
|
if 1 <= choice <= len(templates):
|
|
template_path = templates[choice - 1]
|
|
break
|
|
else:
|
|
print(f"Please enter a number between 1 and {len(templates)}")
|
|
except ValueError:
|
|
print("Please enter a valid number")
|
|
|
|
print(f"\nSelected: {template_path.name}\n")
|
|
|
|
# Get customization info
|
|
title = input("Paper title (press Enter to skip): ").strip()
|
|
authors = input("Authors (e.g., 'John Doe, Jane Smith') (press Enter to skip): ").strip()
|
|
affiliations = input("Affiliations (press Enter to skip): ").strip()
|
|
email = input("Corresponding email (press Enter to skip): ").strip()
|
|
|
|
# Output file
|
|
default_output = f"my_{template_path.stem}.tex"
|
|
output = input(f"Output filename [{default_output}]: ").strip()
|
|
if not output:
|
|
output = default_output
|
|
|
|
output_path = Path(output)
|
|
|
|
# Customize
|
|
print()
|
|
customize_template(
|
|
template_path,
|
|
output_path,
|
|
title=title,
|
|
authors=authors,
|
|
affiliations=affiliations,
|
|
email=email
|
|
)
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Customize LaTeX templates with author and project information",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog="""
|
|
Examples:
|
|
%(prog)s --interactive
|
|
%(prog)s --template nature_article.tex --output my_paper.tex
|
|
%(prog)s --template neurips_article.tex --title "My ML Research" --output my_neurips.tex
|
|
"""
|
|
)
|
|
|
|
parser.add_argument('--template', type=str, help='Template filename')
|
|
parser.add_argument('--output', type=str, help='Output filename')
|
|
parser.add_argument('--title', type=str, help='Paper title')
|
|
parser.add_argument('--authors', type=str, help='Author names')
|
|
parser.add_argument('--affiliations', type=str, help='Institutions/affiliations')
|
|
parser.add_argument('--email', type=str, help='Corresponding author email')
|
|
parser.add_argument('--interactive', action='store_true', help='Run in interactive mode')
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Interactive mode
|
|
if args.interactive:
|
|
interactive_mode()
|
|
return
|
|
|
|
# Command-line mode
|
|
if not args.template or not args.output:
|
|
print("Error: --template and --output are required (or use --interactive)")
|
|
parser.print_help()
|
|
return
|
|
|
|
# Find template
|
|
template_path = find_template(args.template)
|
|
if not template_path:
|
|
print(f"Error: Template '{args.template}' not found")
|
|
print("\nSearched in:")
|
|
skill_path = get_skill_path()
|
|
for subdir in ["journals", "posters", "grants"]:
|
|
print(f" - {skill_path}/assets/{subdir}/")
|
|
return
|
|
|
|
# Customize
|
|
output_path = Path(args.output)
|
|
customize_template(
|
|
template_path,
|
|
output_path,
|
|
title=args.title,
|
|
authors=args.authors,
|
|
affiliations=args.affiliations,
|
|
email=args.email
|
|
)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|