#!/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