Arquivo da tag: latex

Abrindo e fechando sempre os mesmos programas

Sempre que vou iniciar uma sessão de trabalho — em bom português, sentar para trabalhar — em algum projeto de programação ou escrita de um artigo, há uma série de ações repetitivas:

  1. Usando o terminal de comando, navego até a pasta do projeto em questão
  2. Obtenho a última versão do projeto no GitHub
  3. Abro os arquivos de LaTeX no Emacs e os programas em Python no Visual Studio Code
  4. Abro o Sourcetree, para gerenciar as modificações que eu vou fazendo
  5. Abro arquivos de referência (PDF de alguma documentação, por exemplo)

Ao longo da minha sessão, vou trabalhando, e periodicamente usando o supra-citado Sourcetree para registrar o que vou fazendo. Nesse período, invariavelmente meu celular está em modo Não perturbe e estou escutando a trilha sonora de algum filme, série ou jogo no Deezer.

Quando termino de trabalhar, por cansaço ou por ter de fazer outra atividade, também há série de atividades repetitivas:

  1. Fecho todos os arquivos abertos no começo
  2. Sincronizo minha versão atual do trabalho com a versão no GitHub.

Esse ciclo de abrir programas – trabalhar – fechar programas se repete algumas vezes ao longo de dia, de maneira que criei um sistema de automação dessas tarefas. Já falei aqui sobre como escrevi minha tese de maneira eficiente, onde automatizei algumas tarefas; o sistema que descrevo neste post é mais geral.

Um aviso: este post é bastante técnico e requer o uso do terminal de comando, em particular o sistema Git for Windows, que instala a shell Bash e muitos utiliários como programas nativos do Windows; para macOS e Linux, Bash e aplicativos de terminal já estão instalados. Se você se interesse por computação científica e quer aprender mais, existem muitos tutoriais disponíveis sobre como usar e configurar Bash, o meu canal preferido no YouTube para esse assunto é o do Corey Schafer. Os exemplos que vão mostrar aqui se aplicam a Windows, e minha configuração está disponível no GitHub.

Mesmo que o leitor não esteja familiarizado com nada disso, pode ler para tentar entender como eu automatizo algumas tarefas e ter ideias para facilitar a sua vida.

A base do meu sistema é um pequeno utilitário Bash chamado prm, que permite definir “procedimentos” de “começar” e “parar” um projeto.

Vamos a um exemplo prático. No momento estou trabalhando em um paper sobre perfis magnéticos para refrigeradores magnéticos. Após instalar prm usando as instruções do repositório, crio um projeto no terminal usando:

prm add pprof

pprof é uma abreviação de “paper profiles” (é assim que meu cérebro funciona). Esse comando cria dois scripts, em uma pasta padrão do prm (que pode ser mudada) abre-os no editor de texto padrão.

O primeiro script,start.sh, define o que é feito ao começar a trabalhar no projeto:

O segundo script, stop.sh, é executado quando termino de trabalhar no projeto:

No script acima, cf é uma função que fecha um arquivo no Emacs, que está definida em ~/.bash_profile.

e closew é um comando que fecha janelas usando AutoHotKey:

que é definido como um atalho na forma (dentro de .bash_profile).

alias closew="AutoHotkey path/to/closewindow.ahk"

Como toda automação, apesar de exigir um pouco de trabalho, estes hacks facilitam muito o trabalho e deixam minha mente livre para se concentrar no que é necessário. Por exemplo, quando quero começar a trabalhar no paper, abro uma janela do Git Bash e digito:

prm start pprof

e tudo fica pronto na minha frente. Mais importante que a abertura dos programas, no entendo, é o recado ao meu cérebro, quando digito o comando acima, de que é hora de começar a trabalhar no paper.

Quando é hora de parar, digito

prm stop pprof

e tudo se fecha, deixando meu computador pronto para outras tarefas.

Como edito minha Tese de Doutorado de maneira eficiente

Em Fator de Enriquecimento, Paulo Vieira fala que um dos segredos para a riqueza é dedicar uma hora por dia, seis dias por semana, ao estudo, ao aprimoramento do seu trabalho. Com o tempo, isso leva a um grande desenvolvimento de suas habilidades, até um ponto em que você pode trocá-las por melhores salários.

Apesar de ter muitas ressalvas em relação a esse livro, essa ideia é seu o melhor ensinamento, e tenho tentado ficar mais atento a como melhorar minhas atividades. As teorias de sistemas enxutos (lean) também se baseiam no conceito de Kaizen: se algo está errado, precisa ser imediatamente consertado — a melhoria contínua.

Para melhorar meus processos de trabalho, o primeiro passo é simplesmente ficar mais atento a eles; esse post é uma maneira de documentar meu processo para editar minha Tese de Doutorado, junto com indicações de melhorias de processo. Enfatizo o verbo editar, e não apenas escrever, porque o que vou descrever aqui se aplica a essa situação específica: eu já tenho um manuscrito completo, tenho arquivos de referência com alterações dos meus orientadores, e preciso então mudar algumas frases e imagens da minha Tese.

O primeiro passo, aparentemente trivial, é sentar na minha mesa, com uma versão impressa e corrigida da Tese ao lado. Gosto de sentar de maneira bem confortável, com um caderno para anotações sempre por perto.

20181128_101209880_iOS

Como todo pesquisador que se preze, eu escrevo meus documentos científicos em \LaTeX, que já cobri aqui algumas vezes. O meu editor de texto preferido para \LaTeX é o Emacs, um programa bastante arcaico e bastante poderoso — mais sobre ele em um minuto. Para visualizar o PDF compilado, no macOS a melhor opção para integração com Emacs é o Skim. Para tornar esse início de processo o mais consistente e eficiente possível, eu criei um fluxo de trabalho no Alfred que, com um comando, executa os seguintes passos:

  1. Abre um terminal de comando
  2. Muda o diretório atual para a pasta com a minha Tese
  3. Baixa a versão mais recente do repositório da minha Tese no GitHub
  4. Abre o Emacs no arquivo .tex em que estou trabalhando, a abre o Skim do lado:

Screen Shot 2018-11-28 at 08.33.48

(Sim, claro que estou usando Palatino).

O principal recurso que me interessa no Skim é que posso manter o PDF aberto no Skim de um lado da tela, trabalhar no Emacs de outro, e ao re-compilar o documento o PDF é automaticamente atualizado:

A razão de, com tantos editores mais “modernos” disponíveis, eu ainda continuar usando o Emacs é que, especialmente com o pacote AUCTeX, esse programa sinceramente faz um pouco de mágica. Veja no video a seguir como, quando eu quero inserir uma referência, com um comando eu posso procurar por palavras chaves e o Emacs me mostra as opções lindamente formatadas:

Quanto a minha configuração do Emacs, ela está no GitHub para os aventureiros; se for do desejo dos leitores, posso falar mais sobre esse editor aqui no blog (deixem comentários!). Um detalhe que quero abordar é em relação ao tema de cores, já que ter um ambiente confortável para se trabalhar faz parte da melhoria contínua. Depois de muito tempo usando temas de fundo escuro, nas últimas semanas estou muito satisfeito com o Leuven, que tem essas cores bem interessantes (a minha parte preferida é a barra azulzinha embaixo). E para todas as coisas que envolvem programação, a minha fonte preferida é a DejaVu Sans Mono.

Screen Shot 2018-11-28 at 10.15.20

E o leitor, que achou do meu processo? Tem alguma dúvida? Deixem nos comentários!

O Futuro do LaTeX, Parte II — Por Que LaTeX

Na primeira parte desta série, falamos da importância de linguagens de marcação.

Vamos analisar qual é o nosso problema e por que estou gastando tempo nisso. O seu computador contém arquivos em inúmeros formatos; alguns podem ser abertos por apenas um programa (ou um pequeno número deles). Geralmente se identifica o tipo de arquivo pela extensão do nome (algo do tipo nome_do_arquivo.extensao). Assim, o seu navegador não sabe o que fazer com um arquivo .xls, enquanto que o Excel não consegue abrir uma apresentação .ppt do PowerPoint.

Um arquivo é apenas uma sequência de bytes, um conjunto de 0 e 1 que você já deve ter visto em algum filme de ficção científica. A questão é como interpretar essa sequência, transformando-a em informação útil ao usuário. Os 0 e 1 de um arquivo do Word, por exemplo, contém todas as instruções sobre o texto, as imagens, as margens, as tabelas, as fontes etc

O formato mais básico de todos é um arquivo de texto puro (plain text). Um arquivo de texto puro contém apenas bytes que representam caracteres, sem nenhuma informação adicional. Os programas ainda precisam saber converter os bytes em letras, mas é só isso; é um formato bem documentado, aberto, e praticamente todos os sistemas lidam bem com texto puro. Se o leitor que usa Windows criar uma nota, salvar como um .txt e me mandar, posso abrir esse arquivo no meu iPhone. Existem alguns detalhes de apresentação que são característica do editor; a fonte na qual o leitor escreveu a sua nota não é a mesma na qual eu vou ler, porque esta informação não está embutida no arquivo. O programa lê o texto e o apresenta numa fonte arbitrária, ou até numa outra cor.

Mas, se o texto puro não contém formatação, como, usando esse tipo de arquivo leve e portável, produzir obras complexas como livros, sites, artigos, relatórios?

Fazemos isso com linguagens de marcação. Usando comandos em texto, marcamos regiões do nosso arquivo para serem formatadas; um programa então processa esse arquivo, interpreta os comandos e cria um arquivo final destinado à visualização.


No primeiro texto falamos de HTML e páginas da web. Agora vamos falar da produção de documentos científicos, com sua divisão em capítulos e seções e uso de equações, figuras, tabelas.

O formato mais usado na Academia para isso é o LaTeX, que é uma extensão de uma linguagem chamada TeX, que por sua foi criada por um matemático especificamente para produção de livros sobre programação e, não por acaso, é especialmente adequado para criação de equações.

(Se o leitor já está familiarizado com a linguagem e quer saber sobre o que eu acho do tal futuro do LaTeX, por favor aguarde o próximo texto. Primeiramente darei uma breve explicação do que é LaTeX e por que o uso.)

Um documento em LaTeX tem a seguinte forma:

\documentclass{article}

\usepackage[utf8]{inputenc}

\title{O Futuro do \LaTeX}
\author{Fábio}

\begin{document}

\maketitle

\section{Introdução}

O \LaTeX{} é ótimo para fazer equações, como essa na mesma linha $E = m c^2$ ou esta em um parágrafo a parte:

\begin{equation}
    a^2 + b^2 = c^2
\end{equation}

\end{document}

Repare na estrutura lógica desse trecho. Definimos a classe de um documento, (e existem diversas, como book, report, entre outras, que podem até ser criadas pelo usuário), definimos um título e um autor, damos um comando para um começo de seção. No primeiro parágrafo, colocamos uma equação, e depois criamos outra separada. Por último, fechamos um documento.

Vale repetir: isto é apenas texto. Na versão final, o título vai estar em um estilo, o cabeçalho do capítulo outro, o parágrafo normal em outro. As equações vão ter uma fonte diferente e assim por diante.

Como produzir esta versão final? Além de ser uma linguagem, existe um programa chamado LaTeX que compila um arquivo contendo um texto válido. Este post já está muito comprido, mas o leitor pode facilmente encontrar instruções de como fazer isso da maneira mais fácil na sua plataforma (Windows, Mac, Linux, até iOS). O resultado é algo assim, um PDF de onde tirei este screenshot:

Este documento é muito simples e não se compara à complexidade de uma dissertação. Existem muitas outras coisas que o LaTeX pode fazer, em especial citações. Se o leitor já fez algum trabalho acadêmico, sabe a dor que é produzir referências bibliográficas adequadamente formatadas; com o LaTeX, você cria um arquivo de bibliografia, separado do texto, contendo todas as suas referências escritas numa linguagem própria (BibTeX). Depois, cria um pacote dizendo como processar essa linguagem e produzir uma referência (como “AUTOR, Título. Local: Editora, Ano”), e, claro, existem inúmeros pacotes prontos, inclusive para ABNT. Assim, no texto, você precisa apenas escrever \cite{fortkamp}, por exemplo, e o LaTeX e BibTeX formatam a referência para você.

Isto é só uma introdução e não espero que o leitor aprenda a usar o LaTeX. Quero que fique claro apenas isso: é uma linguagem de marcação especializada para criar documentos científicos. Usando texto puro, é possível mesclar o texto que estou escrevendo com comandos que vão ser processados depois, gerando um arquivo pronto para ser distribuído.


Mas afinal, por que eu uso isso? Para repetir a pergunta que eu ouço muito, por que eu não uso o Word como uma pessoa normal?

Confiança é, para mim, um aspecto importante de como usar a tecnologia, e o Word simplesmente não é confiável. Eu já perdi muitos trabalhos feitos no Word, depois de ele travar quando eu adiciono uma figura muito grande, e isso é inaceitável. Além disso, se criar equações complicadas em LaTeX é difícil, no Word é impossível.

Quando estou escrevendo um texto em LaTeX, eu não clico em nenhum menu para inserir figura, ou deixar um pedaço negrito, ou nada disso. Vou repetir mais uma vez porque sou chato: é apenas texto. Você não insere tabelas no arquivo fonte; você dá um comando para o processador LaTeX produzir uma tabela ali. Com a prática (e com um livro de referência do lado para consultar), fica muito fácil criar uma equação complexa, digitando apenas comandos.

Além disso, o LaTeX separa a formatação da escrita. No exemplo acima, eu dou um comando para criar um título, mas não existe nenhuma informação de como o título vai estar formatado; isso é papel da classe do documento. Como falei, é possível criar classes próprias (existe uma ótima que formata todo o documento já seguindo a ABNT). Essa filosofia desencoraja o hábito nada produtivo de ficar “ajustando” a fonte e o estilo de um documento enquanto se escreve.

Gosto também da extensibilidade. O LaTeX foi criado para textos em inglês, sem acentos, mas existe um pacote que permite esses caractereres a mais (é o pacote inputenc que usei acima) — observe que a data ficou em inglês, e omiti o pacote que faz a tradução justamente para chamar a atenção para este fato. Existe outro, um dos meus preferidos atualmente, que formata unidades SI adequadamente. Ou seja: quando você está escrevendo, e encontra um problema, a chance de você achar um pacote pronto é alta.

Por último, o LaTeX é independente de programas. O compilador é software livre e pode ser facilmente instalado em qualquer sistema. E o editor… não existe um “editor de LaTeX”. Vamos repetir? É apenas texto. Você pode escrever no maldito Bloco de Notas, se quiser; ou pode escrever em algum editor de texto poderoso (voltado geralmente para programação), como o Notepad++ no Windows ou TextWrangler no Mac (que eu adoro e estou usando para escrever este post). Se preferir algo mais fácil, existem editores “integrados”, que reúnem a edição com o processamento (no Mac, muitas vezes eu uso o Texpad , que é bem razoável) — mas eles são apenas isso, editores. O texto que você escrever em um editor do Windows e me mandar vai ser aberto e, se eu tiver instalado todos os pacotes que você usou, compilado normalmente no Texpad.

Mas se o LaTeX é tão bom, por que eu acho, como é o título desta série, que ele precisa de um futuro? Aguardem cenas do próximo capítulo.

O Futuro do LaTeX, Parte I – A importância de linguagens de marcação

Esse parágrafo que você está lendo não tem nenhum recurso de formatação
especial. Há uma fonte, de um determinado tamanho, com algumas margens,
espaçamento entre linhas, mas isso é o mínimo para um texto ser
apresentável; são detalhes tão básicos que o leitor quase nem se dá
conta. Na prática, são apenas caracteres, um após o outro, formando a
mensagem que eu, escritor, quero passar a você, leitor.

Este parágrafo têm uma ênfase. Esse recurso imediatamente chama
atenção para uma palavra determinada, e altera a mensagem. Nas minhas
resenhas de livro, eu dizer que um livro é extremamente bom ou
extremamente bom são coisas diferentes, apesar da palavra ser a
mesma. Ou, quando falo de apps, dizer que um app é levemente
caro ou levemente caro provoca sentimentos diferentes por parte de
quem está lendo. Quando eu digo que algo é levemente caro, eu estou
sendo irônico, ou estou apenas dizendo que o produto não é nem caro nem
barato?

A forma da escrita afeta o conteúdo. Ênfase, ênfase ou ênfase são
três formas de escrever a mesma palavra, mas a interpretação do leitor
varia conforme o uso dos recursos.

Outro exemplo: eu poderia simplesmente dizer que Aristóteles falou que o
todo é maior que a soma das partes. Ou poderia escrever:

O todo é maior que a soma das partes – Aristóteles

Aqui, eu não alterei a forma de uma letra, mas sim a apresentação de uma
frase. Observe como eu consigo imediatamente chamar mais a atenção.

Agora, um detalhe: eu poderia configurar este site para exibir este
texto com uma outra fonte, mas eu não precisaria escrever o texto de
novo, em outra fonte. De fato, a fonte na qual eu estou escrevendo o
texto não é a mesma no qual você está lendo. Mais: eu poderia trocar os
negritos por itálicos e não precisaria reescrever essas palavras.
Poderia trocar a forma como a citação acima é exibida. Como isso é
possível?

É possível porque esses recursos são visuais. Eles não fazem parte do
conteúdo, mas se relacionam com ele. Na prática, as informações de forma
e de conteúdo são armazenadas de forma indepedente nos computadores.

O formato mais básico de texto é o chamado texto puro, plain text em
inglês. É o texto que o leitor digita no Bloco de Notas do Windows, por
exemplo, ou no TextEdit no OS X, ou em algum editor básico do Linux. São
apenas caracteres, sem formatação nenhuma. O programa exibe o texto em
alguma fonte padrão, com algum espaçamento.

Esse formato é tão básico que se o leitor escrever algum texto no Bloco
de Notas no Windows e mandar para mim, eu vou conseguir abrir no meu
iPhone. Todos os sistemas modernos conseguem interpretar texto puro.
Além disso, esse formato é extremamente leve. Repito: são apenas letras.

Porém, como já vimos, a formatação é essencial. Eu poderia escrever
todos os meus textos em texto puro e mandar para os leitores, mas isso
está longe de ser ideal. É preciso uma maneira de, usando texto puro (um
formato que o computador consegue entender), marcar o texto,
produzindo um texto rico (um formato que o leitor consegue entender). Em
vez de armazenar as palavras em negrito, armazenam-se comandos para
produzir negrito. E, então, um programa analisa essas instruções e
produz o resultado visual desejado.

Uma linguagem que marque o texto com recursos de formatação é chamada de
linguagem de marcação (markup language).

Uma linguagem de marcação usada todos os dias

O leitor é exposto a uma linguagem de marcação todo dia, sempre que
navega pela internet em um browser. As páginas da Web são escritas em
HTML (HyperText Markup Language); é função dos navegadores interpretar
o HTML e exibir os recursos gráficos na sua tela, convertendo comandos
em pixels.

Por exemplo, este parágrafo tem a seguinte estrutura em HTML:

<p>Por exemplo, este parágrafo tem a seguinte estrutura em HTML:</p>

Repare nos elementos adicionais: <p> e </p>. Repito: um arquivo de
texto num computador é armazenado como uma sequência de caracteres,
incluindo espaços e quebras de linha. O arquivo de texto não sabe o que
é um parágrafo. O que esse comandos fazem então é instruir ao
navegador: “exiba essa sequência de caracteres como se fosse um
parágrafo, isto é, com um espaçamento antes e depois, com uma certa
tabulação etc”. Os detalhes da formatação podem ser alterados com uma
linguagem auxiliar chamada de CSS, sigla para Cascading Style Sheets
(que determinam a fonte, as margens e outros detalhes do estilo).

O parágrafo acima é interessante porque tem vários detalhes
tipográficos. Repare na sua versão em HTML:

<p>Repare nos elementos adicionais: <code><p></code> e <code></p></code>. Repito: um arquivo de texto num computador é armazenado como uma sequência de caracteres, incluindo espaços e quebras de linha. O arquivo de texto não sabe o que é um <em>parágrafo</em>. O que esse comandos fazem então é instruir ao navegador: “exiba essa sequência de caracteres como se fosse um parágrafo, isto é, com um espaçamento antes e depois, com uma certa tabulação etc”. Os detalhes da formatação podem ser alterados com uma linguagem auxiliar chamada de CSS, sigla para <em>Cascading Style Sheets</em> (que determinam a fonte, as margens e outros detalhes do <em>estilo</em>).</p>

Na maioria dos navegadores, é possível ver o código-fonte da página,
para ver como aquele site foi escrito em HTML. Recomendo como um
exercício interessante.

Separação entre produtor e consumidor

Este não é um tutorial de HTML então vamos voltar ao conceito. Uma
linguagem de marcação fundamentalmente separa o produtor do consumidor
de conteúdo. O produtor usa os comandos e os recursos da linguagem
escolhida para criar recursos gráficos.

Mas que tipo de recursos? Basta pensar em tudo que não é texto puro:

  • Margens
  • Tipo de fonte
  • Tamanho de fonte
  • Figuras
  • Tabelas
  • Equações
  • Diagramas
  • Negrito, itálico, sublinhado
  • Alinhamento dos parágrafos
  • Citações

Naturalmente, as boas linguagens permitem aos usuários criarem os seus
recursos adicionais.

Processadores de texto como o Word da Microsoft e o Pages da Apple
também usam uma linguagem de marcação, mas que fica invisível ao
público. Em vez de haver um comando para transformar uma palavra em
negrito, o usuário seleciona um texto e clica num botão. O ato de clicar
num botão efetivamente produz o comando internamente e atualiza a tela
para mostrar uma nova palavra em negrito.

A vantagem principal dessa abordagem é que ela é muito fácil de
aprender. No HTML, é preciso consultar alguma referência que o negrito é
produzido assim: <b>negrito</b>. Nos processadores, basta apertar um
botão.

Uma das “vantagens” alardeadas é que processadores são do tipo WYSIWYG,
what you see is what you get, significando que o que o leitor vê é
aquilo que está acontecendo. Se o usuário do Word está editando um texto
em Arial, o texto impresso vai estar em Arial; quando o arquivo for
mandado para outra pessoa, ele também vai estar em Arial, no mesmo
tamanho. As instruções de formatação estão codificadas internamente no
arquivo (mas independentes do conteúdo, lembre-se). O mesmo arquivo
usado para escrever o texto é usado para visualizá-lo.

Processadores de texto violam a separação entre produtor e consumidor, o
que é na verdade uma desvantagem.

O que um autor de página da Web vê quando escreve uma página em HTML é
bem diferente do que um leitor vê quando usa o Safari, Chrome, Firefox
ou outro navegador. O autor faz testes, mas quando ele está escrevendo,
ele não está preocupado com detalhes como margem e fonte. As (boas)
linguagens de marcação estimulam a boa prática de escrever e marcar o
texto de maneira apropriada, e só depois implementar a formatação. É
importante saber que em determindo lugar há uma ênfase, mas não de que
forma essa ênfase vai aparecer. É importante saber que ali há uma
tabela, mas não qual a espessura da linha.

A linguagem HTML reforça isso ainda mais ao requerer uma segunda
linguagem (o CSS) para definir detalhes de estilo. O código em HTML
define a estrutura: o que é um título, o que é um parágrafo, o que é uma
tabela, e o estilo em CSS define os detalhes: qual fonte o título usa,
qual a margem dos parágrafos, qual o tamanho das células nas tabelas.

Abordagens WYSIWYG distraem. Você está escrevendo e vê um texto poluído
cheio de imagens, e repara que uma não está corretamente alinhada. Você
interrompe a sua linha de raciocínio para arrumar a imagem. Algum tempo
depois, para de novo porque acha que a fonte não está boa. O autor é
praticamente instruído a escrever e formatar o conteúdo ao mesmo tempo,
o que é altamente improdutivo. É preciso ter muita força de vontade para
escrever sem se deixar distrair pelos detalhes.

Para piorar, as linguagens de marcação por trás de processadores
comerciais de texto não são nem um pouco robustas. Quantas vezes o
leitor já abriu um documento do Word para encontrar o trabalho da semana
toda desorganizado? Algum erro interno na hora de salvar e abrir de novo
o documento provocou um desastre.

Para produzir documentos sérios, em que se controla a aparência final
com precisão, é preciso usar uma linguagem de marcação que esteja
explícita, e não que esteja escondida.

E o LaTeX?

Esse texto começou pequeno na minha cabeça e já se tornou grande demais.
Num post futuro, vou falar especificamente do LaTeX e em como ele se
encaixa nesse cenário.