Compilar fonte Latex automaticamente na criação / alteração

2

É fácil fazer o seguinte script? Eu tenho meus documentos LaTeX em / home / jaakko / Documents / LaTeX e seus subdiretórios. Eu gostaria de ter um script de assistir os documentos .tex nesse diretório e seus subdiretórios e se algumas alterações tex-file, o script tenta compilá-lo o mais rapidamente possível (pdflatex file.tex). Como posso fazer isso no Bash?

    
por Jaakko 20.10.2014 / 20:26

1 resposta

1

Primeiro de tudo, o que você está tentando fazer é o trabalho usual de um IDE. Seja o Texmaker, o Latexila ou outro, os IDEs permitirão que você recompile o código LaTeX de forma extremamente rápida, e alguns podem permitir a recompilação automática em determinados intervalos.

Atualmente, muitos IDEs contam com inotify (que é uma API C) para detectar alterações nos arquivos. No entanto, o número de inotify relógios é limitado pela configuração do sistema, e bem ... Eu aceitei o desafio de escrever um script real para executar o trabalho.

De qualquer forma, aqui está uma pequena ideia usando os hashes find e MD5:

  • Estou usando find para encontrar todos os arquivos .tex .
  • Para cada arquivo, chamo uma função ( update_file ) que verifica se o arquivo foi alterado desde a última vez e chama pdflatex , se necessário.
  • As alterações de arquivo são detectadas por meio de md5sum changes. Cada arquivo pode ser associado a um hash MD5 (obtido através de md5sum file ). Se o conteúdo do arquivo mudar, o mesmo acontece com o hash. Portanto, posso monitorar alterações de arquivos, monitorando alterações de hashes MD5.

Basicamente, estou usando um arquivo md5.sum para armazenar todos os hashes MD5 associados aos arquivos TeX. Quando um arquivo é modificado, seu hash é alterado e, portanto, não é mais o mesmo que no arquivo MD5. Quando isso acontece, o script chama pdflatex e atualiza o novo hash MD5.

Aqui está o código, adicionei algumas informações nos comentários. Sinta-se à vontade para ajustá-lo e altere as variáveis definidas no começo. No entanto, sempre usa caminhos absolutos.

#!/bin/bash

# 
# Defining a few variables...
#
LATEXCMD="/usr/bin/pdflatex"
LATEXDOC_DIR="/home/jaakko/Documents/LaTeX"
MD5SUMS_FILE="$LATEXDOC_DIR/md5.sum"

#
# This function checks whether a file needs to be updated,
# and calls LATEXCMD if necessary. It is called for each
# .tex file in LATEXDOC_DIR (see below the function).
#
update_file()
{
    [[ $# -ne 1 ]] && return;
    [[ ! -r "$1" ]] && return;

    # Old MD5 hash is in $MD5SUMS_FILE, let's get it.
    OLD_MD5=$(grep "$file" "$MD5SUMS_FILE" | awk '{print $1}')

    # New MD5 hash is obtained through md5sum.
    NEW_MD5=$(md5sum "$file" | awk '{print $1}')

    # If the two MD5 hashes are different, then the files changed.
    if [ "$OLD_MD5" != "$NEW_MD5" ]; then
        echo "$LATEXCMD" -output-directory $(dirname "$file") "$file"

        # Calling the compiler.
        "$LATEXCMD" -output-directory $(dirname "$file") "$file" > /dev/null
        LTX=$?

        # There was no "old MD5", the file is new. Add its hash to $MD5SUMS_FILE.
        if [ -z "$OLD_MD5" ]; then
            echo "$NEW_MD5 $file" >> "$MD5SUMS_FILE"
        # There was an "old MD5", let's use sed to replace it.
        elif [ $LTX -eq 0 ]; then
            sed "s|^.*\b$OLD_MD5\b.*$|$NEW_MD5 $file|" "$MD5SUMS_FILE" -i
        fi
    fi
}

# Create the MD5 hashes file.
[[ ! -f "$MD5SUMS_FILE" ]] && touch "$MD5SUMS_FILE"

IFS=$'\n'
find "$LATEXDOC_DIR" -iname "*.tex" | while read file; do
    # For each .tex file, call update_file.
    update_file "$file"
done

Agora, se você quiser executar esse script periodicamente, use watch :

$ watch /path/to/script.sh

Você pode usar a opção -n para ajustar o tempo de atualização:

$ watch -n 2 /path/to/script.sh

Você pode colocar esse script em /home/jaakko/Documents/LaTeX e executá-lo sempre que estiver desenvolvendo.

    
por 20.10.2014 / 23:10

Tags