#  File: Makefile
#  Author: J. F. Mitre <http://jfmitre.com>
#  Created: Sex 29 Mai 2009 10:14:33 BRT
#  Last Update: Sáb 30 Mai 2009 14:07:49 BRT
#  Notes: Arquivo Makefile para compilar códigos em LaTeX
#         Execute "make help" para ajuda
###############################################################################

# Programas Selecionados {{{
########################## PROGRAMAS SELECIONADOS #############################

# Comando que gera compila o código LaTeX. Escolha entre: latex ou pdflatex
TEX = latex
# Comando que visualiza o arquivo .dvi
DVIVIEW = kdvi
# Comando que visualiza o arquivo .pdf
PDFVIEW = evince
# Comando que converte o arquivo .dvi em .ps
DVIPS = dvips

# }}}

# Opções dos comandos {{{
############################ OPÇÕES DOS COMANDOS ##############################

# Opções do comando que gera o arquivo .dvi
OPTDVI = 
# Opções do comando dvips, que converte o arquivo .dvi para o .ps
OPTPS = -Z
# Opções do comando comando "pdflatex"
OPTPDF =
# Formato de conversão utilizado pelo ps2pdf (necessário especificar)
FORMATO = a4
# Estilos dos glossários, nomenclaturas, etc. 
STYLENLS = nomencl.ist
STYLEGLS = nomencl.ist
# Opções do comando make
OPTMAKE = -s

# }}}

# Outros programas {{{
############################# OUTROS PROGRAMAS ################################

# Comando que gera o índice, a nomenclatura, etc. Não existe outro atualmente
MAKEINDEX = makeindex
# Comando que gera a bibliografia, não existe outro atualmente
BIB = bibtex
# Conversão entre arquivo .ps e arquivo .pdf, existem outros, mas esse é o
# melhor para o GNU/Linux.
PSPDF = ps2pdf
# Eliminar arquivo. Não é razoável fazer de outra forma.
RM = rm -fv
# Comando make (até existem outros, mas não para esse Makefile).
MAKE = make 

# }}}

# Execução dos comandos {{{
################################ EXECUÇÃO #####################################

# Indentificação do nome do arquivo
DOC   := $(shell egrep -l '^[^%]*\\begin\{document\}' *.tex |rev|cut -b5- |rev)
# Verificando se existe bibliografia
BIBFILE := $(shell egrep -l '^[^%]*\\bibliography\{' $(DOC).tex)

# Verifica se é uma apresentação do prosper
PROSPER	 := $(shell egrep -l '^[^%]*\\documentclass\[.*\]\{prosper\}' *.tex)

# Gerando o "arquivo" DVI ...
$(DOC).dvi:
# mas ele é esperto o bastando para saber que não gera-se DVI com o pdflatex.
# E também gerará o PDF caso seja o proper seja utilizado.
	@if [ ! -z $(PROSPER) ]; then \
	 $(MAKE) dvi; \
	 $(DVIPS) $(OPTPS) $(DOC).dvi; \
	 $(PSPDF) -sPAPERSIZE=$(FORMATO) $(DOC).ps $(DOC).pdf; \
	elif [ $(TEX) == latex ]; then \
	 $(MAKE) dvi; \
	elif [ $(TEX) == pdflatex ]; then \
	 $(MAKE) $(DOC).pdf; \
	fi

# Gera o arquivo PDF...
$(DOC).pdf:
# de um arquivo DVI, convertendo-o para PS e em seguida para PDF caso
# o comando padrão seja o latex ou diretamente, caso o comando padrão seja 
# o pdflatex.
# Também diminuimos o esforço caso o prosper esteja sendo usado.
	@if [ ! -z $(PROSPER) ]; then \
	 $(MAKE) $(DOC).dvi; \
	elif [ $(TEX) = latex ]; then \
	 $(MAKE) $(DOC).dvi; \
	 $(DVIPS) $(OPTPS) $(DOC).dvi; \
	 $(PSPDF) -sPAPERSIZE=$(FORMATO) $(DOC).ps $(DOC).pdf; \
	elif [ $(TEX) = pdflatex ]; then \
	 $(MAKE) pdflatex; \
	fi

# Gerando o arquivo DVI com o latex
dvi: 
# Compliação inicial do arquivo tex
	$(TEX) $(OPTDVI) $(DOC).tex
# Se existe bibliografia ...
	@if [ ! -z $(BIBFILE) ]; then\
	 $(BIB) $(DOC).aux; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	 $(BIB) $(DOC).aux; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	fi 
# Se existe glossário, nomenclatura ou indice...
	@if [ -f "$(DOC).nlo" ]; then \
	 $(MAKEINDEX) $(DOC).nlo $(STYLENLS) -o $(DOC).nls; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	fi
	@if [ -f "$(DOC).glo" ]; then \
	 $(MAKEINDEX) $(DOC).glo -s $(STYLEGLS) -o $(DOC).gls; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	fi
	@if [ -f "$(DOC).nlo" ]; then \
	 $(MAKEINDEX) $(DOC).nlo $(STYLENLS) -o $(DOC).nls; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	fi
	@if [ -f "$(DOC).glo" ]; then \
	 $(MAKEINDEX) $(DOC).glo -s $(STYLEGLS) -o $(DOC).gls; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	fi
	@if [ -f "$(DOC).idx" ]; then \
	 $(MAKEINDEX) $(DOC).idx; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	 $(MAKEINDEX) $(DOC).idx; \
	 $(TEX) $(OPTDVI) $(DOC).tex; \
	fi 
# Uma última vez apenas para confirmar que tudo está ok...
	$(TEX) $(OPTDVI) $(DOC).tex

# Gerando o arquivo PDF, com o pdflatex.
pdflatex:
# Compliação inicial do arquivo tex
	$(TEX) $(OPTPDF) $(DOC).tex
# Se existe bibliografia ...
	@if [ ! -z $(BIBFILE) ]; then\
	 $(BIB) $(DOC).aux; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	 $(BIB) $(DOC).aux; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	fi 
# Se existe glossário, nomenclatura ou indice...
	@if [ -f $*.nls ]; then \
	 $(MAKEINDEX) $(DOC).nlo $(STYLENLS) -o $(DOC).nls; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	fi
	@if [ -f $*.gls ]; then \
	 $(MAKEINDEX) $(DOC).glo -s $(STYLEGLS) -o $(DOC).gls; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	fi
	@if [ -f $*.nls ]; then \
	 $(MAKEINDEX) $(DOC).nlo $(STYLENLS) -o $(DOC).nls; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	fi
	@if [ -f $*.gls ]; then \
	 $(MAKEINDEX) $(DOC).glo -s $(STYLEGLS) -o $(DOC).gls; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	fi
	@if [ -f $*.idx ]; then \
	 $(MAKEINDEX) $(DOC).idx; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	 $(MAKEINDEX) $(DOC).idx; \
	 $(TEX) $(OPTPDF) $(DOC).tex; \
	fi 
# Uma última vez apenas para confirmar que tudo está ok...
	$(TEX) $(OPTPDF) $(DOC).tex

# Limpando o básico dos arquivos gerados pelo compilador
clean:
	@$(RM) *.aux *.log 
	@$(RM) *.toc *.lot *.lof
	@$(RM) *.ttt *.fff *.blg *.out
	@$(RM) *.ind *.ilg *.idx *.aux *.glo
	@$(RM) *.gls *.abx *.nlo *.syx *.nls
	@$(RM) *.ps 
	@$(RM) *.tex.backup
	@$(RM) *.bib.backup *.bib.bak
	@$(RM) *.tex.bak
	@$(RM) *.bbl
	@$(RM) *.*~
	@$(RM) Makefile~

# Limpando tudo, inclusive os arquivos finais.
cleanall: 
	$(MAKE) clean
	@$(RM) *.dvi *.pdf 

# Mostra o resultado, compila se necessário.
# Esperto para saber se é um DVI ou um PDF
# de acordo com o comando padrão
show:
	@if [ ! -z $(PROSPER) ]; then \
	 $(MAKE) $(DOC).dvi; \
	 $(PDFVIEW) $(DOC).pdf; \
	elif [ $(TEX) == latex ]; then \
	 $(MAKE) $(DOC).dvi; \
	 $(DVIVIEW) $(DOC).dvi; \
	elif [ $(TEX) == pdflatex ]; then \
	 $(MAKE) $(DOC).pdf; \
	 $(PDFVIEW) $(DOC).pdf; \
	fi

# Idem ao "show", a diferença é que aqui 
# é feito uma nova compilação, de um jeito ou de outro
shownew:
	$(MAKE) cleanall
	@if [ ! -z $(PROSPER) ]; then \
	 $(MAKE) $(DOC).dvi; \
	 $(PDFVIEW) $(DOC).pdf; \
	elif [ $(TEX) == latex ]; then \
	 $(MAKE) $(DOC).dvi; \
	 $(DVIVIEW) $(DOC).dvi; \
	elif [ $(TEX) == pdflatex ]; then \
	 $(MAKE) $(DOC).pdf; \
	 $(PDFVIEW) $(DOC).pdf; \
	fi

# Idem ao "show", mas para arquivos PDF apenas
showpdf: 
	$(MAKE) $(DOC).pdf
	$(PDFVIEW) $(DOC).pdf

# Idem ao "shownew", mas para arquivos PDF apenas
shownewpdf: 
	$(MAKE) cleanall	   
	$(MAKE) $(DOC).pdf
	$(PDFVIEW) $(DOC).pdf

# }}}

# Ajuda {{{
################################### AJUDA #####################################
help:
	@echo "# "
	@echo "# AJUDA COM O COMANDO MAKE"
	@echo "# "
	@echo "#    make             : comando padrão. Cria um arquivo .dvi, se utilizar o "
	@echo "#                       comando latex ou .pdf se uzar o pdflatex "
	@echo "#    make $(DOC).dvi : é o mesmo que make sem argumentos."
	@echo "#    make $(DOC).pdf : cria um arquivo .pdf. Convertendo o .dvi para um .ps e"
	@echo "#                       em seguida convertendo o .ps para .pdf ou cria um .pdf "
	@echo "#                       diretamente com o pdflatex"
	@echo "#    make show        : mostra o arquivo gerado pelo comando \"make $(DOC).dvi\""
	@echo "#    make shownew     : mostra o arquivo gerado pelo comando \"make $(DOC).dvi\","
	@echo "#                       após criar uma nova cópia do documento."
	@echo "#    make showpdf     : mostra o arquivo gerado pelo comando \"make $(DOC).pdf\""
	@echo "#    make shownew     : mostra o arquivo gerado pelo comando \"make $(DOC).pdf\","
	@echo "#                       após criar uma nova cópia do documento."
	@echo "#    make clean       : elimina os arquivos criados no processo de geração do"
	@echo "#                       documento, mas mantém o(s) arquivo(s) de resultado, seja"
	@echo "#                       .dvi ou .pdf."
	@echo "#    make cleanall    : elimina todos os arquivos criados pelo processo de geração"
	@echo "#                       do documento, incluindo os arquivos de resultado."
	@echo "#    make help        : mostra a ajuda"
	@echo "# "
	@echo "# CONFIGURAÇÕES DO ARQUIVO Makefile"
	@echo "# "
	@echo "#      Toda a configuração resume-se em escolher os programas e as opções "
	@echo "#      associadas a esses programas no cabeçalho do arquivo Makefile, que "
	@echo "#      está devidamente comentado."
	@echo "# "
	@echo "# OUTRAS INFORMAÇÕES"
	@echo "# "
	@echo "# http://jfmitre.com/2009/05/makefile-para-latex.html"      
	@echo "# "

# }}}

# Referências {{{
############################## REFEREÊNCIAS ###################################
#
# How to write documents in LaTeX
# http://www.cs.berkeley.edu/~jaein/notes/latexhowto.html
#
# GNU Make Manual
# http://www.gnu.org/software/make/manual/
#
# }}}