Как заставить LaTeX переносить слово, содержащее тире?
в документе LaTeX, который я пишу, я получаю переполненный hbox предупреждение из-за слова "мультидисциплинарный", который оказывается в конце строки.
Я могу избавиться от этого предупреждения меняя его в multi-discipli-nary
, но та же проблема будет происходить в другом месте, так как это слово часто используется в статье.
Я хотел бы использовать hyphenation{}
команда вместо этого, но, очевидно, моя предварительная hyphenation{multi-disci-pli-na-ry}
не работает, потому что это не правильно понять первую черточку.
какое заклинание МНЕ нужно, чтобы получить правильный отступ в слове, которое уже содержит прочерк?
бонусный вопрос: где я мог найти ответ на этот вопрос сам?
8 ответов
от http://www.tex.ac.uk/cgi-bin/texfaq2html?label=nohyph:
TeX не будет переносить слово, которое уже было переносом. Например, (карикатурная) английская фамилия Smyth-Postlethwaite не будет дефисом, что может быть хлопотно. Это правильный английский стиль набора текста (он может быть неправильным для других языков), но при необходимости вы можете заменить дефис в имени на , определено
\def\hyph{-\penalty0\hskip0pt\relax}
это не то, что этот FAQ обычно рекомендовал бы...hyphenat пакет определяет набор таких команд (для введения точек переноса при различных знаках препинания).
вы можете \newcommand
команда, которая расширяется до multi-discipli\-nary
(используйте поиск + заменить все, чтобы заменить существующие слова).
проблема (как отметил Кеннитм) заключается в том, что LaTeX не будет переносить слова с тире в них. К счастью, есть стандартный пакет (часть ncctools), который решает эту проблему, называется extdash
. Это определяет новые команды дефиса и тире, которые не нарушают перенос и которые могут разрешать или предотвращать разрывы строк в дефисе/тире. Я предпочитаю использовать его с shortcuts
опция, поэтому я могу использовать, например,\-/
, а не \Hyphdash
. Вот что вы хочу:
\usepackage[shortcuts]{extdash}
...
multi\-/disciplinary
чтобы предотвратить разрыв на этом дефисе, используйте multi\=/disciplinary
(в сторону: Чикагское руководство по стилю советует отбросить дефисы, прикрепляющие аффиксы, такие как "multi", если слово не двусмысленно или непонятно без него.)
Я использую пакет hyphenat
а затем написать сложные слова, как финское слово интернет-yhteys (англ. интернет) как Internet\hyp yhteys
. Выглядит глупо, но кажется самым элегантным способом, который я нашел.
у меня была та же проблема. Я использую 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, что позволяет переносы слов в остальную часть слова. Это общий решение, которое делает все слова, содержащие явные дефисы, дефисами нормально.
отметим, что -
становится макросом, который не полностью расширяется, поэтому попробуйте включить это после загрузки других пакетов, которые могут не ожидать -
быть макрос
Edit: это моя вторая версия, первая версия была менее надежной, когда {
или }
с последующим дефисом. Это не так, но в отличие от первой версии -
в этой версии не полностью расширяемый.
multi\hskip0pt-\hskip0pt disciplinary
вы можете, например, определить как
\def\:{\hskip0pt}
а потом пишите
multi\:-\:disciplinary
обратите внимание, что пакет babel Russian language имеет свой собственный набор тире, которые не запрещают перенос,"~
(двойная цитата+Тильда) например.
multi-disciplinary
не будут перенесены, как пояснил kennytm. Но!--1--> имеет те же возможности переноса, что и multidisciplinary
есть.
Я признаю, что не знаю, почему это работает. Это отличается от описанного поведения здесь (выделено мной):
команда
\-
вставить дискреционный дефис в слово. это также становится единственным пунктом, где перенос допускается в этом слове.
чтобы избежать переносов в уже дефисном слове, я использовал неразрывное пространство ~
в сочетании с обратной пробел \!
. Например, команда
3~\!\!\!\!-~\!\!\!D
используется в тексте, подавить перенос в word 3-D. вероятно, не лучшее решение, но это сработало для меня!