¿Cómo consigo que LaTeX separe una palabra que contiene un guión?


107

En un documento de LaTeX que estoy escribiendo, recibo una advertencia de hbox demasiado completa debido a la palabra "multidisciplinario", que se muestra al final de una línea.

Puedo deshacerme de esta advertencia en particular cambiándola a multi-discipli\-nary, pero el mismo problema ocurrirá en otros lugares, ya que esta palabra se usa mucho en el documento.

Me gustaría usar el \hyphenation{}comando en su lugar, pero obviamente mi prueba tentativa \hyphenation{multi-disci-pli-na-ry}no funciona, porque no comprende el primer guión correctamente.

¿Qué encantamiento necesito para obtener la sangría correcta en una palabra que ya contiene un guión?

Pregunta adicional: ¿Dónde podría haber encontrado la respuesta a esa pregunta yo mismo?


¿Por qué es un problema que la palabra se rompa en el bombo duro? ¿No está bien "multi- \ newline dimensional"?
Geoff Reedy

1
Respuesta adicional: una búsqueda en Google de "guiones de látex" arrojó todo tipo de resultados útiles, incluido el libro wiki de látex que tiene la respuesta: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica

3
@mica: no, no lo hace. Leí todas esas páginas hace años. @geoff: estaría bien, de hecho, si el látex hiciera un guión allí. pero en este ejemplo causaría una "hbox insuficiente", y latex opta por no separar en absoluto.
Gyom

¿Puede la primera barra invertida en el comando \ guiones?
Brian Postow

1
Gracias por tu comentario @DrewSteen. Evidentemente estoy de acuerdo. Pero en mi defensa no existía tex.SX cuando hice estas preguntas :-)
Gyom

Respuestas:


52

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

TeX no dividirá una palabra que ya haya sido dividida. Por ejemplo, el apellido en inglés (caricatura) Smyth-Postlethwaite no usaría guiones, lo que podría resultar problemático. Este es el estilo de tipografía en inglés correcto (puede que no sea correcto para otros idiomas), pero si es necesario, puede reemplazar el guión en el nombre con un \hyph comando, definido

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

Este no es el tipo de cosas que estas preguntas frecuentes recomendarían normalmente ... El hyphenatpaquete define un paquete de dichos comandos (para introducir guiones en varios caracteres de puntuación).


O puede usar \newcommandun comando que se expanda a multi-discipli\-nary(use Buscar + Reemplazar todo para reemplazar palabras existentes).


Muchas gracias. Como sospechaba, no hay una respuesta "perfecta". Debido a que no soy el único autor en ese documento, realmente no quiero obligar a los demás a usar un en \newcommandtodas partes (por eso estaba buscando algo basado en \hyphenation). Supongo que lo mantendré '' como está '' de forma predeterminada y agregaré guiones explícitos manualmente cuando Latex se queje de hboxes demasiado llenos.
Gyom

63

El problema (como señaló KennyTM) es que LaTeX no separa las palabras con guiones. Afortunadamente, hay un paquete estándar (parte de ncctools) que aborda ese mismo problema, llamado extdash. Esto define nuevos comandos de guiones y guiones que no interrumpen la separación de sílabas y que pueden permitir o evitar saltos de línea en el guión / guión. Prefiero usarlo con la shortcutsopción, por lo que puedo usar, por ejemplo, en \-/lugar de \Hyphdash. Esto es lo que quieres:

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

Para evitar romperse en ese guion, use multi\=/disciplinary

(Aparte: el Manual de estilo de Chicago aconseja eliminar los guiones que adjuntan afijos como 'multi', a menos que la palabra sea ambigua o ininteligible sin él).


Esto es muy bueno, pero es produce una advertencia hyperref cuando lo uso en una cadena capítulo Package hyperref Warning: Token not allowed in a PDF string. Allí, funciona la otra solución propuesta ( \def\hyph{-\penalty0\hskip0pt\relax}).
Dr. Jan-Philip Gehrcke

1
@ Jan-PhilipGehrcke: esas advertencias también se pueden corregir usando \texorpdfstring(que proporciona una compilación condicional para las cadenas que van en los títulos de los capítulos). Oculto usos dentro de macros semánticas (aquí, probablemente \multidisciplinary). Sí, no es perfecto.
Blaisorblade

22

Utilizo paquete hyphenaty luego escribo palabras compuestas como la palabra finlandesa Internet-yhteys (en inglés, conexión a Internet ) como Internet\hyp yhteys. Parece ridículo, pero parece ser la forma más elegante que he encontrado.


6

multi-disciplinaryno se dividirá con guiones, como explica kennytm. Pero multi-\-disciplinarytiene las mismas oportunidades de separación que multidisciplinarytiene.

Admito que no sé por qué funciona esto. Es diferente del comportamiento descrito aquí (énfasis mío):

El comando \-inserta un guión discrecional en una palabra. Este también se convierte en el único punto donde se permite la separación de sílabas en esta palabra .


Reemplazar -con -\-no cambia la salida, al menos con la configuración predeterminada en overleaf.com (probablemente pdflatex, pero al dorso en realidad no lo dice).
Camille Goudeseune

4

Yo tuve el mismo problema. Yo uso hyphenat más la siguiente 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

Tenga en cuenta que esto usa el paquete expl3 de latex3.

Hace que sea -un personaje activo que escanea hacia adelante para ver si va seguido de más guiones. Si es así, sigue siendo un -, para asegurarse --y ---seguir funcionando. De lo contrario, se convierte en el \hypcomando de hyphenat, lo que permite los saltos de palabras en el resto de la palabra. Esta es una solución genérica que hace que todas las palabras que contienen guiones explícitos se dividan normalmente.

Tenga en cuenta que se -convierte en una macro que no se puede expandir por completo, así que intente incluirla después de cargar otros paquetes que no esperen -ser una macro.

Editar: Esta es mi segunda versión, la primera versión era menos robusta cuando un guion seguía {o }. Este no lo es, pero a diferencia de la primera versión, el -de esta versión no es completamente expandible.


3
multi\hskip0pt-\hskip0pt disciplinary

Por ejemplo, puede definir como

\def\:{\hskip0pt}

y luego escribe

multi\:-\:disciplinary

Tenga en cuenta que el paquete de idioma ruso de babel tiene su propio conjunto de guiones que no prohíben la separación de sílabas "~(comillas dobles + tilde), por ejemplo.


1
Debería ser multi-\hskip0pt disciplinary. Como en tu MWE, se exagerará demasiado. Solo configúrelo \setlength{\textwidth}{0.1cm}para probar eso.
LaRiFaRi

-3

Respondí algo similar aquí: LaTeX divide demasiadas palabras

Dije:

debe establecer una penalización por separación de sílabas en algún lugar de su preámbulo:

\hyphenpenalty=750

El valor de 750 se adapta a mis necesidades de un diseño de dos columnas en papel de carta (8,5 x 11 pulgadas) con una fuente de 12 pt. Ajuste el valor según sus necesidades. Cuanto mayor sea el número, se producirán menos guiones. Es posible que también desee echar un vistazo al paquete de guiones, ya que proporciona algo más que una simple penalización por guiones.


1
Pregunta cómo evitar los guiones, no cómo definir límites.
Andras Gyomrey

-4

Para evitar la separación de sílabas en una palabra ya dividida, utilicé un espacio que no se separa ~en combinación con un espacio al revés \!. Por ejemplo, comando

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

utilizado en el texto, suprima la separación con guiones en la palabra 3-D. Probablemente no sea la mejor solución, ¡pero funcionó para mí!


4
Esto responde a la pregunta opuesta a lo que se preguntó. Además, como la persona que intentó editar el post a punto que fuera dicho, hay una mejor manera mucho que ver lo que hizo: \mbox{3-D}.
zwol
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.