{"id":31530651,"url":"https://github.com/janfasnacht/tabwrap","last_synced_at":"2026-05-14T12:35:14.179Z","repository":{"id":316957043,"uuid":"977818417","full_name":"janfasnacht/tabwrap","owner":"janfasnacht","description":"Wrap LaTeX table fragments into complete documents for research workflows","archived":false,"fork":false,"pushed_at":"2026-05-05T09:32:41.000Z","size":273,"stargazers_count":0,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-05T10:11:39.221Z","etag":null,"topics":["academic","latex","research","statistics","tables"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/tabwrap/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/janfasnacht.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-05T02:35:19.000Z","updated_at":"2026-05-05T09:32:44.000Z","dependencies_parsed_at":"2025-10-04T01:50:36.803Z","dependency_job_id":null,"html_url":"https://github.com/janfasnacht/tabwrap","commit_stats":null,"previous_names":["janfasnacht/tabwrap"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/janfasnacht/tabwrap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janfasnacht%2Ftabwrap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janfasnacht%2Ftabwrap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janfasnacht%2Ftabwrap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janfasnacht%2Ftabwrap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/janfasnacht","download_url":"https://codeload.github.com/janfasnacht/tabwrap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janfasnacht%2Ftabwrap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33025234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic","latex","research","statistics","tables"],"created_at":"2025-10-04T01:50:35.817Z","updated_at":"2026-05-14T12:35:14.163Z","avatar_url":"https://github.com/janfasnacht.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tabwrap\n\n[![PyPI version](https://badge.fury.io/py/tabwrap.svg)](https://pypi.org/project/tabwrap/)\n[![Python](https://img.shields.io/pypi/pyversions/tabwrap.svg)](https://pypi.org/project/tabwrap/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n**Wrap LaTeX table fragments into complete documents for research workflows**\n\nA simple Python tool that transforms statistical programming output (LaTeX table fragments) into compiled PDFs, PNGs, or SVGs. Perfect for researchers who need to quickly inspect, share, and explore tables from Stata, R, Python, and other statistical tools.\n\n**Web Interface**: [tabwrap.janfasnacht.com](https://tabwrap.janfasnacht.com)\n\n## What it does\n\n`tabwrap` takes incomplete LaTeX table fragments like this:\n```latex\n\\begin{tabular}{lcr}\n\\toprule\nVariable \u0026 Coefficient \u0026 P-value \\\\\n\\midrule\nIntercept \u0026 1.23 \u0026 0.045 \\\\\n\\bottomrule\n\\end{tabular}\n```\n\nAnd automatically wraps them into complete, compilable LaTeX documents with:\n- Auto-detected packages (booktabs, tabularx, siunitx, etc.)\n- Proper document structure and preambles\n- Auto-fit page sized to the table\n- Multi-file batch processing with error recovery\n- Combined PDFs with table of contents\n- PNG output with automatic cropping, SVG support\n- Enhanced error reporting with suggestions\n\n## Quick Start\n\n### Prerequisites\n\n**LaTeX Distribution Required:** tabwrap needs a LaTeX installation to compile documents.\n\n- **Windows**: [MiKTeX](https://miktex.org/download) or [TeX Live](https://tug.org/texlive/)\n- **macOS**: [MacTeX](https://tug.org/mactex/) or `brew install --cask mactex`\n- **Linux**: `sudo apt-get install texlive-full` or equivalent\n\n**Optional for PNG output**: [ImageMagick](https://imagemagick.org/script/download.php)\n\n### Installation\n\n#### Recommended (CLI tools):\n\n```bash\npipx install tabwrap\n```\n\n#### Standard Python installation:\n\n```bash\npip install tabwrap\n```\n\n#### With API support:\n\n```bash\npip install tabwrap[api]\n```\n\n### Basic Usage\n\n```bash\n# Compile a single table\ntabwrap regression_table.tex\n\n# Process all tables in a folder\ntabwrap ./results_tables/\n\n# Output PNG\ntabwrap table.tex -p\n\n# Batch process with combined PDF\ntabwrap ./tables/ -r -c    # recursive + combine PDFs\n\n# Show filename headers and keep intermediate files\ntabwrap data/ --header --keep-tex\n```\n\n## Features\n\n### Error Handling\n\n```\n⚠️  1 of 3 files failed to compile:\n\n📋 Failed files:\n   • bad_table.tex\n     Invalid tabular content: No tabular environment found\n\n✅ Successfully compiled: table1.tex, table2.tex\n```\n\n### Smart Package Detection\n\nAutomatically detects and includes required packages:\n- `booktabs` for \\\\toprule, \\\\midrule, \\\\bottomrule\n- `tabularx` for \\\\begin{tabularx}\n- `siunitx` for \\\\SI{}{}, \\\\num{}\n- `multirow` for \\\\multirow\n- And many more...\n\nFor commands that need a `\\newcommand` rather than a package, tabwrap injects\nthe definition directly. For example, `\\sym{**}` from Stata's `esttab` gets a\nmatching `\\newcommand{\\sym}` in the preamble. Use `--preamble` for arbitrary\npreamble lines outside the curated rule set.\n\n### Flexible Output Options\n\n```bash\n# Output formats\ntabwrap table.tex                     # PDF output (default)\ntabwrap table.tex -p                  # PNG output with auto-cropping\ntabwrap table.tex --svg               # SVG output (vector graphics)\n\n# Batch processing\ntabwrap folder/ -r                    # Process subdirectories recursively\ntabwrap folder/ -j                    # Parallel processing (4-6x faster)\ntabwrap folder/ -c                    # Combine into single PDF with TOC\n\n# Layout and formatting\ntabwrap table.tex --header            # Show filename as header\n```\n\n### Shell Completion\n\ntabwrap supports shell completion for bash, zsh, and fish:\n\n```bash\n# Bash - add to ~/.bashrc\ntabwrap --completion bash \u003e\u003e ~/.bashrc\n\n# Zsh - add to ~/.zshrc\ntabwrap --completion zsh \u003e\u003e ~/.zshrc\n\n# Fish - save to completions directory\ntabwrap --completion fish \u003e ~/.config/fish/completions/tabwrap.fish\n```\n\n## CLI Reference\n\n```\nUsage: tabwrap [OPTIONS] [INPUT_PATH]\n\nArguments:\n  INPUT_PATH               .tex file or directory to process [default: current directory]\n\nOutput Options:\n  -o, --output PATH        Output directory [default: current directory]\n  --suffix TEXT            Output filename suffix [default: _compiled]\n  -p, --png                Output PNG instead of PDF\n  --svg                    Output SVG instead of PDF\n\nProcessing Options:\n  -r, --recursive          Process subdirectories recursively\n  -j, --parallel           Process files in parallel for faster batch compilation\n  --max-workers INTEGER    Maximum number of parallel workers [default: CPU cores]\n  -c, --combine            Combine multiple PDFs with table of contents\n\nFormatting Options:\n  --header                 Show filename as header in output\n  --packages TEXT          Comma-separated LaTeX packages (auto-detected if empty)\n  --preamble TEXT          Extra preamble lines (e.g. \\newcommand) inserted verbatim after \\usepackage\n\nAdvanced Options:\n  --keep-tex               Keep generated LaTeX files and compilation logs for debugging\n  --completion [bash|zsh|fish]  Generate shell completion script\n  --help                   Show this message and exit\n```\n\n### Common Usage Patterns\n\n```bash\n# Basic compilation\ntabwrap table.tex                     # PDF output\ntabwrap table.tex -p                  # PNG output\ntabwrap table.tex --svg               # SVG output\n\n# Batch processing\ntabwrap folder/                       # All .tex files in folder\ntabwrap folder/ -r                    # Include subdirectories\ntabwrap folder/ -j                    # Parallel processing (faster)\ntabwrap folder/ -c                    # Combined PDF with TOC\n\n# Formatting options\ntabwrap table.tex --header            # Show filename header\ntabwrap table.tex --preamble '\\newcommand{\\sig}[1]{\\textbf{#1}}'  # Inject preamble lines (e.g. custom \\newcommand)\n\n# Output control\ntabwrap table.tex -o output/          # Custom output directory\ntabwrap table.tex --suffix _final     # Custom filename suffix\n```\n\n## API Usage\n\n### Python Library\nFor programmatic access:\n\n```python\nfrom tabwrap import TabWrap\n\ncompiler = TabWrap()\nresult = compiler.compile_tex(\n    input_path=\"table.tex\",\n    output_dir=\"output/\",\n    png=True,\n)\nprint(f\"Compiled to: {result}\")\n```\n\n### Web API\nRun the FastAPI server for web applications:\n\n```bash\n# Install with API dependencies\npip install tabwrap[api]\n\n# Start the API server\npython -m tabwrap.api\n\n# API endpoints\n# GET  /api/health - Service health check\n# POST /api/compile - Compile LaTeX table fragment\n```\n\n## Research Workflow Integration\n\n### Stata\n\n```stata\nesttab using \"regression_results.tex\", replace booktabs\n! tabwrap regression_results.tex -p\n```\n\n### R\n\n```r\nlibrary(xtable)\nxtable(model) %\u003e%\n  print(file = \"model_table.tex\", include.rownames = FALSE)\nsystem(\"tabwrap model_table.tex\")\n```\n\n### Python\n\n```python\ndf.to_latex(\"data_summary.tex\", index=False)\nos.system(\"tabwrap data_summary.tex -p\")\n```\n\n## Development\n\n### Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature-name`\n3. Make changes and add tests\n4. Run tests: `poetry run pytest`\n5. Submit a pull request\n\n### Development Setup\n\n```bash\ngit clone https://github.com/janfasnacht/tabwrap.git\ncd tabwrap\npoetry install\npoetry run pytest  # Run tests\n```\n\n### Building and Testing\n\n```bash\npoetry build                    # Build distribution packages\npoetry run tabwrap --help      # Test CLI\nmake test                       # Run full test suite\nmake test-coverage              # Generate coverage report\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjanfasnacht%2Ftabwrap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjanfasnacht%2Ftabwrap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjanfasnacht%2Ftabwrap/lists"}