我从 Calc(或 Tracker)复制表格
根据我的研究,我知道三种方法:
1:录制一个宏:(@a0f cw & <ESC>;.;.I\hline <ESC>A \\
空格计数;))
然后VG:normal @a<ENTER>
2: VG:s/ / \& /gv:<UP><ENTER>gv:<UP><ENTER>
然后是和的其他\hline
宏\\
3: f <C-v>kkk23jc & <ESC>;.;.
然后再次I\hlineA \\<ESC>
还有别的办法吗?
输入示例:
0.79 0.80 5.40 6.48
0.86 0.87 4.57 5.81
0.93 0.94 4.04 5.32
输出:
\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 \\
答案1
这也许不是您想要的,但是:当我遇到这种情况时,如果我可能会做更多次,我通常会为其编写一个函数。 (这样做的一个问题是我倾向于有点过分。)
该过程也可以使用宏来完成,但我喜欢使用函数的是自定义它的灵活性。
作为宏c
,记录方式为:
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 \\.
选择范围:
<Ctrl>+v23j
:norm @c
这是一个使用函数的示例。添加到.vimrc
或更好地添加到某个自动加载目录中的文件。
它的作用是LaTeXTable()
在选定的行上执行。此外,除非参数 1 为 0,否则它会添加表的页眉和页脚。因此:
- Ctrl+v
- 选择线路。
:LEXTABLE
Enter 创建包括开始和结束的表格行。:LEXTABLE 0
Enter 仅创建表格行。:LEXTABLE c l l c
Enter 创建表行并使用“cll c”作为列说明符。
示例代码:
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>)
如果通常不想添加表的开始/结束,可以轻松地将函数更改为:
如果arg为空或0,则不创建,
如果arg=1 auto,则自动生成,
否则用作字符串。
也许更好:
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
那么:
:'<,'>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.
通过这一点,可以进一步扩展到使用表的配置文件,例如,如果参数是“P1”,则使用“cccc c”,如果“P2”使用“clcl c”等。
所有这些以及更多的人也许会尝试看一下Vim-LaTeX等等。
由上式可得:
所选线路:
0.79 0.80 5.40 6.48
0.86 0.87 4.57 5.81
0.93 0.94 4.04 5.32
命令:
:'<,'>LEXTABLE c | l l l
结果:
\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}