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}