如何让 LaTeX 将包含破折号的单词连字符?

在我正在编写的 LaTeX 文档中,我得到了一个 超载的 hbox警告,这是因为“多学科”这个词碰巧出现在一行的末尾。

我可以通过将其改为 multi-discipli\-nary来消除这个特殊的警告,但是同样的问题将发生在其他地方,因为这个词在文章中被使用了很多次。

我想改用 \hyphenation{}命令,但显然我暂时使用的 \hyphenation{multi-disci-pli-na-ry}不起作用,因为它不能正确理解第一个破折号。

在已经包含破折号的单词中,我需要什么咒语才能得到正确的缩进?

附加问题: 我自己在哪里可以找到这个问题的答案?

138947 次浏览

来自 https://texfaq.org/FAQ-nohyph:

TeX 不会连接已经连接过的单词 例如,(讽刺)英国姓史密斯-波斯特韦特不会 连字符,这可能是麻烦。这是正确的英语 排版风格(对其他语言可能不正确) ,但如果 需要时,可以用 \hyph代替名称中的连字符 命令,已定义

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

这是 没有的事情,这个常见问题通常会建议..。 hyphenat包定义了一组这样的命令(用于 在各种标点符号中引入连字符)。


或者您可以使用 \newcommand命令扩展到 multi-discipli\-nary(使用 Search + Replace All 替换现有单词)。

我在这里回答了类似的问题: 拉特克斯打断了太多的话

我说:

你应该在前言的某处设置一个连字符惩罚:

\hyphenpenalty=750

750的数值适合我在信纸上(8.5 × 11英寸)使用12寸字体的两栏布局的需要。根据需要调整价值。数字越高,连字符发生的次数就越少。您可能还想看看连字符包,它提供的不仅仅是连字符惩罚

为了避免在已经使用了连字符的单词中使用连字符,我使用了不换行空格 ~和向后的空格 \!。例如,命令

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

可能不是最好的解决方案,但对我很有效!

我使用软件包 hyphenat,然后写复合词,如芬兰词 互联网(英语。网络连接)为 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

Note that this uses the expl3 package from latex3.

它使 -成为一个活动字符,可以向前扫描,看看后面是否跟着更多的破折号。如果是这样,它保持一个 -,以确保 -----继续工作。如果没有,它就变成来自连字符的 \hyp命令,允许单词的其余部分断字。这是一个通用的解决方案,使所有包含显式连字符的单词正常连字符。

请注意,-变成了一个不完全可展开的宏,因此在加载其他可能不希望 -成为宏的包之后,请尝试包含这个宏

编辑: 这是我的第二个版本,当 {}后面跟着一个连字符时,第一个版本不太健壮。这个版本不是,但是与第一个版本不同,这个版本中的 -不是完全可扩展的。

编辑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
multi\hskip0pt-\hskip0pt disciplinary

你可以定义 like

\def\:{\hskip0pt}

然后写作

multi\:-\:disciplinary

注意,babel 俄语包有自己的一组破折号,它们不禁止连字符,例如 "~(双引号 + 波浪线)。

The problem (as KennyTM noted) is that LaTeX won't hyphenate words with dashes in them. Luckily, there's a standard package (part of ncctools) that addresses that very problem, called extdash. This defines new hyphen and dash commands that do not disrupt hyphenation, and which can allow or prevent line breaks at the hyphen/dash. I prefer to use it with the shortcuts option, so I can use, e.g., \-/ rather than \Hyphdash. Here's what you want:

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

若要防止在连字符处断开,请使用 multi\=/disciplinary

(旁白: 芝加哥风格手册建议去掉连接词缀如“ multi”的连字符,除非没有连字符的单词是含糊不清或难以理解的。)

如 kennytm 所解释的,multi-disciplinary不会被连字符,但是 multi-\-disciplinarymultidisciplinary有相同的连字符机会。

I admit that I don't know why this works. It is different from the behaviour described 给你 (emphasis mine):

The command \- inserts a discretionary hyphen into a word. This also becomes the only point where hyphenation is allowed in this word.

因为 Latex 认为多学科是一个单独的单词,并且喜欢使用连字符,所以你可以指出这是两个单独的单词,例如: 多 hspace {0 pt }规程足以解决这个问题。

The babel package for Cyrillic defines the command "= which should be used instead of dash: so you can write по"=своєму and it will correctly hyphenate that word.

但是,对于命令 "=的英语语言,没有定义。 You can define it as follows

\useshorthands{"}
\defineshorthand{"=}{\penalty1000\discretionary{-}{}{-}\penalty10000\hskip0pt}

然后 pseudo"=metric将被正确连接。

实际上,这是从这里得到的答案: Https://tex.stackexchange.com/questions/99334/hyphenation-of-words-connected-with-a-double-triple-dash 其中建议使用组合 "|

使用 "=的一个优点是,当您同时使用西里尔字母和英语时,它现在可以在多语言文档中工作,并且与只使用西里尔字母的文档兼容。