Guida Altro Come lavoro normalmente con Vim e il LaTeX

nfvblog

Moderatore
9 Dicembre 2021
664
67
327
450
Ultima modifica:

Come lavoro normalmente con Vim e il LaTeX​

Screenshot 2022-11-04 alle 13.43.50.png

Caso tipo di utilizzo

1    Introduzione

Visto che utilizzo il linguaggio in questione molto spesso, ho deciso di condividere il mio metodo di lavoro, infatti, io ho dovuto creare una mia configurazione ad hoc per lo scopo, tipicamente sono un utente Emacs e Vim sotto Linux, BSD e Mac os (unici sistemi in mio possesso), nello specifico in questo post voglio esporre le mie macro di Vim, che fino ad oggi ho migliorato e che nel caso di alcune sono nuove e ancora da fixare.

1.1    Codice

In questo caso ho creato un file in vim script nel modo più classico possibile, con le istruzioni \c e \v, mentre, per velocizzare la scrittura dei caratteri uso la virgola come tasto tabulatore e poi le iniziali che ho definito per il singolo componente, ovviamente parlando del vim script esattamente come avviene per il Elisp è pensato per lavorare sui caratteri, anche se il secondo ovviamente essendo un pratico dialetto del lisp è più potente essendo un linguaggio fatto e finito in vece di un pseudo linguaggio come nel caso del vim script.

Ma per essere più chiari sul funzionamento delle macro in questione faccio l'esempio di ,it corrispontera alla stampa di \textit{} per il testo in italic, ovviamente il cursore si spostera al all'interno delle due graffe per essere subito pronto all'uso e così accatte per tutti i metodi.

Altre funzioni di rilievo sono <F6> che attiva il correttore ortografico e <F3> che fa il detex
Codice:
" Compile
    autocmd FileType tex,plaintex map \c <Esc>:w<Enter>:!pdflatex<space><c-r>%<Enter>a
    autocmd FileType tex,plaintex map \v :!open $(echo % \| sed 's/tex$/pdf/') & disown<CR><CR>
" Word count:
    autocmd FileType tex,plaintex map <F3> :w !detex \| wc -w<CR>
    autocmd FileType tex,plaintex inoremap <F3> <Esc>:w !detex \| wc -w<CR>

" LATEX SYNTAX
    autocmd FileType tex,plaintex inoremap ,fr \begin{frame}<Enter>\frametitle{}<Enter><Enter><++><Enter><Enter>\end{frame}<Enter><Enter><++><Esc>6kf}i
    autocmd FileType tex,plaintex inoremap ,fi \begin{fitch}<Enter><Enter>\end{fitch}<Enter><Enter><++><Esc>3kA
    autocmd FileType tex,plaintex inoremap ,exe \begin{exe}<Enter>\ex<Space><Enter>\end{exe}<Enter><Enter><++><Esc>3kA
    autocmd FileType tex,plaintex inoremap ,em \emph{}<++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,bf \textbf{}<++><Esc>T{i
    autocmd FileType tex,plaintex vnoremap , <ESC>`<i\{<ESC>`>2la}<ESC>?\\{<Enter>a
    autocmd FileType tex,plaintex inoremap ,it \textit{}<++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,ct \textcite{}<++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,cp \parencite{}<++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,glos {\gll<Space><++><Space>\\<Enter><++><Space>\\<Enter>\trans{``<++>''}}<Esc>2k2bcw
    autocmd FileType tex,plaintex inoremap ,x \begin{xlist}<Enter>\ex<Space><Enter>\end{xlist}<Esc>kA<Space>
    autocmd FileType tex,plaintex inoremap ,ol \begin{enumerate}<Enter><Enter>\end{enumerate}<Enter><Enter><++><Esc>3kA\item<Space>
    autocmd FileType tex,plaintex inoremap ,ul \begin{itemize}<Enter><Enter>\end{itemize}<Enter><Enter><++><Esc>3kA\item<Space>
    autocmd FileType tex,plaintex inoremap ,li <Enter>\item<Space>
    autocmd FileType tex,plaintex inoremap ,ref \ref{}<Space><++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,tab \begin{tabular}<Enter><++><Enter>\end{tabular}<Enter><Enter><++><Esc>4kA{}<Esc>i
    autocmd FileType tex,plaintex inoremap ,tab* \begin{tabular*}<Enter><++><Enter>\end{tabular*}<Enter><Enter><++><Esc>4kA{}<Esc>i
    autocmd FileType tex,plaintex inoremap ,ot \begin{tableau}<Enter>\inp{<++>}<Tab>\const{<++>}<Tab><++><Enter><++><Enter>\end{tableau}<Enter><Enter><++><Esc>5kA{}<Esc>i
    autocmd FileType tex,plaintex inoremap ,can \cand{}<Tab><++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,con \const{}<Tab><++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,v \vio{}<Tab><++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,a \href{}{<++>}<Space><++><Esc>2T{i
    autocmd FileType tex,plaintex inoremap ,sc \textsc{}<Space><++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,chap \chapter{}<Enter><Enter><++><Esc>2kf}i
    autocmd FileType tex,plaintex inoremap ,sec \section{}<Enter><Enter><++><Esc>2kf}i
    autocmd FileType tex,plaintex inoremap ,ssec \subsection{}<Enter><Enter><++><Esc>2kf}i
    autocmd FileType tex,plaintex inoremap ,sssec \subsubsection{}<Enter><Enter><++><Esc>2kf}i
    autocmd FileType tex,plaintex inoremap ,st <Esc>F{i*<Esc>f}i
    autocmd FileType tex,plaintex inoremap ,beg \begin{DELRN}<Enter><++><Enter>\end{DELRN}<Enter><Enter><++><Esc>4k0fR:MultipleCursorsFind<Space>DELRN<Enter>c
    autocmd FileType tex,plaintex inoremap ,up <Esc>/usepackage<Enter>o\usepackage{}<Esc>i
    autocmd FileType tex,plaintex nnoremap ,up /usepackage<Enter>o\usepackage{}<Esc>i
    autocmd FileType tex,plaintex inoremap ,tt \texttt{}<Space><++><Esc>T{i
    autocmd FileType tex,plaintex inoremap ,bt {\blindtext}
    autocmd FileType tex,plaintex inoremap ,nu $\varnothing$
    autocmd FileType tex,plaintex inoremap ,col \begin{columns}[T]<Enter>\begin{column}{.5\textwidth}<Enter><Enter>\end{column}<Enter>\begin{column}{.5\textwidth}<Enter><++><Enter>\end{column}<Enter>\end{columns}<Esc>5kA
    autocmd FileType tex,plaintex inoremap ,rn (\ref{})<++><Esc>F}i
    autocmd FileType tex,plaintex inoremap ,cr \begin{center}<Enter><++><Enter>\end{center}<Enter><Enter><++><Esc>4kAi<tab>
    autocmd FileType tex,plaintex inoremap ,mul \begin{multicols}{<++>}<Enter><Enter>\end{multicols}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,proof \begin{proof}<Enter><Enter>\end{proof}<Enter><Enter><++>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,tks \begin{tasks}<Enter><Enter>\end{tasks}<Enter><Enter><++><Esc>3kA\task<Space>
    autocmd FileType tex,plaintex inoremap ,tk <Enter>\task<Space>

    "math struct
    autocmd FileType tex,plaintex inoremap ,eq \begin{equation}<Enter><Enter>\end{equation}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,eq* \begin{equation*}<Enter><Enter>\end{equation*}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,eqn \begin{eqnarray}<Enter><Enter>\end{eqnarray}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,eqn* \begin{eqnarray*}<Enter><Enter>\end{eqnarray*}<Enter><Enter><++><Esc>3ki<tab>
  
    autocmd FileType tex,plaintex inoremap ,eqn* \begin{eqnarray*}<Enter><Enter>\end{eqnarray*}<Enter><Enter><++><Esc>3ki<tab>
    "math struct
    autocmd FileType tex,plaintex inoremap ,al \begin{align}<Enter><Enter>\end{align}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,al* \begin{align*}<Enter><Enter>\end{align*}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,bsymb \boldsymbol{<++>}
    autocmd FileType tex,plaintex inoremap ,( \left(
    autocmd FileType tex,plaintex inoremap ,) \right)
    autocmd FileType tex,plaintex inoremap ,[ \left[
    autocmd FileType tex,plaintex inoremap ,] \right]
    autocmd FileType tex,plaintex inoremap ,{ \left{
    autocmd FileType tex,plaintex inoremap ,} \right}
    autocmd FileType tex,plaintex inoremap ,ovrt \overrightarrow{<++>}
    autocmd FileType tex,plaintex inoremap ,ovlt \overleftarrow{<++>}
    autocmd FileType tex,plaintex inoremap ,ovl \overline{<++>}
  

    "" matrix
    autocmd FileType tex,plaintex inoremap ,mtx \begin{matrix}<Enter><Enter>\end{matrix}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,mtx* \begin{matrix*}<Enter><Enter>\end{matrix*}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,pmtx \begin{pmatrix}<Enter><Enter>\end{pmatrix}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,pmtx* \begin{pmatrix*}<Enter><Enter>\end{pmatrix*}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,vmtx \begin{vmatrix}<Enter><Enter>\end{vmatrix}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,vmtx* \begin{vmatrix*}<Enter><Enter>\end{vmatrix*}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,Vmtx \begin{Vmatrix}<Enter><Enter>\end{Vmatrix}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,bmtx \begin{bmatrix}<Enter><Enter>\end{bmatrix}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,bmtx* \begin{bmatrix*}<Enter><Enter>\end{bmatrix*}<Enter><Enter><++><Esc>3ki<tab>
    autocmd FileType tex,plaintex inoremap ,Bmtx \begin{Bmatrix}<Enter><Enter>\end{Bmatrix}<Enter><Enter><++><Esc>3ki<tab>
  
    "" cases
    autocmd FileType tex,plaintex inoremap ,cases \begin{cases}<Enter><Enter>\end{cases}<Enter><Enter><++><Esc>3ki<tab>
  
    "" sum
    autocmd FileType tex,plaintex inoremap ,sum \displaystyle\sum_{<++>}^{<++>}
  
    "" int.
    autocmd FileType tex,plaintex inoremap ,int \int_{<++>}^{<++>}
    autocmd FileType tex,plaintex inoremap ,intlt \int\limits_{<++>}^{<++>}
  

""".bib
    autocmd FileType bib inoremap ,a @article{<Enter><tab>author<Space>=<Space>"<++>",<Enter><tab>year<Space>=<Space>"<++>",<Enter><tab>title<Space>=<Space>"<++>",<Enter><tab>journal<Space>=<Space>"<++>",<Enter><tab>volume<Space>=<Space>"<++>",<Enter><tab>pages<Space>=<Space>"<++>",<Enter><tab>}<Enter><++><Esc>8kA,<Esc>i
    autocmd FileType bib inoremap ,b @book{<Enter><tab>author<Space>=<Space>"<++>",<Enter><tab>year<Space>=<Space>"<++>",<Enter><tab>title<Space>=<Space>"<++>",<Enter><tab>publisher<Space>=<Space>"<++>",<Enter><tab>}<Enter><++><Esc>6kA,<Esc>i
    autocmd FileType bib inoremap ,c @incollection{<Enter><tab>author<Space>=<Space>"<++>",<Enter><tab>title<Space>=<Space>"<++>",<Enter><tab>booktitle<Space>=<Space>"<++>",<Enter><tab>editor<Space>=<Space>"<++>",<Enter><tab>year<Space>=<Space>"<++>",<Enter><tab>publisher<Space>=<Space>"<++>",<Enter><tab>}<Enter><++><Esc>8kA,<Esc>i
Materiale disponibile cliccando qui.

2    Altri articoli che ho scritto sull'argomento

Non è la prima volta che parlo di questo argomento sul forum, per maggiori info, consiglio una lettura anche degli altri due post che ho pubblicato a riguardo:

3    Come puoi contribuire ai miei progetti?

Come al solito per chi vuole sostenere il miei progetti, può farlo in due modi:
  • Se disponi delle competenze necessarie per poter collaborare direttamente nella scrittura e nella miglioria del codice puoi darmi una mano diretta su github;
  • altrimenti, puoi farmi una donazione su ko-fi di quelche spiccio, tramite le stesse potrò sopperire al alcune ad eventuali sostituzioni hardware
 
Per fare i disegni (se li fai) cosa usi? Metapost, TikZ, Graphviz, Inkscape? Ho sempre detestato fare qualsiasi tipo di disegno.

Elisp ... essendo un pratico dialetto del common lisp
Dire "elisp è un dialetto del common lisp" è un po' come dire "debian è una distribuzione di archlinux", sono due diversi dialetti del lisp.
 
Ultima modifica:
Per fare i disegni (se li fai) cosa usi? Metapost, TikZ, Graphviz, Inkscape? Ho sempre detestato fare qualsiasi tipo di disegno.


Dire "elisp è un dialetto del common lisp" è un po' come dire "debian è una distribuzione di archlinux", sono due diversi dialetti del lisp.
rispetta lo standard, common lisp è uno standard oltre che un linguaggio ed è stato creato perché c'era un vago problema con la frammentazione del lisp, comunque ho corretto, effettivamente dava un po' di confusione, comunque utilizzo molto TikZ, octave/matlab e anche Inkscape
 
rispetta lo standard, common lisp è uno standard oltre che un linguaggio ed è stato creato perché c'era un vago problema con la frammentazione del lisp
Sì, ma common lisp ed elisp sono due linguaggi diversi. Sono due dialetti di lisp, ma è un po' come dire "C e Java sono due dialetti di Algol".

TikZ, octave/matlab e anche Inkscape
Hai qualche setup particolare per semplificarti la vita? So che per inkscape esiste un plugin per esportare in TikZ (anche se il codice generato è poco gestibile).
 
Ultima modifica:
Sì, ma common lisp ed elisp sono due linguaggi diversi. Sono due dialetti di lisp, ma è un po' come dire "C e Java sono due dialetti di Algol".


Hai qualche setup particolare per semplificarti la vita? So che per inkscape esiste un plugin per esportare in TikZ (anche se il codice generato è poco gestibile).
fatto sta che entrambi sono basati sul ANSI X3.226-1994 Information Technology Programming Language Common Lisp, per tanto sono linguaggio con un legame di parentela abbastanza stretto al contrario di altri lisp che non hanno quasi niente in comune, diciamo che sono cugini, mentre Algol e C non centrano davvero una mazza tra loro, ovviamente ci sono alcune istruzioni che in elisp sono presenti e in common no, ma un buon 95% delle istruzioni sono compatibili, per quanto riguarda invece tikz mi ricordo sia un progetto che stavo sfruttando che era Quiver che sfruttava una sotto libreria chiamata tikz-cd e ma effettivamente il tutto è già abbastanza comodo di suo, con octave e matlab lavoro di più perché con matematica applicata sono più comodi.

 
Ultima modifica:
fatto sta che entrambi sono basati sul ANSI X3.226-1994 Information Technology Programming Language Common Lisp
No, quello è lo standard di common lisp e basta. Il linguaggio di programmazione elisp non rispetta quello standard e non è vero che il 95% del codice di common lisp è compatibile con elisp. Non conosco elisp, ma conosco common lisp quindi credimi... so di cosa sto parlando.

Il linguaggio di programmazione lisp e il linguaggio di programmazione algol sono morti. Al giorno d'oggi lisp ed algol sono intesi come due macro-famiglie di linguaggi di programmazione. Nella famiglia del lisp abbiamo: common lisp, elisp, clojure, racket, la sottofamiglia di scheme e molta altra roba. Nella famiglia dell'algol abbiamo: la sottofamiglia del basic, la sottofamiglia del c, pascal, java (che fa un po' categoria a parte) e molta altra roba. Lo standard di common lisp è un po' paragonabile allo standard del C: lo standard del C lo trovi implementato in gcc e clang e altro, mentre lo standard del common lisp lo trovi implementato in sbcl e clozure cl (da non confondersi con clojure, che è proprio un altro linguaggio) e altro.

In realtà la faccenda è un po' più complicata di come l'ho spiegata, anche perché non è proprio tutto bianco o tutto nero e non c'è una vera e propria tassonomia di linguaggi di programmazione. La famiglia dell'algol è un po' una famiglia allargata e nessuno chiamerebbe il c++ un dialetto dell'algol. Comunque vabbé, non volevo mandarti troppo off-topic. Quiver non lo conoscevo.
 
Ultima modifica:
No, quello è lo standard di common lisp e basta. Il linguaggio di programmazione elisp non rispetta quello standard e non è vero che il 95% del codice di common lisp è compatibile con elisp. Non conosco elisp, ma conosco common lisp quindi credimi... so di cosa sto parlando.

Il linguaggio di programmazione lisp e il linguaggio di programmazione algol sono morti. Al giorno d'oggi lisp ed algol sono intesi come due macro-famiglie di linguaggi di programmazione. Nella famiglia del lisp abbiamo: common lisp, elisp, clojure, racket, la sottofamiglia di scheme e molta altra roba. Nella famiglia dell'algol abbiamo: la sottofamiglia del basic, la sottofamiglia del c, pascal, java (che fa un po' categoria a parte) e molta altra roba. Lo standard di common lisp è un po' paragonabile allo standard del C: lo standard del C lo trovi implementato in gcc e clang e altro, mentre lo standard del common lisp lo trovi implementato in sbcl e clozure cl (da non confondersi con clojure, che è proprio un altro linguaggio) e altro.

In realtà la faccenda è un po' più complicata di come l'ho spiegata, anche perché non è proprio tutto bianco o tutto nero e non c'è una vera e propria tassonomia di linguaggi di programmazione. La famiglia dell'algol è un po' una famiglia allargata e nessuno chiamerebbe il c++ un dialetto dell'algol. Comunque vabbé, non volevo mandarti troppo off-topic. Quiver non lo conoscevo.
ok, in elisp comunque molte delle istruzioni per il common vanno, ci ho provato su Emacs e vanno, il fatto è che comunque la storia del lisp è molto complicata perché ognuno l'ha reinterpretato all'infinito e se invece perlamo di algol li è ormai un mezzo casino ed è rimasta un po' così, sicuramente è morto e anche il lisp 2.0, il primo e il 1.2 qualcuno ancora ne parla, i dialetti del lisp più utilizzati sono scheme, Elisp grazie ad emacs, qualcuno common e poco altro, il python grosso modo ha decretato uno spostamento di interesse da uno all'altro linguaggio per quanto riguarda la produzione di AI visto che comunque l'interesse sul metodo di creazione delle stesse è passato dall'elaborazione dei caratteri alla rete neurale che affrontano il macchine learning in modo diverso. Comunque se parliamo di macchine che hanno usato grosso modo il lisp per fare tutto erano le Symbolics con la loro versione di lisp e con l'ambiente il loro ambiente simil macs che tutto hanno reinterpretato a modo loro in quella fase tra l'80 e i 90', sicuramente quello dello standard sarà un errore mio di traduzione