Come faccio a fare in modo che LaTeX sillabassi una parola che contiene un trattino?


107

In un documento LaTeX che sto scrivendo, ricevo un avviso hbox troppo pieno a causa della parola "multidisciplinare", che sembra essere resa alla fine di una riga.

Posso sbarazzarmi di questo particolare avvertimento cambiandolo in multi-discipli\-nary, ma lo stesso problema accadrà altrove, poiché questa parola è usata molto nel giornale.

Vorrei \hyphenation{}invece usare il comando, ma ovviamente il mio tentativo \hyphenation{multi-disci-pli-na-ry}non funziona, perché non comprende correttamente il primo trattino.

Di quale incantesimo ho bisogno per ottenere il rientro corretto in una parola che contiene già un trattino?

Domanda bonus: dove avrei potuto trovare io stesso la risposta a questa domanda?


Perché è un problema che la parola venga spezzata all'ipen duro? Non va bene "multi- \ newline dimensionale"?
Geoff Reedy

1
Risposta bonus: una ricerca su Google di "sillabazione latex" ha prodotto tutti i tipi di risultati utili, incluso il libro wiki latex che ha la risposta: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica

3
@mica: no non lo fa. Ho letto tutte quelle pagine anni fa. @geoff: sarebbe ok, infatti, se il lattice facesse il trattino lì. ma in questo esempio provocherebbe un "hbox underfull" e latex sceglie di non sillabare affatto.
Gyom

puoi fare il backslash del primo - nel comando \ hyphenation?
Brian Postow

1
Grazie per il tuo commento @DrewSteen. Ovviamente sono d'accordo. Ma a mia difesa non c'era niente come tex.SX quando ho posto queste domande :-)
Gyom

Risposte:


52

Da https://texfaq.org/FAQ-nohyph :

TeX non sillaberà una parola che è già stata sillabata. Ad esempio, il cognome inglese (caricaturale) Smyth-Postlethwaite non sillaberebbe, il che potrebbe essere problematico. Questo è lo stile di composizione inglese corretto (potrebbe non essere corretto per altre lingue), ma se necessario, puoi sostituire il trattino nel nome con un \hyph comando, definito

 \def\hyph{-\penalty0\hskip0pt\relax}

Questo non è il genere di cose che queste FAQ raccomanderebbero normalmente ... Il hyphenatpacchetto definisce un insieme di tali comandi (per introdurre punti di sillabazione in vari caratteri di punteggiatura).


Oppure potresti usare \newcommandun comando che si espande in multi-discipli\-nary(usa Cerca + Sostituisci tutto per sostituire le parole esistenti).


Molte grazie. Come sospettavo, non esiste una risposta "perfetta". Poiché non sono l'unico autore di quel documento, non voglio davvero costringere gli altri a usare un \newcommandovunque (ecco perché stavo cercando qualcosa basato su \hyphenation). Immagino che lo terrò semplicemente "così com'è" per impostazione predefinita e aggiungerò manualmente trattini espliciti quando Latex si lamenta di hbox troppo pieni.
Gyom

63

Il problema (come ha notato KennyTM) è che LaTeX non sillaberà le parole con trattini. Fortunatamente, esiste un pacchetto standard (parte di ncctools) che risolve proprio questo problema, chiamato extdash. Definisce nuovi comandi di trattino e trattino che non interrompono la sillabazione e che possono consentire o impedire interruzioni di riga al trattino / trattino. Preferisco usarlo con l' shortcutsopzione, quindi posso usare, ad esempio, \-/piuttosto che \Hyphdash. Ecco cosa vuoi:

\usepackage[shortcuts]{extdash} ... multi\-/disciplinary

Per evitare di interrompere quel trattino, usa multi\=/disciplinary

(A parte: il Chicago Manual of Style consiglia di eliminare i trattini che associano affissi come "multi", a meno che la parola non sia ambigua o incomprensibile senza di essa.)


Questo è grande, ma è produce un avvertimento hyperref quando lo uso in una stringa capitolo: Package hyperref Warning: Token not allowed in a PDF string. Lì, l'altra soluzione proposta ( \def\hyph{-\penalty0\hskip0pt\relax}) funziona.
Dr. Jan-Philip Gehrcke

1
@ Jan-PhilipGehrcke: questi avvisi possono anche essere corretti utilizzando \texorpdfstring(che fornisce la compilazione condizionale per le stringhe che entrano nei titoli dei capitoli). Nascondo gli usi all'interno delle macro semantiche (qui, probabilmente \multidisciplinary). Sì, non è perfetto.
Blaisorblade

22

Uso package hyphenate poi scrivo parole composte come la parola finlandese Internet-yhteys (Eng. Internet connection ) as Internet\hyp yhteys. Sembra strano ma sembra essere il modo più elegante che abbia trovato.


6

multi-disciplinarynon sarà sillabato, come spiegato da kennytm. Ma multi-\-disciplinaryha le stesse opportunità di sillabazione che multidisciplinaryha.

Ammetto di non sapere perché funziona. È diverso dal comportamento qui descritto (enfasi mia):

Il comando \-inserisce un trattino discrezionale in una parola. Questo diventa anche l'unico punto in cui è consentita la sillabazione in questa parola .


La sostituzione -con -\-non cambia l'output, almeno con le impostazioni predefinite in overleaf.com (probabilmente pdflatex, ma in realtà non lo dice).
Camille Goudeseune

4

Ho avuto lo stesso problema. Uso il trattino più la seguente macro:

\RequirePackage{hyphenat}
\RequirePackage{expl3}


% The following defs make sure words that contain an explicit `-` (hyphen) are still hyphenated the normal way, and double- and triple hyphens keep working the way they should. Just don't use a `-` as the last token of your document. Also note that `-` is now a macro that is not fully expandable

\ExplSyntaxOn

% latex2e doesn't like commands starting with 'end', apparently expl3 doesn't have any problems with it
\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}

\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}


\catcode`\-=\active

\cs_new_protected:Npn -{
    \futurelet\hyphenfix_nexttok\hyphenfix_i:w
}

\cs_new:Npn \hyphenfix_i:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        %discard the next `-` token
        \hyphenfix_discardnext:NN{\futurelet\hyphenfix_nexttok\hyphenfix_ii:w}
    }{
        % from package hyphenat
        \hyp
    }
}

\cs_new:Npn \hyphenfix_ii:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        \hyphenfix_discardnext:NN{\hyphenfix_emdash:c}
    }{
        \hyphenfix_endash:c
    }
}


\ExplSyntaxOff

Nota che questo utilizza il pacchettoexp3 di latex3.

Rende -un personaggio attivo che scansiona in avanti per vedere se è seguito da più trattini. In tal caso, rimane a -, per essere sicuri --e ---continuare a funzionare. In caso contrario, diventa il file\hyp comando di trattino, abilitando le interruzioni di parola nel resto della parola. Questa è una soluzione generica che fa sillabare normalmente tutte le parole che contengono trattini espliciti.

Nota che -diventa una macro che non è completamente espandibile, quindi prova a includerla dopo aver caricato altri pacchetti che potrebbero non -essere una macro

Modifica: questa è la mia seconda versione, la prima versione era meno robusta quando una {o }seguiva un trattino. Questo non lo è, ma a differenza della prima versione, -in questa versione non è completamente espandibile.


3
multi\hskip0pt-\hskip0pt disciplinary

Puoi ad esempio definire like

\def\:{\hskip0pt}

e poi scrivi

multi\:-\:disciplinary

Nota che il pacchetto in lingua russa di babel ha una propria serie di trattini che non proibiscono la sillabazione, "~(virgolette doppie + tilde) per esempio.


1
Dovrebbe essere multi-\hskip0pt disciplinary. Come in te MWE, ipenerà troppo. Basta impostare \setlength{\textwidth}{0.1cm}per provarlo.
LaRiFaRi

-3

Ho risposto qualcosa di simile qui: LaTeX spezza troppe parole

Ho detto:

dovresti impostare una penalità di sillabazione da qualche parte nel tuo preambolo:

\hyphenpenalty=750

Il valore di 750 si adatta alle mie esigenze di un layout a due colonne su carta da lettere (8,5 x 11 pollici) con un carattere da 12 pt. Regola il valore in base alle tue esigenze. Maggiore è il numero, minore sarà la sillabazione. Potresti anche voler dare un'occhiata al pacchetto di trattini, fornisce qualcosa di più della semplice penalità di sillabazione


1
Chiede come evitare la sillabazione, non come definire i limiti.
Andras Gyomrey,

-4

Per evitare la sillabazione in una parola già sillabata, ho usato lo spazio unificatore ~in combinazione con lo spazio all'indietro \!. Ad esempio, comando

3~\!\!\!\!-~\!\!\!D

utilizzato nel testo, sopprime la sillabazione nella parola 3-D. Probabilmente non è la soluzione migliore, ma per me ha funzionato!


4
Questo sta rispondendo alla domanda opposta di quanto è stato chiesto. Inoltre, come la persona che ha cercato di modificare il tuo messaggio al punto che fuori, ha detto, c'è un modo molto migliore per fare quello che hai fatto: \mbox{3-D}.
zwol
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.