2010-05-12 19 views
9

So che uno dei punti di vanteria di LaTeX è che non ha questo comportamento Microsoft. Tuttavia, a volte è utile.Capitalizza automaticamente la prima lettera della prima parola in una nuova frase in LaTeX

LaTeX aggiunge già uno spazio in più dopo aver digitato un periodo (non retrocesso), quindi dovrebbe essere possibile renderlo automaticamente in maiuscolo anche la lettera seguente.

C'è un modo ovvio per scrivere una macro che lo faccia, o c'è un pacchetto LaTeX che lo fa già?

+1

si desidera digitare solo i file tex con lettere minuscole? perché? – aioobe

+1

perché spesso, sono troppo pigro per digitare i cappucci. – memius

+11

il luogo in cui la tua pigrizia si può sbizzarrire è nel tuo editor di testo, penso. –

risposta

1

ho deciso di risolverlo nel modo seguente:

Poiché compongo sempre il codice LaTeX tre volte prima di ottenere il risultato corretto (per ottenere paginazione e riferimenti corretti), ho deciso di creare la maiuscola delle frasi nel processo

Così, ora ho uno script di shell che chiama il mio script di maiuscole (scritto in CRM114) prima, poi pdflatex tre volte, e poi okular: in questo modo, tutte le cose sono felici ns come risultato di un singolo comando.

+0

Lo script CRM114 utilizza un regexp e il comando lin 'tr' per trasformare una lettera minuscola preceduta da un punto (che, a sua volta, non è preceduta da alcuna abbreviazione nota) e alcuni spazi bianchi in una lettera maiuscola. – memius

4

Il seguente codice risolve il problema.

\let\period. 
\catcode`\.\active 
\def\uppercasesingleletter#1{\uppercase{#1}} 
\def.{\period\afterassignment\periodx\let\next= } 
\def \periodx{\ifcat\space\next \next\expandafter\uppercasesingleletter \else\expandafter\next\fi} 

First. second.third. relax.relax. up 

\let\period. Salva periodo

\catcode\.\active make tutti i periodi di essere simbolo attiva (come macro).

\def\uppercasesingleletter#1{\uppercase{#1}} definisce la macro \uppercasesingleletter per rendere automaticamente in maiuscolo la seguente lettera.

\def.{\period\afterassignment\periodx\let\next= } scrive periodo salvato e controlla il simbolo successivo.

\def \periodx{\ifcat\space\next \next\expandafter\uppercasesingleletter \else\expandafter\next\fi} Se la lettera successiva è uno spazio, viene inserito \uppercasesingleletter.

+0

che ha prodotto il seguente errore: ! Sequenza di controllo indefinita. .-> \ periodo \ afterassignment \ periodx \ let \ next = l.18 \ parskip = 0. 5 \ baselineskip \ advance \ parskip di 0pt plus 2pt ? – memius

+0

potresti aggiungere un paio di commenti al tuo codice, per favore :) – memius

+1

Ti manca un '\ let \ periodo = .' prima del catcode, penso. Questo tipo di token di munging funzionerà solo se sei ben educato su come usi i periodi: '{\ em first.} Second' non funziona così bene. +1 geniale, però. –

2

anni fa si discuteva di questa idea su comp.text.tex e la conclusione generale era che non si poteva farlo in modo soddisfacente. Soddisfacente, nel mio libro, implica non rendere i personaggi attivi, ma non riesco a vedere come possa funzionare.

personalmente, vorrei fare spazio attivo, e lo hanno poi guardare \ spacefactor e \ MakeUppercase il carattere successivo se il fattore è 3000.

qualcosa come

\catcode\ \active % latex already has a saved space character -- \space 
\def {\ifhmode% \spacefactor is invalid 
% (or something) in vertical mode 
\ifnum\spacefactor<3000\else% note: with space active, 
% even cs-ended lines need %-termination 
\expandafter\gobbleandupper\fi}% 
\def\gobbleandupper#1{\def\tempa{#1}\def\tempb{ }% 
\ifx\tempa\tempb% can''t indent the code, either :-(
% here, we have another space 
\expandafter\gobbleandupper% try again 
\else\space% insert a "real" space to soak up the 
% space factor 
\expandafter\MakeUppercase\fi}% 

questo doesn' t davvero fare il lavoro - ci sono abbastanza sciolte per realizzare un maglione fairque. per esempio, dato che non possiamo fare affidamento su \ everypar in latex, come fai a scrivere la prima lettera di un paragrafo in maiuscolo?

no ... per quanto fa male (che è il motivo per cui evito operazioni chiave inutili) abbiamo bisogno di digitare il lattice "correttamente" :-(

Problemi correlati