在 LaTeX 中转换表格

在 LaTeX 中转换表格

我从 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
  • 选择线路。
    • :LEXTABLEEnter 创建包括开始和结束的表格行。
    • :LEXTABLE 0Enter 仅创建表格行。
    • :LEXTABLE c l l cEnter 创建表行并使用“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}

相关内容