118

在我正在编写的 LaTeX 文档中,由于“多学科”一词恰好出现在一行的末尾,我收到了一个过满的 hbox警告。

我可以通过把它改成 来摆脱这个特殊的警告multi-discipli\-nary,但是同样的问题也会在其他地方发生,因为这个词在论文中被大量使用。

我想改用该\hyphenation{}命令,但显然我的试探性\hyphenation{multi-disci-pli-na-ry}不起作用,因为它无法正确理解第一个破折号。

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

奖励问题:我自己在哪里可以找到该问题的答案?

4

9 回答 9

67

问题(正如 KennyTM 所指出的)是 LaTeX 不会用破折号连字符连接单词。幸运的是,有一个标准包(ncctools 的一部分)可以解决这个问题,称为extdash. 这定义了新的连字符和破折号命令,它们不会中断连字符,并且可以允许或防止在连字符/破折号处换行。我更喜欢将它与shortcuts选项一起使用,因此我可以使用,例如,\-/而不是\Hyphdash. 这就是你想要的:

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

为防止在该连字符处中断,请使用multi\=/disciplinary

(旁白:《芝加哥风格手册》建议去掉连接诸如“multi”之类的词缀的连字符,除非这个词没有它就模棱两可或难以理解。)

于 2011-12-27T20:48:45.897 回答
55

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

TeX 不会对已经连字符的单词进行连字符。例如,(漫画)英文姓氏 Smyth-Postlethwaite 不会连字符,这可能很麻烦。这是正确的英文排版样式(其他语言可能不正确),但如果需要,可以将名称中的连字符替换为\hyph 命令,定义

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

不是本常见问题解答通常会推荐的那种东西……该hyphenat软件包定义了一组这样的命令(用于在各种标点符号处引入连字符点)。


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

于 2010-02-03T16:17:25.427 回答
26

我使用包hyphenat,然后将复合词如芬兰词Internet-yhteys(英语。互联网连接)写成Internet\hyp yhteys. 看起来很傻,但似乎是我发现的最优雅的方式。

于 2010-12-15T20:11:38.507 回答
7

multi-disciplinary正如 kennytm 所解释的那样,不会被连字符。但multi-\-disciplinary具有相同的断字机会multidisciplinary

我承认我不知道为什么会这样。它与此处描述的行为不同(强调我的):

该命令\-在单词中插入任意连字符。这也成为该单词中允许连字的唯一点

于 2015-09-17T15:57:14.870 回答
5

我有同样的问题。我使用连字符加上以下宏:

\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连字符的命令,在单词的其余部分启用单词中断。这是一个通用的解决方案,它使所有包含显式连字符的单词正常连字符。

请注意,它会变成一个不能完全扩展的宏,因此请在加载其他可能不会是宏的-包后尝试包含它-

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

编辑 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
于 2011-08-08T11:05:22.823 回答
5
multi\hskip0pt-\hskip0pt disciplinary

例如,您可以定义为

\def\:{\hskip0pt}

然后写

multi\:-\:disciplinary

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

于 2011-11-10T05:56:48.853 回答
-1

由于 Latex 认为多学科是具有首选连字符的单个词,因此您可以指出这是两个单独的词,例如:multi-\hspace{0pt}学科就足以解决这个问题。

于 2022-02-27T17:04:49.233 回答
-2

我在这里回答了类似的问题:LaTeX 分解了太多单词

我说:

您应该在序言中的某处设置断字惩罚:

\hyphenpenalty=750

750 的值适合我在信纸(8.5x11 英寸)上使用 12 pt 字体进行两列布局的需要。调整值以满足您的需要。数字越大,出现的断字越少。您可能还想看看 hyphenatpackage,它提供的不仅仅是断字惩罚

于 2010-02-03T16:31:42.527 回答
-3

为了避免在已经连字符的单词中出现连字符,我将不间断空格~与后向空格结合使用\!。例如,命令

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

在文本中使用,抑制单词 3-D 中的断字。可能不是最好的解决方案,但它对我有用!

于 2010-05-12T22:32:59.513 回答