Como faço o LaTeX hifenizar uma palavra que contém um travessão?


107

Em um documento LaTeX que estou escrevendo, recebo um aviso de caixa cheia demais por causa da palavra "multidisciplinar", que é processada no final de uma linha.

Posso me livrar desse aviso em particular mudando-o para multi-discipli\-nary, mas o mesmo problema acontecerá em outro lugar, já que essa palavra é muito usada no papel.

Eu gostaria de usar o \hyphenation{}comando em vez disso, mas obviamente minha tentativa \hyphenation{multi-disci-pli-na-ry}não funciona, porque ela não entende o primeiro travessão corretamente.

Qual encantamento eu preciso para obter o recuo correto em uma palavra que já contém um travessão?

Pergunta bônus: onde eu poderia encontrar a resposta para essa pergunta sozinho?


Por que é um problema que a palavra seja quebrada no hard hypen? Não é "multi- \ newline dimensional" ok?
Geoff Reedy

1
Resposta bônus: uma pesquisa no Google de "hifenização de látex" produziu todos os tipos de resultados úteis, incluindo o livro wiki de látex que tem a resposta: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica

3
@mica: não, não. Eu li todas essas páginas anos atrás. @geoff: estaria tudo bem, de fato, se o látex tivesse hífen aqui. mas neste exemplo isso causaria uma "caixa cheia" e o latex opta por não hifenizar.
Gyom

você pode barra invertida primeiro - no comando \ hyphenation?
Brian Postow

1
Obrigado pelo seu comentário @DrewSteen. Obviamente eu concordo. Mas em minha defesa não existia tal coisa como tex.SX quando fiz estas perguntas :-)
Gyom

Respostas:


52

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

TeX não hifeniza uma palavra que já foi hifenizada. Por exemplo, o (caricatura) sobrenome em inglês Smyth-Postlethwaite não apresentava hifenização, o que poderia ser problemático. Este é o estilo de composição em inglês correto (pode não ser correto para outros idiomas), mas se necessário, você pode substituir o hífen no nome por um \hyph comando, definido

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

Este não é o tipo de coisa que este FAQ normalmente recomendaria ... O hyphenatpacote define um conjunto de tais comandos (para introduzir pontos de hifenização em vários caracteres de pontuação).


Ou você poderia \newcommandum comando que se expande para multi-discipli\-nary(use Pesquisar + Substituir Tudo para substituir palavras existentes).


Muito obrigado. Como suspeitei, não existe uma resposta "perfeita". Como não sou o único autor desse documento, não quero forçar os outros a usar um em \newcommandtodos os lugares (é por isso que estava procurando algo baseado em \hyphenation). Eu acho que vou mantê-lo '' como está '' por padrão, e adicionar hifens explícitos manualmente quando o Latex reclamar de caixas excessivas.
Gyom

63

O problema (como KennyTM observou) é que o LaTeX não hifeniza palavras com travessões. Felizmente, existe um pacote padrão (parte do ncctools) que trata exatamente desse problema, chamado extdash. Isso define novos comandos de hífen e travessão que não interrompem a hifenização e que podem permitir ou evitar quebras de linha no hífen / travessão. Prefiro usá-lo com a shortcutsopção, então posso usar, por exemplo, em \-/vez de \Hyphdash. Aqui está o que você deseja:

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

Para evitar quebras nesse hífen, use multi\=/disciplinary

(À parte: o Chicago Manual of Style aconselha descartar os hifens anexando afixos como 'multi', a menos que a palavra seja ambígua ou ininteligível sem ela.)


Isso é ótimo, mas produz um aviso de hiperref quando eu o uso em uma string de capítulo: Package hyperref Warning: Token not allowed in a PDF string . Lá, a outra solução proposta ( \def\hyph{-\penalty0\hskip0pt\relax}) funciona.
Dr. Jan-Philip Gehrcke

1
@ Jan-PhilipGehrcke: esses avisos também podem ser corrigidos usando \texorpdfstring (que fornece compilação condicional para strings que vão para títulos de capítulos). Eu escondo usos dentro de macros semânticas (aqui, provavelmente \multidisciplinary). Sim, não é perfeito.
Blaisorblade

22

Eu uso pacote hyphenate escrevo palavras compostas como palavra finlandesa Internet-yhteys (Eng. Conexão com a Internet ) como Internet\hyp yhteys. Parece bobo, mas parece ser a maneira mais elegante que encontrei.


6

multi-disciplinarynão será hifenizado, conforme explicado por kennytm. Masmulti-\-disciplinary tem as mesmas oportunidades de hifenização que multidisciplinarytem.

Admito que não sei por que isso funciona. É diferente do comportamento descrito aqui (ênfase minha):

O comando \-insere um hífen discricionário em uma palavra. Esse também se torna o único ponto em que a hifenização é permitida nesta palavra .


Substituir -por -\-não altera a saída, pelo menos com as configurações padrão em overleaf.com (provavelmente pdflatex, mas o verso na verdade não diz).
Camille Goudeseune

4

Eu tive o mesmo problema. Eu uso hifenat mais a seguinte 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

Observe que ele usa o pacote expl3 do latex3.

Torna o -um caractere ativo que avança para ver se é seguido por mais travessões. Em caso afirmativo, ele permanece um -, para garantir --e ---continuar funcionando. Se não, torna-se o\hyp comando do hífenat, permitindo quebras de palavras no resto da palavra. Esta é uma solução genérica que faz com que todas as palavras que contenham hifens explícitos sejam hifenizadas normalmente.

Note que -se torna uma macro que não é totalmente expansível, então tente incluí-la após carregar outros pacotes que podem não -ser uma macro

Edit: Esta é minha segunda versão, a primeira versão era menos robusta quando um {ou }seguido de um hífen. Este não é, mas ao contrário da primeira versão, o -nesta versão não é totalmente expansível.


3
multi\hskip0pt-\hskip0pt disciplinary

Você pode, por exemplo, definir como

\def\:{\hskip0pt}

e então escrever

multi\:-\:disciplinary

Observe que o pacote do idioma russo babel tem seu próprio conjunto de travessões que não proíbem a hifenização, "~(aspas duplas + til) por exemplo.


1
Deve ser multi-\hskip0pt disciplinary. Como em você MWE, ele vai hifenizar muito. Basta configurar \setlength{\textwidth}{0.1cm}para tentar isso.
LaRiFaRi

-3

Eu respondi algo semelhante aqui: LaTeX quebrando muitas palavras

Eu disse:

você deve definir uma penalidade de hifenização em algum lugar do seu preâmbulo:

\hyphenpenalty=750

O valor de 750 atendeu às minhas necessidades para um layout de duas colunas em papel carta (8,5 x 11 pol.) Com uma fonte de 12 pt. Ajuste o valor para atender às suas necessidades. Quanto maior o número, menos hifenização ocorrerá. Você também pode querer dar uma olhada no pacote de hifenização, ele fornece um pouco mais do que apenas penalidade de hifenização


1
Ele está perguntando como evitar a hifenização, não sobre como definir limites.
Andras Gyomrey

-4

Para evitar a hifenização em uma palavra já hifenizada, usei espaço ininterrupto ~em combinação com espaço reverso \!. Por exemplo, comando

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

usado no texto, suprime a hifenização na palavra 3-D. Provavelmente não é a melhor solução, mas funcionou para mim!


4
Isso está respondendo à pergunta oposta ao que foi perguntado. Além disso, como a pessoa que tentou editar a sua mensagem para o ponto que fora dito, há uma maneira muito melhor de fazer o que fez: \mbox{3-D}.
zwol
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.