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

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

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

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

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

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

Ответ 1

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

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

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

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


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

Ответ 2

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

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

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

(Помимо этого: The Chicago Manual of Style советует отказаться от дефисов, связанных с аффиксами типа "мульти", если это слово не является двусмысленным или непонятным без него.)

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

\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 из hyphenat, что позволяет разрывы слов в остальной части слова. Это общее решение, которое делает все слова, которые содержат явные дефисы дефиса, обычно.

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

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

Ответ 6

multi\hskip0pt-\hskip0pt disciplinary

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

\def\:{\hskip0pt}

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

multi\:-\:disciplinary

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

Ответ 7

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

Я сказал:

вы должны установить предел переносов в своей преамбуле:

\hyphenpenalty=750

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

Ответ 8

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

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

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