AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL unreviewed MIT Self-run

Latex Engine

skill-tobiasblask-open-paper-machine-latex-engine · by TobiasBlask

>

No reviews yet
0 installs
18 views
0.0% view→install

Install

$ agentstack add skill-tobiasblask-open-paper-machine-latex-engine

Open-source listing, not yet scanned by AgentStack. Follow the source repository for install instructions.

Security review

⚠ Flagged

1 finding(s); flagged for manual review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures
  • high Destructive filesystem operation.

What it can access

  • Network access No
  • Filesystem access Used
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Reliability & compatibility

Not yet reviewed
0 installs to date
no reviews yet
4mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Latex Engine? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

> Orchestration Log: When this skill is activated, append a log entry to outputs/orchestration_log.md: > `` > ### Skill Activation: LaTeX Engine > **Timestamp:** [current date/time] > **Actor:** AI Agent (latex-engine) > **Input:** [brief description of the export request] > **Output:** [brief description of what was produced — e.g., "Compiled paper.tex to PDF (24 pages), no errors"] > ``

LaTeX Engine

Core Principle

The paper machine works in markdown throughout Phases 1-5 for speed and flexibility. This engine is the final production step: it takes the completed draft.md, references.bib, and figures/ and produces a submission-ready LaTeX project with compiled PDF using the arxiv-style template (https://github.com/kourgeorge/arxiv-style).

Prerequisites

Required files in the working directory:

  • draft.md — complete paper draft from Phase 5
  • references.bib — BibTeX file from literature search
  • figures/ — directory with generated PNG figures (optional but recommended)

Required system packages for PDF compilation:

  • texlive or equivalent LaTeX distribution with pdflatex and bibtex
  • Install if missing: apt-get install -y texlive-latex-base texlive-latex-extra texlive-fonts-recommended texlive-bibtex-extra

Plugin files used:

  • templates/arxiv.sty — the arxiv-style LaTeX style file
  • scripts/md_to_latex.py — the markdown-to-LaTeX converter

When to Activate

  • User says "export to LaTeX", "generate PDF", "make it submission-ready"
  • After Phase 5 (Assembly) completes in the paper machine pipeline
  • User explicitly asks for .tex output
  • User mentions arXiv submission preparation

Conversion Pipeline

Step 1: Prepare the LaTeX Project Directory

Create a latex/ subdirectory with the proper structure:

latex/
├── arxiv.sty          ← copied from templates/
├── paper.tex          ← generated by md_to_latex.py
├── references.bib     ← copied from working dir
├── figures/           ← copied from working dir
│   ├── fig_method_*.png
│   ├── fig_results_*.png
│   └── ...
└── paper.pdf          ← compiled output

Step 2: Run the Converter

import sys, shutil
from pathlib import Path

# Paths
plugin_dir = Path(".")  # or wherever the plugin is
work_dir = Path(".")     # project working directory
latex_dir = work_dir / "latex"
latex_dir.mkdir(exist_ok=True)

# Copy arxiv.sty
shutil.copy(plugin_dir / "templates" / "arxiv.sty", latex_dir / "arxiv.sty")

# Copy references.bib
shutil.copy(work_dir / "references.bib", latex_dir / "references.bib")

# Copy figures
figures_src = work_dir / "figures"
if figures_src.exists():
    figures_dst = latex_dir / "figures"
    if figures_dst.exists():
        shutil.rmtree(figures_dst)
    shutil.copytree(figures_src, figures_dst)

# Run converter
sys.path.insert(0, str(plugin_dir / "scripts"))
from md_to_latex import md_to_latex, compile_pdf

tex_content = md_to_latex(
    md_path=str(work_dir / "draft.md"),
    bib_path=str(work_dir / "references.bib"),
    title=None,       # auto-detect from draft.md
    authors=None,      # user provides or TODO marker
    header_right="A Preprint",
)

tex_path = latex_dir / "paper.tex"
tex_path.write_text(tex_content, encoding="utf-8")
print(f"LaTeX written: {tex_path}")

Step 3: Compile to PDF

# Compile: pdflatex → bibtex → pdflatex → pdflatex
pdf_path = compile_pdf(str(tex_path))
if pdf_path:
    print(f"PDF ready: {pdf_path}")
else:
    print("Compilation had issues — check paper.log")

Step 4: Validate Output

After compilation, verify:

  1. Citation resolution: Check for undefined references in the .log file
  2. Figure inclusion: Verify all \includegraphics paths resolve
  3. BibTeX entries: Check that all \citep/\citet keys exist in .bib
  4. Page count: Report total pages
  5. TODO markers: List any remaining % TODO: comments
import re

log_path = latex_dir / "paper.log"
if log_path.exists():
    log_text = log_path.read_text(encoding="utf-8", errors="ignore")

    # Undefined references
    undef = re.findall(r"Citation `([^']+)' undefined", log_text)
    if undef:
        print(f"⚠️  Undefined citations: {undef}")

    # Missing figures
    missing_figs = re.findall(r"File `([^']+)' not found", log_text)
    if missing_figs:
        print(f"⚠️  Missing figures: {missing_figs}")

    # Page count
    pages = re.findall(r"Output written on .+ \((\d+) page", log_text)
    if pages:
        print(f"📄 PDF: {pages[0]} pages")

# TODO markers in .tex
tex_text = tex_path.read_text(encoding="utf-8")
todos = re.findall(r"% TODO: (.+)", tex_text)
if todos:
    print(f"📝 Remaining TODOs ({len(todos)}):")
    for t in todos:
        print(f"   - {t}")

Citation Conversion Details

The converter handles these citation patterns:

| Markdown Pattern | LaTeX Output | |---|---| | (Smith, 2023) | \citep{smith2023} | | (Smith & Jones, 2023) | \citep{smithjones2023} | | (Smith et al., 2023) | \citep{smithetal2023} | | Smith (2023) | \citet{smith2023} | | Smith et al. (2023) | \citet{smithetal2023} | | (Smith, 2023; Jones, 2024) | \citep{smith2023, jones2024} |

Resolution process:

  1. Parse all BibTeX entries → extract (LastName, Year) pairs
  2. For each citation in markdown, match against the BibTeX index
  3. Exact match → use BibTeX key directly
  4. Fuzzy match → try without accents, partial first name
  5. No match → generate fallback key, leave % TODO comment

Author Block

Authors can be provided in three ways:

Option A: Via command arguments

--author "Tobias Blask;;University of Applied Sciences;;blask@university.de"
--author "Co-Author Name;;Other University;;coauthor@uni.de"

Option B: Via the converter function

tex = md_to_latex(
    md_path="draft.md",
    bib_path="references.bib",
    authors=[
        "Tobias Blask;;HTW Berlin;;tobias.blask@htw-berlin.de",
        "Co-Author;;Institution;;email@inst.de",
    ],
)

Option C: Edit the .tex file directly The generated .tex has a clear author block section to edit manually.


Table Conversion

Markdown tables are converted to LaTeX booktabs tables:

| Column A | Column B | Column C |
|----------|----------|----------|
| Data 1   | Data 2   | Data 3   |

Becomes:

\begin{table}[htbp]
\centering
\begin{tabular}{lll}
\toprule
\textbf{Column A} & \textbf{Column B} & \textbf{Column C} \\
\midrule
Data 1 & Data 2 & Data 3 \\
\bottomrule
\end{tabular}
\end{table}

For concept matrix tables (which can be wide), the converter wraps in \adjustbox{max width=\textwidth}.


Figure Handling

From figure-engine (LaTeX already in draft.md): If the draft already contains \begin{figure}...\end{figure} blocks (from the figure-engine), they are passed through as-is.

From markdown images: `` is converted to:

\begin{figure}[htbp]
\centering
\includegraphics[width=\linewidth]{figures/filename.png}
\caption{Caption}
\label{fig:auto_label}
\end{figure}

Troubleshooting

| Problem | Solution | |---|---| | arxiv.sty not found | Ensure arxiv.sty is copied to the same directory as paper.tex | | Citation undefined | BibTeX key mismatch — check references.bib has the expected keys | | Missing figure | Check figures/ directory is in the latex/ folder | | Font not found | Install texlive-fonts-recommended | | natbib errors | Ensure natbib package is installed (texlive-latex-extra) | | Compilation hangs | Check for infinite loops in .tex — usually malformed tables |


arXiv Submission Preparation

For arXiv upload, the user needs:

  1. paper.tex — the generated .tex file
  2. arxiv.sty — the style file
  3. references.bib — OR the .bbl file (generated during compilation)
  4. figures/ — all PNG figures

Important: arXiv doesn't always process .bib files correctly. To be safe:

  1. Copy the contents of paper.bbl (generated during compilation)
  2. Paste into paper.tex replacing the \bibliography{references} line
  3. Comment out the \bibliographystyle and \bibliography lines

The converter can prepare this automatically with --arxiv-bundle (copies .bbl inline).

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.