Як змусити LaTeX передати слово дефісом слово, яке містить тире?


107

У документі LaTeX, про який я пишу, я отримую повне попередження hbox через слово "багатодисциплінарність", яке трапляється в кінці рядка.

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

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

Який заклик мені потрібен, щоб отримати правильний відступ у слові, яке вже містить тире?

Бонусне запитання: Де я міг сам знайти відповідь на це питання?


Чому це проблема, щоб слово було порушено на жорсткій гіпені? Хіба не "багато- \ новий рядок" добре?
Джефф Реді

1
Бонусна відповідь: Пошук в Google "латексних переносів" дав усілякі корисні результати, включаючи латексну
Mica

3
@mica: ні, це не так. Я читав усі ці сторінки років тому. @geoff: все було б нормально, якби латекс робив дефіс там. але в цьому прикладі це призведе до "неповного хбоксу", і латекс вирішує взагалі не переношувати дефіс.
Gyom

чи можете ви виконати зворотний нахил першої - у команді \ дефіс?
Брайан Постув

1
Дякуємо за Ваш коментар @DrewSteen. Очевидно, я згоден. Але в моєму захисті не було такого поняття, як tex.SX назад, коли я задавав це питання :-)
Gyom

Відповіді:


52

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

TeX не переносить слова, які вже переносяться дефісом. Наприклад, (карикатурне) англійське прізвище Smyth-Postlethwaite не буде дефісом, що може викликати клопоти. Це правильний англійський стиль набору тексту (він може бути невірним для інших мов), але якщо потрібно, ви можете замінити дефіс в імені \hyph командою, визначеною

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

Це не такий спосіб, який зазвичай рекомендують часто задані питання… У hyphenatпакеті визначається набір таких команд (для введення дефісів у різних символах пунктуації).


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


Дуже дякую. Як я підозрював, "ідеальної" відповіді немає. Оскільки я не єдиний автор у цьому документі, я не хочу дуже примушувати інших використовувати \newcommandвсюди (саме тому я шукав щось на основі \hyphenation). Я думаю, що я просто збережу його за умовчанням "як є" і додаю явні дефіси вручну, коли Latex скаржиться на переповнені скриньки.
Gyom

63

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

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

Для запобігання злому на дефісі використовуйте multi\=/disciplinary

( За винятком: The Chicago Manual Стилю радить скинувши дефіс кріплять афікси , як «мульти», якщо слово не є неоднозначним або незрозумілими без нього.)


Це чудово, але це дає попередження hyperref , коли я використовую його в голові рядки: Package hyperref Warning: Token not allowed in a PDF string. Там працює інше запропоноване рішення ( \def\hyph{-\penalty0\hskip0pt\relax}).
Доктор Ян-Філіп Геркк

1
@ Jan-PhilipGehrcke: ці попередження можна також виправити за допомогою \texorpdfstring(що забезпечує умовну компіляцію для рядків, що входять у заголовки глав). Я приховую використання всередині семантичних макросів (напевно, тут \multidisciplinary). Так, це не ідеально.
Blaisorblade

22

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


6

multi-disciplinaryне буде дефісом, як пояснив kennytm. Але multi-\-disciplinaryмає ті самі переносні можливості, що multidisciplinaryі вони.

Я визнаю, що не знаю, чому це працює. Він відрізняється від описаної тут поведінки (моє наголос):

Команда \-вставляє в слово дискретний дефіс. Це також стає єдиним пунктом, коли в цьому слові дозволена дефіс .


Заміна -на -\-не змінює вихід, принаймні з налаштуваннями за замовчуванням у overleaf.com (можливо, pdflatex, але на друкованій сторінці насправді не йдеться).
Camille Goudeseune

4

У мене була така ж проблема. Я використовую 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.

Це робить -активного персонажа, який сканує вперед, щоб побачити, чи не за ним більше тире. Якщо це так, він залишається a -, щоб переконатися --і ---продовжувати працювати. Якщо ні, то це стає \hypкомандою від переноса, що дозволяє переривати слова в решті слова. Це загальне рішення, завдяки якому всі слова, що містять явні дефіси, переносяться нормально.

Зауважте, що -макрос стає не повністю розширюваним, тому спробуйте включити його після завантаження інших пакетів, які, можливо, не очікують -бути макросом

Редагувати: Це моя друга версія, перша версія була менш надійною, коли дефіс {або }після нього. Цього немає, але на відміну від першої версії, -цю версію не можна повністю розширити.


3
multi\hskip0pt-\hskip0pt disciplinary

Ви можете, наприклад, визначити, як

\def\:{\hskip0pt}

а потім пишіть

multi\:-\:disciplinary

Зауважимо, що в пакеті російської мови для вавилонської є свій набір тире, який не забороняє переносу "~(наприклад, подвійна цитата + тильда).


1
Повинно бути multi-\hskip0pt disciplinary. Як і у вас MWE, він буде занадто сильно розкриватися. Просто встановіть \setlength{\textwidth}{0.1cm}для того, щоб спробувати це.
LaRiFaRi

-3

Я відповів щось подібне тут: LaTeX розбиває занадто багато слів

Я сказав:

ви повинні встановити штраф за дефіс десь у своїй преамбулі:

\hyphenpenalty=750

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


1
Він запитує, як уникнути переносу, а не про те, як визначити межі.
Андрас Гьомрей

-4

Щоб уникнути переносу в тексті вже дефісом, я використовував пробіл ~у поєднанні з відсталим пробілом \!. Наприклад, команда

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

використовується в тексті, придушити дефіс у слові 3-D. Напевно, не найкраще рішення, але воно працювало на мене!


4
Це відповідає на протилежне запитання про те, що було задано. Крім того , як людина , який намагався змінити свій пост в точку , що із зазначених, є набагато кращий спосіб зробити те , що ви зробили: \mbox{3-D}.
zwol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.