[tex]\LaTeX[/tex], però più in profondità

marco2132k
Ciao. Vorrei capire qualcosa in più riguardo a \( \LaTeX \), e magari provare a scrivere un primo documento in plain-\( \TeX \).

Finora ho usato le guide di Pantieri - che sono un ottimo cookbook, ma più in là non vanno.

Cosa mi consigliate?

Risposte
solaàl
Il problema è che chi usa TeX raramente ha nozione di quali sono le best practices quando si programma:

Sto facendo delle correzioni a un paper per mandarlo a una rivista; apro il file .cls che la rivista stessa mette a disposizione. E' stato scritto nel 2009 (ci sono riviste il cui .cls non è mai cambiato dal 1994), e ok. Sono 1800 LOC, e ok.
Ma se uno va a vedere perché sono 1800 LOC, scopre che almeno 300 sono dei fottuti [inline]\hyphenation[/inline].
Qualcosa di molto sbagliato.

claudio862
"vict85":
Certo, ma se tu dovessi creare un linguaggio da 0 non considereresti bibliografia, glossario e collegamenti ipertestuali e cose simili come pacchetti aggiuntivi.

Mh... Non sarei così sicuro. In molti linguaggi solo le funzionalità principali vengono definite nel linguaggio stesso, e tutto il resto viene delegato a librerie. Tra l'altro, Latex ha già un supporto alla bibliografia incluso, ma non lo usa quasi nessuno.

Quello che serve a Latex per renderlo un linguaggio più moderno non sono librerie, ma un cambiamento alla sintassi e alla semantica di base. E soprattutto uno scope sensato. E ancora più soprattutto una toolchain che mostra gli errori in modo comprensibile. Questo renderebbe le librerie esistenti incompatibili, purtroppo.

vict85
"claudio86":
Quel tipo di librerie sono utili ai tipografi, ma non tanto agli autori. Le librerie utili agli autori sono quelle che ho indicato prima: biblatex, cleveref, glossaries, hyperref, ams... Non hanno quasi effetto sulla tipografia, ma sono secondo me indispensabili per scrivere decentemente, e le considero il vantaggio principale di Latex. Senza di esse non vedrei il motivo di cambiare linguaggio.


Certo, ma se tu dovessi creare un linguaggio da 0 non considereresti bibliografia, glossario e collegamenti ipertestuali e cose simili come pacchetti aggiuntivi. Potresti persino usare direttamente alcuni tool di latex. Di quelli solo Ams sarebbe davvero una "libreria" e tutto sommato sarebbe poco più di una libreria di dichiarazioni di environment (teorema, dimostrazioni...) e un insieme di stili predefiniti.

solaàl
In che senso, il 1995 non era dieci anni fa?

claudio862
"vict85":
LaTeX lo conoscono in tanti, hanno speso molto tempo a capirne tutti i particolari oppure a creare modelli specifici ed è usato da molti giornali scientifici.

Nella mia esperienza è anche peggio di così. Si impara Latex in modo superficiale quando si inizia a scrivere i primi articoli o la tesi, e poi non si approfondisce e non ci si aggiorna mai e poi mai. Anche molte riviste usano distribuzioni obsolete, magari che non supportano nemmeno biblatex (risalenti almeno al decennio scorso).


"vict85":
alcune delle librerie disponibili non sono reali problemi per un nuovo linguaggio dato che cercano di risolvere problemi legati al fatto che TeX è stato scritto prima che la tipografia digitale moderna cominciasse a costruire i propri standard. Creare un nuovo linguaggio/programma che non supporti Unicode, unicode math e font opentype (compreso di variant e opentype-svg colors) non ha molto senso.

Quel tipo di librerie sono utili ai tipografi, ma non tanto agli autori. Le librerie utili agli autori sono quelle che ho indicato prima: biblatex, cleveref, glossaries, hyperref, ams... Non hanno quasi effetto sulla tipografia, ma sono secondo me indispensabili per scrivere decentemente, e le considero il vantaggio principale di Latex. Senza di esse non vedrei il motivo di cambiare linguaggio.


@solaàl

Il logo della Seele mi sembra proprio un cattivo esempio. TikZ è un sottoinsieme abbastanza ristretto di Latex, lo si potrebbe considerare un DSL a parte. Poi, ha indubbiamente capacità e librerie impressionanti, ma non è difficile immaginare un'implementazione in un linguaggio più piacevole. Cicli, funzioni, strutture di controllo, e variabili sono veramente fragili, ed è frustrante scrivere codice corretto, soprattutto data la chiarezza dei messaggi di errore in Latex. Metapost potrebbe essere un'alternativa migliore (però lo conosco poco quindi non mi sbilancio).

(In quel codice usi ancora [inline]{\"U}[/inline] per l'umlaut, manco fossimo negli anni '90 come l'anime :P)

vict85
A dire il vero esistono già "esperimenti" in tal senso, ma nessuno ha neanche lontanamente il successo di LaTeX o il suo numero di strumenti. Un problema non indifferente consiste nel farsi adottare dalle persone. LaTeX lo conoscono in tanti, hanno speso molto tempo a capirne tutti i particolari oppure a creare modelli specifici ed è usato da molti giornali scientifici. È difficile che molte persone decidano di abbandonare LaTeX senza un vero vantaggio per l'utente finale.
Insomma, basta pensare alle difficoltà di LuaLaTeX, XeLaTeX e ConTeXt.

Detto questo, alcune delle librerie disponibili non sono reali problemi per un nuovo linguaggio dato che cercano di risolvere problemi legati al fatto che TeX è stato scritto prima che la tipografia digitale moderna cominciasse a costruire i propri standard. Creare un nuovo linguaggio/programma che non supporti Unicode, unicode math e font opentype (compreso di variant e opentype-svg colors) non ha molto senso. Similmente, il nuovo linguaggio dovrebbe essere poter creare sia pdf che epub, mobi, markdown e html.

solaàl
E' tutto vero; poi però ti rendi conto che puoi fare questo...


claudio862
"solaàl":
Ci sarebbe solo una cosa seria da fare: prendere l'algoritmo su cui TeX si basa per costruire la pagina, e implementarlo in un linguaggio vero.
Del resto, chi ne ha voglia?


Non è l'unico problema.
Dovresti anche riscrivere tutte le librerie disponibili adesso.
Un Latex senza biblatex, tikz, pgfplots, cleveref, siunitx, microtype, koma-script, fontspec, ams, babel, hyperref, glossaries... Perché dovrei usare qualcosa di così limitato?

Però sì, sarebbe molto più piacevole da usare.

Un'altra cosa che davvero non sopporto di Latex è che mischia irrimediabilmente semantica e presentazione.
Esistono macro che si occupano semplicemente di sostituire del testo (\cref{}, \citep{}, \ie, \num{}, \ac{}, \gls{}, \DTMdisplaydate{}, \enquote{}...) e altre che "assegnano" un significato generico al testo (\section{}, \emph{}, \tabular{}, \figure{}, \begin{itemize}\item, \texttt{}, \small...}.
Tutte queste macro generano testo semplice, e sarebbe fantastico ottenere del testo semplice da un sorgente Latex, così si potrebbe integrarlo con altri sistemi (siti web, ebook, report generici...).

Invece no, tutte queste macro sono mischiate con tutte quelle altre che modificano la tipografia finale (\phantom, \vspace...), così da un sorgente Latex si possono solo generare un PDF o un DIV, che sono formati perfetti per la stampa e poco altro.
Non sono "machine readable", non si può nemmeno copiare e incollare il testo senza perdere informazioni sui paragrafi, o peggio ancora sulle tabelle; è talmente impossibile che esistono software apposta per estrarre tabelle dai PDF.
Esiste tex4ht, ma il risultato è ben lontano da "testo semplice".

L'ideale sarebbe un linguaggio ad alto livello, solo per la sostituzione del testo, compatibile con tutte le librerie esistenti, e un altro a basso livello, per la tipografia, compatibile con tutte le librerie esistenti.
Purtroppo non accadrà mai.

solaàl
Questo apre l'enorme capitolo XeTeX; sorvoliamo sul supporto nullo che hanno le fonti con glifi matematici.

E sì: TeX un linguaggio a espansione di macro che ci tiene a rendere quanto più non-intuitiva possibile la procedura per creare macro. Geniale!

Ci sarebbe solo una cosa seria da fare: prendere l'algoritmo su cui TeX si basa per costruire la pagina, e implementarlo in un linguaggio vero.
Del resto, chi ne ha voglia?

kaspar1
[ot]
"solaàl":

[...] CTAN è praticamente una fogna a cielo aperto dove ognuno scacazza un package senza preoccuparsi granché di retrocompatibilità o di compatibilità tout-court.
Poi quando devi installare una distribuzione completa devi scaricarti 5GB di roba -_- (sei costretto a scaricarti, tra le tante cose, pacchetti inutili come tikz-ducks e tikz-bear, senza contare i vari pacchetti di lingue che non interessano.) C'è [tt]texonthefly.py[/tt] e installi la versione minimale... -_- Ti piacerebbe: ma polyglossia non trova le lingue richieste, né vengono installate [nota]Come farlo poi? Non l'ho ancora capito...[/nota], glifi non trovati, etc etc...[/ot]

TeX è bello per i risultati che produce, non per quanto siano eleganti e piacevoli linguaggio e come è strutturato. Anzi, come linguaggio ha avuto uno sviluppo piuttosto irregolare. C'è LaTeX3 che dovrebbe portare un po' d'ordine, ma... boh
[ot]Ti potresti anche chiedere perché per definire delle macro ci sono [tt]\def, \newcommand, \xdef, \edef, \NewDocumentCommand, \DefineRobustCommand, ...[/tt] etc etc... Cioè ci sono macro fragili (quelle che l'utente in genere è in grado di prodursi da solo) e macro robuste? Non esiste un unico modo di definire una funzione degna di questo nome? Troppo facile la vita. Tieni conto conto che sono tutte cose lievemente diverse. Cose, che ai poveri mortali sono precluse, insomma.[/ot]

solaàl
Ah, ho capito: come pensavo. Tu non vuoi imparare TeX, vuoi imparare la tipografia.

https://books.google.ee/books/about/Gli ... edir_esc=y
http://book.webtypography.net

Con il contenuto di questi testi ben chiaro in testa ti saranno chiare le specifiche con cui TeX è stato progettato.

claudio862
Puoi partire da qui: https://tex.stackexchange.com/questions?tab=Votes

Non è un testo sistematico, ma ci sono veramente tante informazioni, soprattutto sugli idiomi moderni (spesso rispondono alcuni degli sviluppatori Latex).

marco2132k
"solaàl":
"Scrivere la tua classe" significa che hai in mente un progetto preciso
Non necessariamente. Ti faccio un esempio. Ho alcuni appunti sotto amsart, perché è la classe che trovo più carina. Però non mi piacciono "i titoli delle sezioni"[nota]Vedi la risposta all'altro quote.[/nota], ai quali preferisco quelli di amsbook.

Considerato che titolo in grassetto, data, numbering automatico di sezioni e teoremi (ed eventualmente una bibliografia) è pressapoco tutto quello che mi serve, perché non posso provare a farmeli da solo? Mi basta una cosa il più spartana possibile... Il risultato sarebbe così scadente e spenderei più tempo a scrivere a pc che a mano? Mi sembra che molti libri e dispense siano scritti in plaintex, e la testa mi dà che la ragione sia proprio l'evitare il "bloatware".

Cos'è uno strumento di smanettamento?
È proprio quello che cerco di capire! Quali siano i comandi di \( \LaTeX \), prima, e di \( \TeX \), poi, e in che circostanze possano (o non debbano) essere usati. Perché, ad esempio, uso [inline]\DeclareMathOperator[/inline] dal pacchetto... boh, al posto di [inline]\mathop[/inline]? Posso ottenere un grassetto con [inline]\textbf[/inline], ma nell'ambiente [inline]titlepage[/inline] si usa [inline]\bfseries[/inline] - e [inline]\par[/inline] a che serve?

Ci sarà un posto dove leggere più sistematicamente di [inline]\makeatletter[/inline], [inline]\par[/inline], e... si capisce?

Poi, ho detto che non mi piacciono i titoli delle sezioni della classe che ho scelto. Sono sicuro che quello che non mi piace abbia un nome ("font"? "kerning"? un più meravigliosamente italiano e qualunquista "stile"?), ma mi manca la terminologia per esprimermi: come me la faccio?

[quote]Se gioco un po' con plain-\( \TeX \) mi faccio un'idea migliore di cosa significhi scrivere in tex/latex

No, ti fai solo male e non ti servirà a niente. [/quote] Pensavo fossero molto legati.


Una cosa che potresti prendere in considerazione è di imparare TiKZ, o se vuoi davvero programmare, LuaTeX
Prima devo conoscere almeno \( \LaTeX \)! Adesso, per dire, non ho idea nemmeno di come si salti una pagina dopo il titolo[nota][inline]\cleardoublepage[/inline] dopo [inline]\end{titlepage}[/inline] non funzia su amsart/proc; c'è una spiegazione del perché succede questo ma adesso non la trovo e comunque non capisco una mazza ahah[/nota], o sia legale lasciare pagine bianche, o...

solaàl
"marco2132k":
Mi interessa capire meglio come funziona \( \LaTeX \) dietro le quinte. Tipo: vorrei scrivere la mia classe, imparare a scrivere qualche macro

Non è mia intenzione fare gatekeeping, ma non mi sembra una motivazione precisa, quindi è difficile dirti cosa fare. "Scrivere la tua classe" significa che hai in mente un progetto preciso (per esempio: un libro sull'alchimia in età elisabettiana, o un package il cui scopo sia disegnare diagrammi di stringa) e ti servono cose che le classi standard non fanno. Quindi, per quale scopo ti serve una classe nuova? E perché vuoi imparare TeX e non ConTeXt se devi fare tipografia? Fatte le debite proporzioni hai chiesto "vorrei guardare la casa di carta in lingua originale; dove posso imparare il latino, e da esso dedurre lo spagnolo per confronto?"

soprattutto, vorrei capire che strumenti di "smanettamento" \( \LaTeX \) offra.
Cos'è uno strumento di smanettamento? Ossia: in quale modo e a quale scopo vuoi agire sulla geometria della pagina (questo fai, quando scrivi in TeX)?

Se gioco un po' con plain-\( \TeX \) mi faccio un'idea migliore di cosa significhi scrivere in tex/latex

No, ti fai solo male e non ti servirà a niente.

TeX è molto vecchio, e i paradigmi per scrivere codice sono enormemente cambiati dal momento in cui esso è stato reso pubblico; Knuth purtroppo è (a dir poco) cauto quando si tratta di fare una modifica all'architettura di base di quacosa che ha creato, e quindi TeX è lo stesso da circa quand è stato inventato. Ossia è modellato sulle performance di macchine degli anni 70, quando è stato scritto in Pascal. Ma non sia mai che nel 2020 si sia cambiato questo dettaglio (orrifico) della sua struttura interna. No! Semplicemente il codice Pascal ora transpila in C.
(Ci sono poi una serie di problemi dell'ecosistema che sono esogeni a TeX, ma non credo ti interessino; CTAN è praticamente una fogna a cielo aperto dove ognuno scacazza un package senza preoccuparsi granché di retrocompatibilità o di compatibilità tout-court.)

A riprova di quanto sia diverso il modo in cui si produce codice oggi da quello dei tempi in cui Knuth esisteva, prova a imparare METAFONT.

Poi non conosco \( \TeX \) e mi piacerebbe comunque provarlo, per sfizio, anche se è inutile per ciò che ho scritto su.
Una persona impara un DSL utile "per sfizio"; una persona che impara TeX per sfizio dovrebbe pagare un bravo analista. Non di quelli che girano qui dentro.

Una cosa che potresti prendere in considerazione è di imparare TiKZ, o se vuoi davvero programmare, LuaTeX. Puoi scrivere temi di beamer, e la classe che apparentemente ti serve potrà avere dei fighissimi abbellimenti estetici, per esempio nei titoli di sezione.

Accoppiarlo con Lua ti permette di accoppiare la programmazione imperativa con la tipografia, ad esempio gestendo un solo sorgente che compila uno stesso documento in diversi formati (a4, a3, a2, a1, a0 e letterpaper) una volta sola con preamboli ogni volta diversi; oppure leggere un csv e creare la tabella che esso rappresenta in uno standalone con determinati constraint grafici; oppure scrivere un package il cui scopo è disegnare grafi come Dio comanda; oppure...

gugo82
@ marco2132k: [ot]
"marco2132k":
À la visage du pènis.

Bello questo francesismo... :lol:[/ot]

marco2132k
Mi interessa capire meglio come funziona \( \LaTeX \) dietro le quinte. Tipo: vorrei scrivere la mia classe, imparare a scrivere qualche macro, eccetera eccetera; soprattutto, vorrei capire che strumenti di "smanettamento" \( \LaTeX \) offra.

Se gioco un po' con plain-\( \TeX \) mi faccio un'idea migliore di cosa significhi scrivere in tex/latex, credo (anche perché è pieno di pacchetti che fanno uso pesante di primitive \( \TeX \)).

Poi non conosco \( \TeX \) e mi piacerebbe comunque provarlo, per sfizio, anche se è inutile per ciò che ho scritto su.

"solaàl":
prendi il TeXbook di Knuth e leggilo
À la visage du pènis. (Dicono che sia "difficilissimo")

solaàl
Non è chiaro cosa significa quello che hai chiesto. Se vuoi imparare a "programmare in TeX", prendi il TeXbook di Knuth e leggilo. Ma perché in plainTeX? Ti serve per un progetto specifico? Quale? Fare tipografia professionale? In tal caso è meglio XeTeX, o ConTeXt.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.