私も同じ問題を抱えていました。ハイフナットと次のマクロを使用します。
\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
これは latex3 の expl3 パッケージを使用することに注意してください。
これにより、-
アクティブな文字が前方にスキャンされ、その後にさらにダッシュが続くかどうかが確認されます。もしそうなら、それは のままで-
、確実--
に動作し---
続けます。そうでない場合は、\hyp
ハイフナからのコマンドになり、単語の残りの単語の区切りを有効にします。これは、明示的なハイフンを含むすべての単語を通常どおりハイフネーションする一般的なソリューションです。
-
完全に展開できないマクロになることに注意してください。マクロであるとは-
思われない他のパッケージをロードした後、これを含めるようにしてください。
編集:これは私の 2 番目のバージョンです。最初のバージョンは、ハイフンの後に{
orが続くと堅牢性が低下しました。}
これはそうではありませんが、最初のバージョンとは異なり、-
このバージョンの は完全には拡張できません。
編集2:これを修正するための私のモジュールは、次のようになりました。私はもう Latex を使用しておらず、これを書いたのは 10 年以上も前のことなので、以下がまだ機能するかどうかはわかりません。買い手責任負担!
\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
% The original hyphen is available as the \hp command.
\ExplSyntaxOn
\cs_new:Npn \hp {-}
% make hyphen the normal character
\cs_new:Npn \hyphenfixdisabled {
\catcode`\-=12\relax
}
\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}
\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}
\cs_new:Npn \hyphenfix_ignore:c {-}
\catcode`\-=\active
%Making hyphen an active character throughout a document can lead to unexpected errors, especially if it is being edited by multiple persons. This note command at the beginning of what will be the meaning of `-' will hopefully help diagnose errors resulting from hyphen behaving unexpectedly.
\catcode`\!=11
\catcode`\.=11
\let \Note:hyphen_is_an_active_character!_see_hyphenfix.tex! \relax
\cs_new_protected:Npn \hyphenfix_fixhyphen:w{
\if_mode_math:
\hp
\else: \use_i_after_fi:nw {
\Note:hyphen_is_an_active_character!_see_hyphenfix.tex!
\futurelet\hyphenfix_nexttok\hyphenfix_i:w
}
\fi:
}
\catcode`\!=12
\catcode`\.=12
\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
}
}
\cs_new:Npn \hyphenfixenable {
\catcode`\-=\active
\let-\hyphenfix_fixhyphen:w
}
\cs_new:Npn \hyphenfixdisable {
\let-\hyphenfix_ignore:c
\catcode`\-=12\relax
}
\catcode`\-=12\relax
\ExplSyntaxOff