#!/bin/bash
# -*- coding: utf-8 -*-
# Timestamp: "2025-11-11 23:16:00 (ywatanabe)"
# File: ./scripts/shell/modules/engines/compile_3pass.sh
# 3-pass compilation engine (most compatible)
THIS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Source command switching for command detection
source "${THIS_DIR}/../command_switching.src"
compile_with_3pass() {
local tex_file="$1"
local pdf_file="${tex_file%.tex}.pdf"
echo_info " Using 3-pass engine"
# Get commands
local pdf_cmd=$(get_cmd_pdflatex)
local bib_cmd=$(get_cmd_bibtex)
if [ -z "$pdf_cmd" ] || [ -z "$bib_cmd" ]; then
echo_error " No LaTeX installation found (native, module, or container)"
return 1
fi
# Add compilation options (use configured LOG_DIR for clean separation)
pdf_cmd="$pdf_cmd -output-directory=$LOG_DIR -shell-escape -interaction=nonstopmode -file-line-error"
# Helper function for timed execution
run_pass() {
local cmd="$1"
local verbose="$2"
local desc="$3"
echo_info " $desc"
local start=$(date +%s)
if [ "$verbose" = "true" ]; then
eval "$cmd" 2>&1 | grep -v "gocryptfs not found"
local ret=${PIPESTATUS[0]}
else
eval "$cmd" >/dev/null 2>&1
local ret=$?
fi
local end=$(date +%s)
echo_info " ($(($end - $start))s)"
return $ret
}
# Optional timeout prefix (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"
pdf_cmd="$timeout_prefix $pdf_cmd"
fi
# Main compilation sequence
local total_start=$(date +%s)
local tex_basename=$(basename "${tex_file%.tex}")
local aux_file="${LOG_DIR}/${tex_basename}.aux"
local bib_base="${LOG_DIR}/${tex_basename}"
# Check draft mode
if [ "$SCITEX_WRITER_DRAFT_MODE" = "true" ]; then
# Draft: single pass only
run_pass "$pdf_cmd $tex_file" "$SCITEX_WRITER_VERBOSE_PDFLATEX" "Single pass (draft mode)"
else
# Full: 3-pass compilation
run_pass "$pdf_cmd $tex_file" "${SCITEX_WRITER_VERBOSE_PDFLATEX:-false}" "Pass 1/3: Initial"
# Process bibliography if needed
if [ -f "$aux_file" ]; then
if grep -q "\\citation\|\\bibdata\|\\bibstyle" "$aux_file" 2>/dev/null; then
run_pass "$bib_cmd $bib_base" "${SCITEX_WRITER_VERBOSE_BIBTEX:-false}" "Processing bibliography"
fi
fi
run_pass "$pdf_cmd $tex_file" "${SCITEX_WRITER_VERBOSE_PDFLATEX:-false}" "Pass 2/3: Bibliography"
run_pass "$pdf_cmd $tex_file" "${SCITEX_WRITER_VERBOSE_PDFLATEX:-false}" "Pass 3/3: Final"
fi
local total_end=$(date +%s)
echo_success " 3-pass compilation: $(($total_end - $total_start))s"
return 0
}
# Export function
export -f compile_with_3pass
# EOF