Как мне заставить LaTeX переносить слово, которое содержит тире? - PullRequest
99 голосов
/ 03 февраля 2010

В документе LaTeX, который я пишу, я получаю предупреждение overfull hbox из-за слова "междисциплинарный", которое отображается в конце строки.

Я могу избавиться от этого конкретного предупреждения, изменив его на multi-discipli\-nary, но такая же проблема произойдет в других местах, так как это слово часто используется в статье.

Я бы хотел вместо этого использовать команду \hyphenation{}, но, очевидно, мой предварительный \hyphenation{multi-disci-pli-na-ry} не работает, потому что он не правильно понимает первую черту.

Какое заклинание мне нужно для получения правильного отступа в слове, которое уже содержит тире?

Бонусный вопрос: Где я мог найти ответ на этот вопрос сам?

Ответы [ 8 ]

57 голосов
/ 28 декабря 2011

Проблема (как заметил KennyTM) в том, что LaTeX не будет переносить слова с дефисами в них. К счастью, есть стандартный пакет (часть ncctools), который решает эту проблему и называется extdash. Это определяет новые команды дефиса и дефиса, которые не нарушают переносы и которые могут разрешать или предотвращать разрывы строк в дефисе / тире. Я предпочитаю использовать его с параметром shortcuts, поэтому я могу использовать, например, \-/ вместо \Hyphdash. Вот что вы хотите:

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

Чтобы предотвратить разрыв на этом дефисе, используйте multi\=/disciplinary

(Помимо: Чикагское руководство по стилю рекомендует отбрасывать дефисы с присоединенными аффиксами, например, «multi», если только слово не является двусмысленным или непонятным без него.)

51 голосов
/ 03 февраля 2010

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

TeX не станет дефисом слова, которое уже было дефисом. За Например, (карикатура) английская фамилия Смит-Постлетвейт не будет дефис, который может быть неприятным. Это правильный английский стиль набора текста (он может быть неправильным для других языков), но необходимо, вы можете заменить дефис в имени на \hyph команда, определенная

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

Это , а не , что обычно рекомендуется в этом FAQ ... Пакет hyphenat определяет пакет таких команд (для введение точек переноса в различные знаки препинания)


Или вы можете \newcommand команду, которая расширяется до multi-discipli\-nary (используйте Search + Replace All, чтобы заменить существующие слова).

21 голосов
/ 15 декабря 2010

Я использую пакет hyphenat, а затем пишу сложные слова, такие как финское слово Интернет-yhteys (англ. Интернет-соединение ) как Internet\hyp yhteys. Выглядит глупо, но, кажется, самый элегантный способ, который я нашел.

4 голосов
/ 17 сентября 2015

multi-disciplinary не будет переноситься через дефис, как объяснено kennytm.Но multi-\-disciplinary имеет те же возможности переноса слов, что и multidisciplinary.

Я признаю, что не знаю, почему это работает.Это отличается от описанного поведения здесь (выделено мной):

Команда \- вставляет произвольный дефис в слово. Это также становится единственной точкой, где допускается перенос слов в этом слове .

3 голосов
/ 10 ноября 2011
multi\hskip0pt-\hskip0pt disciplinary

Вы можете, например, определить как

\def\:{\hskip0pt}

, а затем напишите

multi\:-\:disciplinary

Обратите внимание, что пакет babel на русском языке имеет собственный набор черточек, которые не запрещают переносы, например "~ (двойные кавычки + тильда).

3 голосов
/ 08 августа 2011

У меня была такая же проблема. Я использую дефис плюс следующий макрос:

\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

Обратите внимание, что здесь используется пакет expl3 из latex3.

Это делает - активным символом, который просматривает вперед, чтобы увидеть, сопровождается ли больше штрихами. Если это так, он остается равным -, чтобы убедиться, что -- и --- продолжают работать. Если нет, он становится командой \hyp от дефиса, позволяющей переносить слова в остальной части слова. Это общее решение, которое делает все слова, содержащие явные дефисы, как обычно.

Обратите внимание, что - становится макросом, который нельзя развернуть полностью, поэтому попробуйте включить его после загрузки других пакетов, которые могут не ожидать, что - будет макросом

Редактировать: Это моя вторая версия, первая версия была менее надежной, когда { или } следовали за дефисом. Это не так, но в отличие от первой версии - в этой версии не полностью расширяем.

0 голосов
/ 13 мая 2010

Чтобы избежать переносов в уже написанном слове, я использовал неразрывный пробел ~ в сочетании с обратным пробелом \!. Например, команда

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

используется в тексте, подавить переносы в слове 3-D. Возможно, не лучшее решение, но оно сработало для меня!

0 голосов
/ 03 февраля 2010

Я ответил что-то подобное здесь: LaTeX разбивает слишком много слов

Я сказал:

Вы должны установить штраф за перенос слов в преамбуле:

\hyphenpenalty=750

Значение 750 соответствовало моим потребностям в макете с двумя столбцами на бумаге формата Letter (8,5x11 дюймов) со шрифтом 12 пт. Отрегулируйте значение в соответствии с вашими потребностями. Чем выше число, тем меньше переносов. Возможно, вы также захотите взглянуть на пакет дефиса, он предлагает нечто большее, чем просто штраф за перенос слов

...