Loading...
No commits yet
Not committed History
Blame
compile_latexmk.sh • 3.5 KB
#!/bin/bash
# -*- coding: utf-8 -*-
# Timestamp: "2025-11-11 23:14:00 (ywatanabe)"
# File: ./scripts/shell/modules/engines/compile_latexmk.sh
# latexmk compilation engine with BIBINPUTS fix

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

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

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

    echo_info "    Using latexmk engine"

    # Get latexmk command
    local latexmk_cmd=$(get_cmd_latexmk)
    if [ -z "$latexmk_cmd" ]; then
        echo_error "    latexmk not available"
        return 1
    fi

    # Setup paths (use configured LOG_DIR for clean separation)
    local project_root=$(git rev-parse --show-toplevel 2>/dev/null || pwd)

    # FIX: Set BIBINPUTS to find bibliography files
    # latexmk runs bibtex from output directory, need to point to project root
    if [ "${SCITEX_WRITER_LATEXMK_SET_BIBINPUTS:-true}" = "true" ]; then
        export BIBINPUTS="${project_root}:"
        echo_info "    Set BIBINPUTS=${BIBINPUTS}"
    fi

    # Build latexmk options as array for proper quoting
    local -a opts=(
        -pdf
        -bibtex
        -interaction=nonstopmode
        -file-line-error
        "-output-directory=$LOG_DIR"
        "-pdflatex=pdflatex -shell-escape %O %S"
    )

    # Quiet mode
    if [ "${SCITEX_WRITER_VERBOSE_LATEXMK:-false}" != "true" ]; then
        opts+=(-quiet)
    fi

    # Draft mode (single pass)
    if [ "$SCITEX_WRITER_DRAFT_MODE" = "true" ]; then
        opts+=(-dvi- -ps-)
        echo_info "    Draft mode: single pass only"
    fi

    # Max passes
    if [ -n "$SCITEX_WRITER_LATEXMK_MAX_PASSES" ]; then
        opts+=("-latexoption=-interaction=nonstopmode")
    fi

    # Run compilation
    local start=$(date +%s)

    echo_info "    Running: latexmk [${#opts[@]} options] $(basename $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 latexmk with properly quoted array expansion
    local output=$($timeout_prefix $latexmk_cmd "${opts[@]}" "$tex_file" 2>&1 | grep -v "gocryptfs not found")
    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 for critical errors
    if echo "$output" | grep -q "Missing bbl file\|failed to resolve\|gave return code"; then
        echo_warning "    Compilation completed with warnings (check citations/references)"
    fi

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

        # Show output if verbose or on failure
        if [ "$SCITEX_WRITER_VERBOSE_LATEXMK" = "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_latexmk

# EOF