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


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

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

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

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

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

8 89

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

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

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

multi\hskip0pt-\hskip0pt disciplinary

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

\def\:{\hskip0pt}

а потом пишите

multi\:-\:disciplinary

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

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

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

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

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

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

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

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