jats2tex converte JATS-XML para LaTeX.
- Instale o gerenciador de pacotes Haskell
stack - Instale as bibliotecas nativas
expat,icu,gpmestdc++usando o gerenciador de pacotes do seu sistema git clone https://github.com/beijaflor-io/jats2texcd jats2texgit 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.
@@childrenInterpola todos os filhos da tag atual convertidos como LaTeX@@headsInterpola todos os filhos da tag atual marcados como 'head'@@bodiesInterpola 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 jats2tex@x.x.x.x
\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 atributoattrno elemento atual como textofind(<tag>)Encontra os filhos do elemento atual que sejam instâncias da tagtage 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.



