Usando o pandoc
2026-09-26
Este post é mais uma visão geral do Pandoc. No fim dele a gente vai ter um PDF só, em vez de uma pilha de documentos.
o que é o pandoc
O pandoc é uma ferramenta pra transformar um documento de uma linguagem de marcação pra outra. No meio de vários processos a gente precisa converter ou mexer nesses documentos: documentos em markdown pra pdf, etc.
Imagina que você tem uns arquivos .tex ou .docx e quer juntar tudo num PDF! É uma das coisas que o pandoc faz.
O problema é: existem muitas ferramentas online que fariam isso, mas muitas têm problemas sérios de conformidade, e a gente não tem controle nenhum sobre o que aconteceria com os nossos documentos :)
"Uma linguagem de marcação é um sistema de codificação de texto que especifica a estrutura e a formatação de um documento e, potencialmente, as relações entre as suas partes. A marcação pode controlar a exibição de um documento ou enriquecer o seu conteúdo para facilitar o processamento automatizado." Fonte: wikipedia
antes de começar
O pandoc pode dar um pouco de medo se você não é acostumado com linha de comando, mas eu acho que vale a tentativa.
Se você tem medo de CLI e terminal, o pessoal do Software Carpentry fez o melhor tutorial que eu conheço pra aprender o básico de Bash.
começando
Em vez de apresentar as ferramentas, a gente vai aprender o básico pondo a mão na massa >:)
Eu preparei alguns documentos simples pra este tutorial, que você pode pegar neste repositório
introdução
Vamos fingir que os documentos que a gente acabou de baixar são os rascunhos que vamos entregar pro nosso Professor. Pra isso, vamos precisar juntar os rascunhos e gerar um artigo acadêmico.
Se você olhar dentro da pasta, vai ver o mapa do nosso caos atual:
- latexpaperfront.tex: A capa que a REVISTA exigiu (um cenário do mundo real: você tem um arquivo .tex e precisa convertê-lo).
- Front_page.md: A mesma capa, mas já traduzida pra markdown (o nosso estado "depois").
- draft.md: O rascunho de verdade, cheio do nosso texto brilhante e das citações.
- lorem-ipsum.md: Uma seção de mentira, só pra enfeitar.
- refs.bib: O nosso arquivo de bibliografia com as referências.
- journal.tex: A mesma capa, pronta pra ser um template: o
.texcomonde vai o texto do artigo (a gente chega lá). - reference.docx: Um docx que carrega a cara da revista (serifada, entrelinha 1,5, margem de 2,5cm), pra quando o entregável tiver que ser um docx.
instalando
Ok, vamos nessa!
A instalação depende do seu sistema operacional:
Windows
Instale: winget install --source winget --exact --id JohnMacFarlane.Pandoc (ou choco install pandoc)
Funcionou? pandoc --version
Pro PDF: você precisa de um motor LaTeX também. O MiKTeX é o que a página oficial indica:
choco install miktex
Ou: troque o motor se você usa typst: --pdf-engine=typst faz o PDF com uma ferramenta pequena em vez do LaTeX.
Linux
Instale: o seu gerenciador de pacotes tem ele (apt, dnf, pacman), com o aviso da página oficial: "check whether the pandoc version in your package manager is not outdated"
Funcionou? pandoc --version
Pro PDF: você precisa de um motor LaTeX também. O TeX Live, do mesmo gerenciador de pacotes (apt install texlive).
Ou: troque o motor se você usa typst: --pdf-engine=typst faz o PDF com uma ferramenta pequena em vez do LaTeX.
macOS
Se você ainda não usa: HomeBrew
Instale: brew install pandoc
Funcionou? pandoc --version
Pro PDF: você precisa de um motor LaTeX também. O brew install --cask mactex-no-gui é o TeX Live inteiro (quatro gigabytes de disco, e é o que a capa da revista precisa). Se você preferir pequeno, o brew install --cask basictex é o leve (uns 400 MB), e aí você instala as peças que faltarem com o tlmgr, conforme elas aparecerem. Os dois brigam entre si, então escolha um.
Ou: troque o motor se você usa typst: --pdf-engine=typst faz o PDF com uma ferramenta pequena em vez do LaTeX.
a forma do comando
Um comando básico no pandoc seria assim:
pandoc draft.md -o draft.docx
ou
pandoc draft.md -s -o draft.tex
O pandoc tem muitas flags, vamos explicar rapidinho as mais importantes:
| flag | significado |
|---|---|
| -o | Saída pra um arquivo |
| -s | Standalone |
| -f | De |
| -t | Pra |
Com as duas últimas, a gente poderia escrever um comando pra converter um dos nossos arquivos de markdown pra latex, e depois produzir uma saída em outro formato (digamos tex), assim:
pandoc draft.md -f markdown -t latex -s -o draft.tex
É só uma forma mais declarativa de fazer a mesma coisa, com o mesmo resultado.
Pergunta - como a gente converteria, com o que aprendeu, o rascunho pra um arquivo docx? Resposta
Saída
O -o é pra onde a saída vai: pandoc draft.docx -o draft.md. Sem ele, o pandoc imprime o resultado na tela em vez de escrever um arquivo.
Standalone
Isso é importante! Por padrão, o Pandoc cria um fragmento de documento. Se a gente quiser o documento INTEIRO, é essa flag que a gente usa :)
De
O -f diz qual é o FORMATO de entrada, pra quando a extensão do arquivo não conta: pandoc -f markdown ....
Pra
O -t diz qual é o FORMATO de saída, a outra metade do par acima: -f markdown -t latex transforma markdown em LaTeX.
Rascunho pra docx:
pandoc draft.md -o draft.docx
E de volta pra markdown:
pandoc draft.docx -t markdown -s -o converted_back_draft.md
convertendo de volta um documento
Depois de converter o nosso rascunho pra docx, o que aconteceria se a gente convertesse de volta pra markdown?
se a gente usar cat converted_back_draft.md, vamos ver que as nossas referências voltam assim:
\[@lorem2025\]. em vez de [@lorem2025]. e é bom ter isso em mente.
juntando (o que o PI pediu)
Pra juntar as nossas páginas, o YAML tem que vir do primeiro arquivo: quando o pandoc recebe mais de um arquivo, ele lê os metadados do primeiro, e é ali que moram o título, os autores e o resumo.
E a gente tem uma flag nova pra aprender: --citeproc, ou -C pra encurtar. É a flag que renderiza as citações, e a gente vai usar ela :)
Front_page.md -> pandoc draft.md -> pandoc refs.bib -> pandoc pandoc -> LaTeX engine LaTeX engine -> paper.pdf
O comando pra Misturar tudo num PDF só é:
pandoc Front_page.md draft.md -s --citeproc -o paper.pdf
Se você receber um erro parecido com este:
'pdflatex' not found. Please select a different --pdf-engine or install 'pdflatex'
É porque você não tem um motor Latex ou não especificou um (ou typst, se for o que você usa).
Se você já tem um, dá pra declarar assim: --pdf-engine=Seu_motor_aqui.
E o motor é uma ferramenta por conta própria: aquele draft.tex que a gente gerou antes compila sem pandoc no meio.
pdflatex draft.tex
ou
pdflatex latexpaperfront.tex
É o mesmo motor que o pandoc estava chamando pra gente, e é por isso que ele quer pacotes. Quando falta um, ele diz qual (a capa da própria revista para em File 'authblk.sty' not found numa instalação nova ou com um motor mais simples), e sudo tlmgr install <package> resolve. Pode ser que ele peça sudo tlmgr update --self em algum ponto.
Se você olhar o PDF agora, vai perceber que as referências não tiveram um lugar só delas. Pra isso, dá pra fazer de duas formas:
1. no YAML:
bibliography: refs.bib
reference-section-title: References
ou 2. no comando:
pandoc Front_page.md draft.md -s --citeproc -M reference-section-title=References -o paper.pdf
A flag -M ou --metadata serve pra especificar um campo de metadado no comando, e ela sobrescreve o que está escrito no arquivo também. Por exemplo, eu posso especificar um título novo pro meu artigo com -M title=new_title.
O que é YAML
O bloco entre os --- no topo do arquivo. É ali que um documento carrega os metadados: título, autores, data, resumo, palavras-chave e, aqui, a bibliografia também. O Pandoc lê isso como metadado em vez de imprimir na página, e cada saída sabe onde pôr: o LaTeX (e portanto o PDF) ganha uma página de título de verdade e um resumo de graça, e o HTML ganha um <title>.
--citeproc
A flag que resolve as citações. Ela lê a bibliography dos metadados (o nosso refs.bib) e faz duas coisas: todo [@chave] no texto vira uma citação de verdade, e a lista de referências é anexada no fim. -C é a forma curta dela.
Essa flag usa citações no estilo chicago por padrão. Tem uma flag pra mudar isso: --csl=FILE.
FILE pode ser qualquer Citation Style Language File pra formatar, você encontra em: https://www.zotero.org/styles
dando estilo
A capa da revista é um .tex, e a gente quer que o pandoc use ela. É isso que um template é: um arquivo LaTeX com onde vai o seu texto.
O repositório carrega o journal.tex: aquela mesma capa com o no lugar do texto do artigo. Entrega ele pro pandoc:
pandoc Front_page.md draft.md -s --citeproc -M reference-section-title=References --template=journal.tex -o paper.pdf
Eu sei que o comando parece enorme, mas se você olhar as flags, vai ver muitas que a gente já usou!
Todas as flags do comando
| flag | significado |
|---|---|
| -s | Standalone: o documento inteiro, não fragmentos. |
| --citeproc | Resolve as citações e anexa a lista de referências (-C pra encurtar). |
| -M reference-section-title=References | Um campo de metadado vindo da linha de comando: o título da lista de referências. |
| --template=journal.tex | A cara do documento: a capa da revista, com o onde vai o nosso texto. |
| -o | Pra onde a saída vai: paper.pdf. |
E os dois arquivos do começo são as entradas, e o primeiro traz os metadados que o artigo usa: título, autores, resumo e a bibliografia.
Só isso, e todo artigo que você escrever sai com a cara que a revista pediu. Se você só quer cutucar um detalhe, o -H tweak.tex enfia linhas no cabeçalho do próprio pandoc. Outra coisa é o pandoc -D latex: ele despeja o template do próprio pandoc na tela, e ignora o -o sem reclamar, então nunca sai arquivo nenhum. E ele também não é o quadro inteiro: as macros que o writer dele emite, como \tightlist, não estão lá dentro.
Uma coisa pra esperar: o LaTeX vai pedir coisas que a capa nunca teve, e elas vêm em dois tipos. Um pacote que ele nomeia (longtable, pra uma tabela) está a um \usepackage de distância, ou um sudo tlmgr install <it> se o seu TeX for o pequeno. Uma macro que ele nomeia (\tightlist, pra uma lista apertada; CSLReferences, pra bibliografia) é o outro tipo: nenhum pacote vende ela, porque ela pertence ao template do próprio pandoc. É isso que um template tem que carregar, e é por isso que o journal.tex tem aquele bloco de definições dentro dele.
quando o Professor quer um docx
Você entregou o seu pdf pro Professor, mas ele decidiu entrar de férias, e o seu novo Orientador não trabalha com arquivos .tex: ele usa templates docx:
E quando a saída não é um PDF: docx, odt e pptx não são estilizados com um template, e sim com um documento de referência, onde você entrega pro pandoc um arquivo do mesmo tipo e ele copia os estilos de dentro dele (--reference-doc=reference.docx). O manual separa os dois trabalhos: o documento de referência ajusta os estilos, o template interpola os metadados. Entregar um template LaTeX pra um docx, por falar nisso, quebra o arquivo: o pandoc enfia o template dentro dele e ele deixa de ser um docx válido.
pandoc Front_page.md draft.md -s --citeproc -M reference-section-title=References --reference-doc=reference.docx -o paper.docx
pra onde ir agora
O material oficial mora ali, e é pra onde você vai quando este post acabar: o guia de primeiros passos e o MANUAL. Tem também o Pandoc for the people onde ele vai usar WASM pra rodar o pandoc no seu navegador (com uma GUI bem legal também, caso você tenha gostado da ideia do pandoc mas não do terminal).
E quando um artigo deixa de ser um artigo: o Quarto é um sistema de publicação baseado no pandoc, onde o mesmo markdown vira um livro, um site ou slides. Ele também traz templates de revista, pra quando a capa precisar parecer a da Nature.