У меня была такая же проблема. Я использую дефис плюс следующий макрос:
\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
от дефиса, позволяющей переносить слова в остальной части слова. Это общее решение, которое делает все слова, содержащие явные дефисы, как обычно.
Обратите внимание, что -
становится макросом, который нельзя развернуть полностью, поэтому попробуйте включить его после загрузки других пакетов, которые могут не ожидать, что -
будет макросом
Редактировать: Это моя вторая версия, первая версия была менее надежной, когда {
или }
следовали за дефисом. Это не так, но в отличие от первой версии -
в этой версии не полностью расширяем.