(La) TeX - Cosa fa il personaggio '%'?
il %personaggio sembra avere molti usi. Finora l'ho riscontrato nei seguenti luoghi:
- Per scrivere commenti
% Schrodinger wave equation
$$\nabla^2\psi + \frac{8\pi^2m}{h^2}(E-V) = 0$$
- (Potrei essere errato qui) Per dividere i comandi su più righe (riferimento qui )
\newcounter{bull}
\newcommand{\showbullcntr}[1]{%
\setcounter{bull}{#1}%
\bullcntr{bull}%
}
- Insieme a
minipage, per rimuovere lo spazio iniziale inserito (adattato da questa domanda)
\noindent
\begin{minipage}{0.5\linewidth}
...
\end{minipage}%
\begin{minipage}{0.5\linewidth}
...
\end{minipage}
Qualcuno potrebbe spiegare in dettaglio i vari usi del %personaggio in LaTeX? In particolare, perché viene utilizzato dopo la prima istanza di \end{minipage}?
Risposte
I tre casi d'uso per il %carattere che hai elencato possono essere unificati in un unico caso d'uso generale: per escludere tutto ciò che si trova sul resto della riga di input corrente da ulteriori elaborazioni .
Tutto ciò comprende non solo i commenti (il primo caso d'uso che hai menzionato) ma anche il carattere di fine riga invisibile alla fine della riga di input. Infatti, dopo aver incontrato un %personaggio, TeX ignorerà anche qualsiasi spazio bianco che potrebbe essere presente all'inizio della riga successiva. In realtà, gli spazi all'inizio di una riga di input vengono sempre ignorati, indipendentemente dal fatto che la riga precedente fosse terminata o meno con %. Bene, la modalità verbatim è un'eccezione, ma questo è un argomento per una discussione diversa.
Quindi,
Hello %
World
e
Hello %
World
finiscono per essere elaborati allo stesso modo: TeX legge Hello dalla prima riga (con lo spazio dopo "Hello" incluso) e Worlddalla seconda riga e produrrà "Hello World". Si noti che il carattere di fine riga alla fine della prima riga e i quattro caratteri di spazio bianco all'inizio della seconda riga sono stati eliminati.
Cosa succederebbe se l'input fosse
Hello%
World
L'output sarà ora "HelloWorld". Perché? Bene, come prima, il carattere di fine riga alla fine della prima riga e i quattro caratteri di spazio bianco all'inizio della seconda riga vengono scartati e ciò che resta è "Hello" dalla prima riga e "World" dal secondo.
Un'altra informazione: un singolo carattere di fine riga viene convertito in spazi bianchi durante la prima fase di elaborazione di TeX. (Al contrario, due o più caratteri di fine riga consecutivi vengono convertiti in un \partoken).
Hello
World
e
Hello World
creare lo stesso output.
Dotati di queste informazioni, siamo in grado di capire qual è lo scopo del %personaggio nel seguente blocco di codice:
\noindent
\begin{minipage}{0.5\textwidth}
...
\end{minipage}%
\begin{minipage}{0.5\textwidth}
...
\end{minipage}
La larghezza totale di questo costrutto è 0.5\textwidth+0.5\textwidth=1\textwidth. Se il %carattere fosse stato omesso, il carattere di fine riga dopo la prima istanza di \end{minipage}sarebbe stato convertito in spazi bianchi e la larghezza totale sarebbe stata 1\textwidth più la larghezza del carattere spazio . Quasi certamente non è quello che si vuole. Osserva anche che era importante posizionare il %personaggio subito dopo \end{minipage}; la scrittura \end{minipage} %non servirebbe allo scopo previsto.
Quindi, considera le seguenti due definizioni di macro:
\newcommand\cmdA[1]{
#1}
\newcommand\cmdB[1]{%
#1}
Entrambe le definizioni sono legali. In particolare, non è strettamente necessario, da un punto di vista puramente sintattico, fornire un %carattere dopo \newcommand\cmdA[1]{per far compilare la macro. Ma questo non significa che le due macro producano lo stesso output. Riuscite a indovinare cosa \cmdA{abc}\cmdA{abc}e \cmdB{abc}\cmdB{abc}verrà prodotto? Per semplicità, si supponga che entrambe le sequenze di comandi siano presenti all'inizio di una riga di input.
Abbastanza sicuro, \cmdB{abc}\cmdB{abc}restituisce "abcabc", senza spazi bianchi tra le sottostringhe "abc".
Al contrario, \cmdA{abc}\cmdA{abc}restituisce "abc abc". Perché? Le due istanze di \cmdA{abc}ogni output abc; lo spazio prima abcè presente perché il singolo carattere di fine riga dopo \newcommand\cmdA[1]{viene convertito in uno spazio vuoto. Lo spazio bianco fornito dalla prima istanza di \cmdA{abc}viene ignorato da TeX poiché si trova, per ipotesi, all'inizio di una riga; tuttavia, lo spazio bianco fornito dalla seconda istanza di \cmdA{abc}non lo è. È così che finisci con abc abc.
Addendum , richiesto da un commento di @PhelypeOleinik: alcuni lettori potrebbero aver avuto l'impressione di aver assorbito la discussione precedente che, sebbene non riuscire a terminare alcune righe situate all'interno, ad esempio, di una definizione di macro, con %può essere un errore, sicuramente terminare ogni riga all'interno di quella macro definizione con %non può far male. Sfortunatamente, anche questo sarebbe un errore.
Considera il seguente esempio, certamente un po 'artificioso. Presenta 5 istanze di %, solo una delle quali conta:
\ifnum1=0%
1%
a%
\else%
b%
\fi
Ecco \ifnum<u>=<v>un condizionale che controlla se <u>e <v>sono numericamente uguali. (Se o <u>o <v>non è numerico, viene emesso un messaggio di errore. E, solo per correggere le idee: 1e 01sono numericamente uguali.)
Cosa vorresti indovinare (La) TeX uscita volontà: 1, 1a, a, o b? Se hai indovinato b, dopo tutto, 1 non è sicuramente uguale a 0! - avresti indovinato. La risposta corretta è a. Perché?
La presenza del %personaggio subito dopo \ifnum1=0divora il carattere invisibile di fine riga; quindi, TeX continua la scansione in avanti finché non incontra il primo carattere non numerico per impostare il test condizionale. Quindi, la condizione che viene effettivamente valutata da TeX è \ifnum1=01- ricorda: lo spazio bianco all'inizio di una riga viene ignorato - il che è vero . Ecco perché aviene impaginato.
Se, però, uno avesse scritto neanche
\ifnum1=0
1%
a%
\else%
b%
\fi
o, meglio ancora,
\ifnum1=0
1
a
\else
b
\fi
la risposta corretta sarebbe b, dato che TeX "vedrebbe" il carattere di fine riga dopo \ifnum1=0, lo convertirà in un carattere spazio, si renderà conto che dovrebbe iniziare a valutare se \ifnum1=0è vero e selezionerebbe il ramo appropriato della struttura "albero" condizionale .