jats2tex converte JATS-XML para LaTeX.
- Instale o gerenciador de pacotes Haskell
stack
- Instale as bibliotecas nativas
expat
,icu
,gpm
estdc++
usando o gerenciador de pacotes do seu sistema git clone https://github.com/beijaflor-io/jats2tex
cd jats2tex
git submodule update --init --recursive
- Execute
stack install --install-ghc
Ver https://hub.docker.com/r/beijaflorio/jats2tex/
docker run -it beijaflorio/jats2tex \
-e AWS_ACCESS_KEY_ID="" \ # Chaves no AWS para envio de e-mails pelo SES
-e AWS_DEFAULT_REGION="" \
-e AWS_SECRET_ACCESS_KEY="" \
-e HOST="*4" \ # O host para escutar por conexões
-e PGDATABASE="" \ # Nome do banco de dados PostgreSQL
-e PGHOST="" \ # Host do banco de dados PostgreSQL
-e PGPASS="" \ # Senha do banco de dados PostgreSQL
-e PGUSER="" \ # Usuário do banco de dados PostgreSQL
-e STATIC_DIR="/usr/local/var/jats2tex/static" # Onde estão os arquivos estáticos (na imagem estão nesse local)
jats2tex - Customizable JATS to LaTeX Conversion
Usage: jats2tex (version | upgrade | [-o|--output OUTPUT_FILE]
[-t|--template TEMPLATE_FILE] [-w|--max-width MAX_COLUMN_WIDTH]
[-W|--warnings] INPUT_FILE)
Convert JATS-XML INPUT_FILE to LaTeX OUTPUT_FILE
Available options:
-o,--output OUTPUT_FILE LaTeX Output File
-t,--template TEMPLATE_FILE
YAML/JSON Template File
-w,--max-width MAX_COLUMN_WIDTH
Maximum Column Width 80 by default, set to 0 to
disable
-W,--warnings Enable warnings
INPUT_FILE XML Input File
-h,--help Show this help text
Available commands:
version Print the version
upgrade Upgrade jats2tex
Converter arquivo teste.xml e imprimir resultado no terminal
jats2tex ./teste.xml
Converter arquivo teste.xml e imprimir resultado em teste.tex
jats2tex ./teste.xml --output ./teste.tex
Limitar o número de colunas em 100 caracteres
jats2tex ./teste.xml --max-width 100
Desativar "text wrapping"
jats2tex ./teste.xml --max-width 0
Para controlar o formato da saída, usamos um arquivo em formato YAML descrevendo o mapa de tags para TeX.
O template é especificado para o comando usando a flag -t
:
jats2tex ./teste.xml -t ./meu-template.yaml
O arquivo mapeia {nome-da-tag}: "\latexcorrespondente"
e permite a
interpolação de variáveis de contexto e expressões de Haskell para a
conversão de nódulos XML para LaTeX.
@@children
Interpola todos os filhos da tag atual convertidos como LaTeX@@heads
Interpola todos os filhos da tag atual marcados como 'head'@@bodies
Interpola todos os filhos da tag atual marcados como 'body'
Definimos tags com:
conteudoxml: |
\conteudolatex{@@children e outras varíaveis ou interpolações}
# ou
conteudoxml-com-head:
# Conteúdo '@@bodies' dessa correspondência
# (equivale a `conteudoxml-com-head: "\asdfasdf{}"`)
body: |
\asdfadsf{}
# Conteúdo '@@heads' dessa correspondência
head: |
\conteudolatex{@@children e outras varíaveis ou interpolações}
O template default.yaml
incluso no jats2tex
define o seguinte mapa para a
tag b
, que indica texto em negrito:
b: |
\textbf{@@children}
Dado esse template e um arquivo XML como:
<b>Olá mundo</b>
O programa irá produzir:
% Generated by [email protected]
\textbf{Olá mundo}
Dado um XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<article-meta>
<title-group>
<article-title xml:lang="en">My Title</article-title>
</title-group>
</article-meta>
</front>
<body>Meu texto aqui</body>
</article>
Queremos a saída:
\documentclass{article}
\begin{document}
\title{My Title}
\maketitle
Meu texto aqui
\end{document}
Para isso podemos usaríamos o template:
article:
head: |
\documentclass{article}
\begin{document}
@@heads
\maketitle
@@bodies
\end{document}
article-title:
head: |
\title{@@children}
Como article-title
tem sua saída marcada como head
, seu conteúdo é
interpolado como @@heads
, enquanto o corpo do texto por padrão simplesmente é
interpolado como visto, se não estiver mapeado por @@bodies
.
Além das diretrizes acima, o jats2tex
incluí em seus templates suporte para a
interpolação de expressões arbitrárias nas linguagens de programação Haskell e
Lua, que são executadas em runtime.
A sintaxe é:
p: |
\saida{@@(
findChildren "font"
)@@}
A sintaxe é:
p: |
\saida{@@lua(
return find("font")
)@@}
Os helpers disponíveis são:
children()
Retorna os filhos do elemento atual como textoattr(<attr>)
Retorna o valor do atributoattr
no elemento atual como textofind(<tag>)
Encontra os filhos do elemento atual que sejam instâncias da tagtag
e os retorna como textoelements()
Encontra apenas os filhos do elemento atual que sejam elementos XML ignorando qualquer texto, quebras de linha e espaços nos filhos diretos do elemento atual
Template:
name: |
@@lua(
s = find "surname"
g = find "given-names"
return s .. ", " .. g
)@@
contrib-group:
head: |
\author{@@lua(
return table.concat(elements(), '\\and ')
)@@}
Entrada:
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Quiroga Selez]]></surname>
<given-names><![CDATA[Gabriela]]></given-names>
</name>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Giménez Turba]]></surname>
<given-names><![CDATA[Alberto]]></given-names>
</name>
</contrib>
</contrib-group>
Saída:
\author{Quiroga Selez, Gabriela
\and Giménez Turba, Alberto
}
Em aberto, os templates usados pelo Jats2tex terão um formato de fácil escrita por
humanos e computadores, um mapa de chaves e valores com suporte a nesting
(por exemplo, conf
, yml
, json
, ini
).
A partir do formato do template com suporte a customização da renderização de elementos e atributos em contextos diferentes, um tipo intermediário e um renderizador estilo "Visitor", o programa lerá e executará um parser XML no input, conseguindo um tipo 'Artigo' - ou falhando com entrada inválida.
O programa usa o template para configurar um renderizador desse tipo para
LaTeX, usando uma linguagem monádica exposta pelo pacote HaTeX
.
A tecnologia usada para elaborar a solução será a linguagem de programação Haskell e pacotes embutidos para:
- A construção de parsers
- Parsing de arquivos XML
- Renderização de LaTeX/ConText válido
O trabalho será feito usando a metodologia Agile de desenvolvimento de Software. Assim o trabalho será dividido em metas curtas (Sprints) com o período de uma semana.
O projeto será disponibilizado online via GitHub, escrito usando código aberto. Ao final de cada semana, uma versão será empacotada e publicada com as melhorias executadas.
Um endpoint POST
receberá dados em formato JATS-XML e dará o texto convertido
para LaTeX como resposta. Opcionalmente, recebe também o arquivo/texto de um
template.
Opções serão expostas pela linha de comando usando o optparse-applicative
, o
comando recebe um template e uma entrada JATS-XML e escreve o resultado para a
saída padrão.