Как мне заставить LaTeX переносить слово, которое содержит тире?
В документе LaTeX, который я пишу, я получаю предупреждение о переполнении hbox из-за слова "междисциплинарный", которое отображается в конце строки.
Я могу избавиться от этого предупреждения, изменив его на multi-discipli\-nary
, но та же проблема будет происходить в другом месте, так как это слово часто используется в статье.
Я хотел бы использовать \hyphenation{}
команда вместо этого, но, очевидно, мой предварительный \hyphenation{multi-disci-pli-na-ry}
не работает, потому что он не правильно понимает первую черту.
Какое заклинание мне нужно, чтобы получить правильное отступление в слове, которое уже содержит тире?
Бонусный вопрос: где я мог найти ответ на этот вопрос сам?
10 ответов
С http://www.tex.ac.uk/cgi-bin/texfaq2html?label=nohyph:
TeX не будет переносить слова, которые уже были написаны. Например, английская фамилия Смит-Постлетвейт (карикатура) не будет переноситься через дефис, что может быть проблематично. Это правильный стиль набора текста на английском языке (он может быть неправильным для других языков), но если это необходимо, вы можете заменить дефис в имени на
\hyph
команда, определенная
\def\hyph{-\penalty0\hskip0pt\relax}
Это не та вещь, которую этот FAQ обычно рекомендует... Пакет дефиса определяет пакет таких команд (для введения точек переноса в различных знаках препинания).
Или ты мог \newcommand
команда, которая расширяется до multi-discipli\-nary
(используйте Search + Replace All, чтобы заменить существующие слова).
Проблема (как отметил Кенни ТМ) в том, что LaTeX не будет переносить слова с черточками в них. К счастью, есть стандартный пакет (часть ncctools), который решает эту проблему и называется extdash
, Это определяет новые команды дефиса и дефиса, которые не нарушают дефисы и которые могут разрешать или предотвращать разрывы строк в дефисе / тире. Я предпочитаю использовать его с shortcuts
вариант, поэтому я могу использовать, например, \-/
скорее, чем \Hyphdash
, Вот что вы хотите:
\usepackage[shortcuts]{extdash}
...multi\-/disciplinary
Чтобы не сломать этот дефис, используйте multi\=/disciplinary
(Кроме того, Чикагское руководство по стилю рекомендует отбрасывать дефисы с присоединенными аффиксами, например, "multi", если это слово не является двусмысленным или непонятным без него.)
Я использую пакет hyphenat
а затем написать сложные слова, такие как финское слово Internet-yhteys (англ. Internet connection) как Internet\hyp yhteys
, Выглядит глупо, но, кажется, самый элегантный способ, который я нашел.
multi-disciplinary
не будет переноситься через дефис, как объяснил kennytm. Но multi-\-disciplinary
имеет те же возможности переноса слов, которые multidisciplinary
есть.
Я признаю, что я не знаю, почему это работает. Это отличается от поведения, описанного здесь (выделение мое):
Команда
\-
вставляет произвольный дефис в слово. Это также становится единственной точкой, где допускается перенос слов в этом слове.
multi\hskip0pt-\hskip0pt disciplinary
Вы можете, например, определить, как
\def\:{\hskip0pt}
а потом написать
multi\:-\:disciplinary
Обратите внимание, что пакет babel на русском языке имеет собственный набор штрихов, которые не запрещают переносы, "~
(двойная кавычка + тильда), например.
У меня такая же проблема. Я использую дефис плюс следующий макрос:
\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
команда от дефиса, позволяющая разрывать слова в остальной части слова. Это общее решение, которое делает все слова, которые содержат явные дефисы, как обычно.
Обратите внимание, что -
становится макросом, который нельзя развернуть полностью, поэтому попробуйте включить его после загрузки других пакетов, которые могут не ожидаться -
быть макросом
Изменить: это моя вторая версия, первая версия была менее надежной, когда {
или же }
последовал за дефисом. Это не так, но в отличие от первой версии -
в этой версии не полностью расширяемый.
Пакет babel для кириллицы определяет команду, которую следует использовать вместо тире: так что вы можете написатьпо"=своєму
и он будет правильно переносить это слово.
Однако для английского языка эта команда не определена. Вы можете определить это следующим образом
\useshorthands{"}
\defineshorthand{"=}{\penalty1000\discretionary{-}{}{-}\penalty10000\hskip0pt}
Затемpseudo"=metric
будет правильно расставлен дефис.
Собственно, это ответ отсюда: https://tex.stackexchange.com/questions/99334/hyphenation-of-words-connected-with-a-double-triple-dash , где предлагается использовать комбинацию"|
.
Преимущество использования"=
заключается в том, что теперь он работает в многоязычных документах, когда у вас есть и кириллица, и английский язык, и совместим с документами, имеющими только кириллицу.
Так как Latex считает, что мультидисциплинарность — это одно слово с предпочтительным переносом, вы можете указать, что это два отдельных слова, например: мульти-\hspace{0pt}дисциплинарный достаточно, чтобы решить эту проблему.
Я ответил на что-то похожее здесь: LaTeX разбивает слишком много слов
Я сказал:
Вы должны установить штраф за перенос слов где-то в преамбуле:
\hyphenpenalty=750
Значение 750 соответствовало моим потребностям для макета в два столбца на бумаге для писем (8,5x11 дюймов) со шрифтом 12 пт. Отрегулируйте значение в соответствии с вашими потребностями. Чем выше число, тем меньше переносов. Вы также можете захотеть взглянуть на пакет дефиса, он предлагает немного больше, чем просто штраф за переносы
Чтобы избежать переносов в уже написанном слове, я использовал неразрывный пробел ~
в сочетании с обратным пространством \!
, Например, команда
3~\!\!\!\!-~\!\!\!D
используется в тексте, подавить переносы в слове 3-D. Возможно, не лучшее решение, но оно сработало для меня!