Cara menggambar kotak dan tabel dalam teks biasa

42

Dalam banyak dokumen teks biasa, karakter menggambar kotak digunakan untuk menggambar kotak ini dalam gambar dan tabel. Contoh seperti itu (dari RFC 5766 ) ditunjukkan di bawah ini. Apakah ada cara yang lebih baik untuk menggambar ini ( misalnya, alat baris perintah Unix) , selain menggunakan metode coba-coba?


Contoh dari RFC 5766 :

       +----------------------------+---------------------+
       | TURN client to TURN server | TURN server to peer |
       +----------------------------+---------------------+
       |             UDP            |         UDP         |
       |             TCP            |         UDP         |
       |        TLS over TCP        |         UDP         |
       +----------------------------+---------------------+

Dan yang ini, juga dari RFC 5766 :

                                        Peer A
                                        Server-Reflexive    +---------+
                                        Transport Address   |         |
                                        192.0.2.150:32102   |         |
                                            |              /|         |
                          TURN              |            / ^|  Peer A |
    Client's              Server            |           /  ||         |
    Host Transport        Transport         |         //   ||         |
    Address               Address           |       //     |+---------+
   10.1.1.2:49721       192.0.2.15:3478     |+-+  //     Peer A
            |               |               ||N| /       Host Transport
            |   +-+         |               ||A|/        Address
            |   | |         |               v|T|     192.168.100.2:49582
            |   | |         |               /+-+
 +---------+|   | |         |+---------+   /              +---------+
 |         ||   |N|         ||         | //               |         |
 | TURN    |v   | |         v| TURN    |/                 |         |
 | Client  |----|A|----------| Server  |------------------|  Peer B |
 |         |    | |^         |         |^                ^|         |
 |         |    |T||         |         ||                ||         |
 +---------+    | ||         +---------+|                |+---------+
                | ||                    |                |
                | ||                    |                |
                +-+|                    |                |
                   |                    |                |
                   |                    |                |
             Client's                   |            Peer B
             Server-Reflexive    Relayed             Transport
             Transport Address   Transport Address   Address
             192.0.2.1:7000      192.0.2.15:50000     192.0.2.210:49191

                                 Figure 1
jackxujh
sumber
2
Meskipun ini sudah memiliki banyak jawaban, saya pikir itu mungkin seharusnya ditanyakan pada softwarerecs.stackexchange.com Kami sering menjawab hal semacam ini
Mawg
untuk tabel, Anda dapat menggunakan sesuatu seperti pandoc-placetable untuk beralih dari csv ke tabel penurunan harga ... (atau sekadar pandoc jika input Anda html atau docx)
mb21

Jawaban:

47

Situs web ASCIIflow gratis akan memungkinkan Anda menggambar kotak teks, teks, garis, panah, garis bentuk bebas, hapus, impor, ekspor, dan bahkan undo / redo. Apa lagi yang dibutuhkan seseorang?

Ini kreasi saya yang luar biasa menggunakan alat ini:

+-------------------------------+
|                               |
|  My first ASCII box           |
|                               |
+---------+---------------------+
          |
          |
          |
          | My first ever ASCII arrow
          |
          |
          |
+---------v----------------------+
|                                |
|  My second ASCII box           |
+--------------------------------+
harrymc
sumber
Salah satu kelemahan dari situs web itu adalah penanganan clipboard. Anda tidak dapat menyalin / menempelkan secara langsung. Anda harus melakukannya melalui tombol di sisi kanan.
Ismael Miguel
5
Juga tombol 'Unduh' ternyata adalah tombol impor. Dan tombol 'Unggah' ternyata menjadi tombol ekspor. Mungkin saya, tapi itu benar-benar membingungkan.
Mixxiphoid
1
@Mixxiphoid Tidak, bukan hanya Anda. Dan ya, ini benar-benar membingungkan, tetapi berhasil!
Ismael Miguel
17

Hal ini dimungkinkan untuk membuat gambar tersebut dengan menggunakan alat dating kembali 30 tahun, yaitu pic yang merupakan bagian dari troffperintah suite. Hari ini groffpaket gnu akan berisi picperintah. Tautan menunjukkan gambar dari beberapa output PostScript yang khas, tetapi menggunakan nroffatau opsi yang sesuai Anda akan mendapatkan versi ascii-art. Lihat manual pengguna (pdf) dari 1991 untuk contoh.

Tabel dalam contoh Anda mungkin diproduksi oleh command suite yang sama ini, hanya menggunakan tblyang menghasilkan tabel dari daftar sederhana.

Untuk versi gui , Anda dapat menggunakan artist-modeemacs untuk menggambar kotak dan garis panah dll, menggunakan mouse atau keyboard. Lihat demo video youtube .

meuh
sumber
Tidak picmirip dengan graphviz dot?
hjpotter92
Iya. graphviz dapat menampilkan dalam format pic. Saya pikir mereka berdua dari latar belakang AT&T Unix yang sama, dengan graphviz menjadi aplikasi tujuan khusus yang mendapat pengembangan lebih lanjut, sementara pic memberi jalan ke alat gaya gui.
meuh
10

Kotak gambar atau bentuk lain dengan karakter dikenal sebagai seni ASCII (juga seni ANSI atau ISO). Ada banyak alat untuk membantu menciptakan seni ASCII, seperti ASCIIFlow online , rendering gambar dalam ASCII , aplikasi seperti figlet, dll. Beberapa telah diterapkan dalam JavaScript dan dapat dijalankan di browser pada OS apa pun.

Tidak ada yang baru di bawah matahari - mikrografi adalah bagian dari kaligrafi dengan silsilah yang panjang, yang digunakan selama ratusan tahun, menggunakan huruf untuk membentuk gambar, seperti kalender di bawah ini , dengan sebagian besar gambar terbentuk dari huruf.

Kalender Omer, Sotheby

DrMoishe Pippik
sumber
8

Bagaimana saya bisa menggambar tabel ASCII?

Jika Anda hanya ingin menggambar tabel ASCII (seperti contoh pertama Anda) lihat generator Plain Text Tables - TablesGenerator.com untuk utilitas web yang akan membantu Anda membuat tabel data yang bagus:

masukkan deskripsi gambar di sini

DavidPostill
sumber
3

Dari baris perintah menggunakan terminal-table dari GitHub .

Pasang terminal-table:

gem install terminal-table

Sebagai contoh:

irb
require 'terminal-table'

rows = []
rows << ['UDP', 'UDP']
rows << ['TCP', 'UDP']
rows << ['TLS over TCP ', 'UDP']
table = Terminal::Table.new :headings => ['TURN client to TURN server', 'TURN server to peer'], :rows => rows

puts table

Output sampel:

+----------------------------+---------------------+
| TURN client to TURN server | TURN server to peer |
+----------------------------+---------------------+
| UDP                        | UDP                 |
| TCP                        | UDP                 |
| TLS over TCP               | UDP                 |
+----------------------------+---------------------+

Output yang sama dapat diperoleh dengan menggunakan python:

pip install terminaltables

sebagai contoh:

from terminaltables import AsciiTable
table_data = [
    ['TURN client to TURN server', 'TURN server to peer'],
    ['UDP', 'UDP'],
    ['TCP', 'UDP'],
    ['TLS over TCP', 'UDP']
]
table = AsciiTable(table_data)
print table.table
GAD3R
sumber
1

Saya memiliki ini di .vimrc:

vn<silent> <leader>[ :<c-u>cal<sid>rect(1)<cr>
vn<silent> <leader>] :<c-u>cal<sid>rect(2)<cr>
let s:h=split(' ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋','\zs')
let s:e=map(range(81),'[v:val/27%3,v:val/9%3,v:val/3%3,v:val%3]') "base-3 encode
fu s:rect(x) "x:thickness
 if visualmode()!=#"\<c-v>"|retu|en
 let s=&sel|let&sel='inclusive'|let[ls,cs]=[[line("'<"),line("'>")],[virtcol("'<"),virtcol("'>")]]|let&sel=s
 let[l0,l1,c0,c1]=[min(ls),max(ls),min(cs),max(cs)]
 let a=map(map(getline(l0,l1),"split(v:val,'\\zs')"),"extend(v:val,repeat([' '],max([0,c1-len(v:val)])))")
 let x=a:x|let[V,H]=[[x,0,x,0],[0,x,0,x]] "vertical and horizontal line
 "b:list of changes as [line,column,bitmask]
 if l0<l1&&c0<c1|let b=[[l0,c0,[x,0,0,x]],[l0,c1,[x,x,0,0]],[l1,c0,[0,0,x,x]],[l1,c1,[0,x,x,0]]]
                 let b+=map(range(l0+1,l1-1),'[v:val,c0,V]')+map(range(l0+1,l1-1),'[v:val,c1,V]')
                 let b+=map(range(c0+1,c1-1),'[l0,v:val,H]')+map(range(c0+1,c1-1),'[l1,v:val,H]')
 elsei l0<l1    |let b=[[l0,c0,[x,0,0,0]],[l1,c0,[0,0,x,0]]]+map(range(l0+1,l1-1),'[v:val,c0,V]')
 elsei c0<c1    |let b=[[l0,c0,[0,0,0,x]],[l0,c1,[0,x,0,0]]]+map(range(c0+1,c1-1),'[l0,v:val,H]')
 el             |let b=[]|en
 for[l,c,m]in b
  let i=index(s:h,a[l-l0][c-1])
  if i>=0|let z=map(copy(s:e[i]),'max([v:val,m[v:key]])')|let a[l-l0][c-1]=s:h[27*z[0]+9*z[1]+3*z[2]+z[3]]|en
 endfo
 cal setline(l0,map(a,"join(v:val,'')"))
endf

Memilih persegi panjang dalam mode blok-visual ( <C-v>) dan menekan <leader>[menempatkan karakter menggambar garis di perbatasannya, menggabungkan mereka dengan karakter menggambar garis yang sudah ada sebelumnya. Jika Anda bersikeras ASCII murni +-|sebagai gantinya, itu harus mudah untuk dimodifikasi.

ngn
sumber
0

Untuk semua pengguna Vim di luar sana, tersedia dua plugin oldtimer terhormat:

  • DrawIt! plugin ; ini belum melihat pembaruan dalam bertahun-tahun, tetapi penulisnya masih aktif, jadi ini mengatakan sesuatu tentang jatuh tempo. Ini bagus untuk kotak dan garis penghubung; apa yang diminta di sini. (Ia bahkan dapat melakukan lingkaran dan elips!)
  • sketch.vim tidak terawat, dan lebih digerakkan mouse, gaya lukisan

Anda dapat menggunakan kedua plugin secara paralel, hanya saja keduanya tidak aktif secara bersamaan.

Ingo Karkat
sumber