Loading...
No commits yet
Not committed History
Blame
compile_tectonic.sh • 3.7 KB
#!/bin/bash
# -*- coding: utf-8 -*-
# Timestamp: "2025-11-11 23:12:00 (ywatanabe)"
# File: ./scripts/shell/modules/engines/compile_tectonic.sh
# Tectonic compilation engine

THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# Source command switching for command detection
source "${THIS_DIR}/../command_switching.src"

compile_with_tectonic() {
    local tex_file="$1"
    local pdf_file="${tex_file%.tex}.pdf"

    echo_info "    Using Tectonic engine"

    # Get tectonic command
    local tectonic_cmd=$(get_cmd_tectonic)
    if [ -z "$tectonic_cmd" ]; then
        echo_error "    Tectonic not available"
        return 1
    fi

    # Build tectonic options
    local opts=""

    # Output directory (use configured LOG_DIR for clean separation)
    # Tectonic requires absolute paths for --outdir
    local abs_log_dir="$(cd "$(dirname "$LOG_DIR")" && pwd)/$(basename "$LOG_DIR")"
    opts="$opts --outdir=$abs_log_dir"

    # Incremental mode (use cache)
    if [ "$SCITEX_WRITER_TECTONIC_INCREMENTAL" = "true" ]; then
        opts="$opts --keep-intermediates"
        # Set cache directory
        if [ -n "$SCITEX_WRITER_TECTONIC_CACHE_DIR" ]; then
            export TECTONIC_CACHE_DIR="$SCITEX_WRITER_TECTONIC_CACHE_DIR"
            echo_info "    Using cache: $TECTONIC_CACHE_DIR"
        fi
    fi

    # Bundle directory (offline mode)
    if [ -n "$SCITEX_WRITER_TECTONIC_BUNDLE_DIR" ] && [ -d "$SCITEX_WRITER_TECTONIC_BUNDLE_DIR" ]; then
        opts="$opts --bundle=$SCITEX_WRITER_TECTONIC_BUNDLE_DIR"
        echo_info "    Using offline bundle: $SCITEX_WRITER_TECTONIC_BUNDLE_DIR"
    fi

    # Reruns (limit compilation passes to avoid excessive reruns)
    # Default to 1 rerun (2 total passes) which is sufficient for most documents
    # Can be overridden with SCITEX_WRITER_TECTONIC_RERUNS environment variable
    local reruns="${SCITEX_WRITER_TECTONIC_RERUNS:-1}"
    opts="$opts --reruns=$reruns"

    # Verbosity
    if [ "$SCITEX_WRITER_VERBOSE_TECTONIC" != "true" ]; then
        opts="$opts --print=error"
    fi

    # Use relative path for tex file to maintain proper working directory
    # Tectonic will run from current directory (project root) to resolve relative image paths

    # Run compilation
    local start=$(date +%s)
    echo_info "    Running: $tectonic_cmd $opts $tex_file"

    # Optional timeout (set by diff compilation to prevent infinite loops)
    local timeout_prefix=""
    if [ -n "${SCITEX_WRITER_COMPILE_TIMEOUT:-}" ]; then
        timeout_prefix="timeout ${SCITEX_WRITER_COMPILE_TIMEOUT}"
        echo_info "    Timeout: ${SCITEX_WRITER_COMPILE_TIMEOUT}s"
    fi

    # Run tectonic with relative path (maintains project root as working directory)
    local output=$($timeout_prefix $tectonic_cmd $opts "$tex_file" 2>&1)
    local exit_code=$?

    # Check for timeout (exit code 124)
    if [ $exit_code -eq 124 ]; then
        echo_warning "    Compilation timed out after ${SCITEX_WRITER_COMPILE_TIMEOUT}s"
        return 1
    fi

    local end=$(date +%s)

    # Check result
    if [ $exit_code -eq 0 ]; then
        echo_success "    Tectonic compilation: $(($end - $start))s"
        return 0
    else
        echo_error "    Tectonic compilation failed (exit code: $exit_code)"

        # Show errors if verbose or on failure
        if [ "$SCITEX_WRITER_VERBOSE_TECTONIC" = "true" ] || [ $exit_code -ne 0 ]; then
            echo "$output" | grep -i "error\|warning" | head -10
        fi

        # If in auto mode, signal to try fallback
        if [ "$SCITEX_WRITER_ENGINE" = "auto" ]; then
            return 2 # Special code: try next engine
        else
            return 1 # Fatal error
        fi
    fi
}

# Export function
export -f compile_with_tectonic

# EOF