Converter tabela no LaTeX

2

Eu copio a tabela do Calc (ou Tracker)

Na minha pesquisa, conheço três maneiras:

1: Gravar uma macro: @a0f cw & <ESC>;.;.I\hline <ESC>A \ (os espaços contam;)))
E então VG:normal @a<ENTER>

2: VG:s/ / \& /gv:<UP><ENTER>gv:<UP><ENTER>
e depois outra macro para o \hline e \

3: f <C-v>kkk23jc & <ESC>;.;.
E novamente I\hlineA \<ESC>

Existe outro jeito?

Exemplo de entrada:

0.79    0.80    5.40    6.48
0.86    0.87    4.57    5.81
0.93    0.94    4.04    5.32

Saída:

\hline 0.79 & 0.80 & 5.40 & 6.48 \
\hline 0.86 & 0.87 & 4.57 & 5.81 \
\hline 0.93 & 0.94 & 4.04 & 5.32 \
    
por David 30.03.2013 / 07:28

1 resposta

1

Isso talvez não seja o que você quer, mas: quando me deparo com essas situações, e se é provável que eu vou fazer mais algumas vezes eu costumo escreva uma função para isso. ( Um problema com isso é que eu tento ir um pouco ao mar. )

O procedimento pode ser feito usando macro também, mas o que eu gosto sobre o uso funções é a flexibilidade para personalizá-lo.

Como macro c , grave por:

qc:s/\s\+/ \& /g<Enter>:s/^/\hline /<Enter>:s/$/\\/<Enter>q

    s/\s\+/ \& /g   Substitute 1+ spaces with " & ", globally.
    s/^/\hline /   Substitute start of line with \hline.
    s/$/\\/       Substitute end of line with \.

Selecione o intervalo:

<Ctrl>+v23j
:norm @c

Aqui está um exemplo usando a função. Adicione a .vimrc , ou melhor, a um arquivo em algum diretório de carregamento automático.

O que isto faz é executar LaTeXTable() nas linhas selecionadas. além do que, além do mais ele adiciona cabeçalho e rodapé para tabela, a menos que o argumento 1 seja 0. Então:

  • Ctrl + v
  • Selecione linhas.
    • :LEXTABLE Insira Crie linhas de tabela, incluindo início e fim.
    • :LEXTABLE 0 Enter Cria apenas linhas de tabela.
    • :LEXTABLE c l l c Insira Crie linhas de tabela e use 'c l l c' como especificadores de coluna.

Exemplo de código:

function! LaTeXTable(...) range
    " Replace consecutive spaces with " & "
    '<,'>s/\s\+/ \& /g
    " Replace start with \hline
    '<,'>s/^\s*/\hline /
    " Replace end with \
    '<,'>s/\s*$/ \\/

    " If argument is 0 then do not add table def
    if a:1 == "0"
        return
    " Else if argument is not empty use it as column specifier
    elseif a:1 != ""
        let cc = a:1
    " Else split first line on & and make all center c
    else
        let ands = split(getline(a:firstline), '&')
        call map(ands, '"c"')
        let cc = join(ands, " ")
    endif

    " Add start of table
    call append(a:firstline - 1,"\begin{tabular}{ " . cc . " }")
    " Add end of table
    call append(a:lastline  + 1,"\end{tabular}")
endfun

" -nargs=? allow 0 or 1 argument
" -range   use range
" LEXTABLE name
" silent   do not echo what is done
" <line.>  range
" <q-args> Quote argument
command! -nargs=? -range LEXTABLE silent <line1>,<line2>call LaTeXTable(<q-args>)

Se alguém não quiser adicionar início / fim da tabela, pode facilmente mudar a função para dizer:

se arg estiver vazio ou 0, então não crie,
se arg = 1 auto, em seguida, gerar automaticamente mais use como string
.

Talvez seja preferível:

if a:1 == "" || a:1 == "0"
    return
elseif a:1 != "1"
    let cc=a:1
else
    let ands = split(getline(a:firstline), '&')
    call map(ands, '"c"')
    let cc = join(ands, " ")
endif

Então, então:

:'<,'>LEXTABLE<Enter>           # Only parse lines, no header.
:'<,'>LEXTABLE 0<Enter>         # Only parse lines, no header.
:'<,'>LEXTABLE 1<Enter>         # Auto generate column specifiers.
:'<,'>LEXTABLE c l<Enter>       # Use 'c l' as column specifiers.
:'<,'>LEXTABLE c | l l<Enter>   # Use 'c | l l' as column specifiers.

Por isso, pode-se expandir ainda mais para usar perfis para tabelas, como em, e. E se argumento é "P1" use "c c c c c", se "P2" usar "c l c l c" etc.

Tudo isso e mais um talvez tente dar uma olhada em Vim-LaTeX e afins.

Do anterior, obteria:

Linhas selecionadas:

0.79    0.80    5.40    6.48
0.86    0.87    4.57    5.81
0.93    0.94    4.04    5.32

Comando:

:'<,'>LEXTABLE c | l l l

Resultado:

\begin{tabular}{ c | l l l }
\hline 0.79 & 0.80 & 5.40 & 6.48 \
\hline 0.86 & 0.87 & 4.57 & 5.81 \
\hline 0.93 & 0.94 & 4.04 & 5.32 \
\end{tabular}
    
por 30.03.2013 / 09:49

Tags