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 chamapdflatex
, 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 demd5sum 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.