在我正在编写的 LaTeX 文档中,由于“多学科”一词恰好出现在一行的末尾,我收到了一个过满的 hbox 警告。
我可以通过将它更改为 multi-discipli\-nary
来摆脱这个特殊的警告,但同样的问题也会发生在其他地方,因为这个词在论文中被大量使用。
我想改用 \hyphenation{}
命令,但显然我试探性的 \hyphenation{multi-disci-pli-na-ry}
不起作用,因为它不能正确理解第一个破折号。
我需要什么咒语才能在已经包含破折号的单词中获得正确的缩进?
奖励问题:我自己在哪里可以找到该问题的答案?
问题(正如 KennyTM 所指出的)是 LaTeX 不会用破折号连字符连接单词。幸运的是,有一个标准包(ncctools 的一部分)可以解决这个问题,称为 extdash
。这定义了新的连字符和破折号命令,它们不会中断连字符,并且可以允许或防止在连字符/破折号处换行。我更喜欢将它与 shortcuts
选项一起使用,因此我可以使用 \-/
而不是 \Hyphdash
。这就是你想要的:
\usepackage[shortcuts]{extdash}
... multi\-/disciplinary
为防止在该连字符处中断,请使用 multi\=/disciplinary
(除此之外:The Chicago Manual of Style 建议删除附加诸如“multi”之类的词缀的连字符,除非这个词没有它就模棱两可或难以理解。)
从 https://texfaq.org/FAQ-nohyph:
TeX 不会对已经连字符的单词进行连字符。例如,(漫画)英文姓氏 Smyth-Postlethwaite 不会连字符,这可能很麻烦。这是正确的英文排版样式(其他语言可能不正确),但如果需要,您可以将名称中的连字符替换为 \hyph 命令,定义为 \def\hyph{-\penalty0\hskip0pt\relax}这不是本常见问题解答通常会推荐的那种东西…… hyphenat 包定义了一组这样的命令(用于在各种标点符号处引入连字符点)。
或者您可以 \newcommand
扩展为 multi-discipli\-nary
的命令(使用搜索 + 全部替换来替换现有单词)。
\newcommand
(这就是我寻找基于 \hyphenation
的东西的原因)。我想我会默认保持“原样”,并在 Latex 抱怨 hbox 过满时手动添加显式连字符。
我使用包 hyphenat
,然后将复合词如芬兰词 Internet-yhteys(英语。Internet 连接)写为 Internet\hyp yhteys
。看起来很傻,但似乎是我发现的最优雅的方式。
如 kennytm 所述,multi-disciplinary
不会被连字符。但是 multi-\-disciplinary
具有与 multidisciplinary
相同的断字机会。
我承认我不知道为什么会这样。它不同于描述的行为 here(强调我的):
命令 \- 在单词中插入任意连字符。这也成为该单词中允许连字的唯一点。
-
替换为 -\-
不会改变输出,至少使用 overleaf.com 中的默认设置(可能是 pdflatex,但 overleaf 实际上并没有说明)。
multi\hskip0pt-\hskip0pt disciplinary
例如,您可以定义为
\def\:{\hskip0pt}
然后写
multi\:-\:disciplinary
请注意,babel 俄语语言包有自己的一组破折号,它们不禁止连字符,例如 "~
(双引号+波浪号)。
multi-\hskip0pt disciplinary
。就像你的 MWE 一样,它会过度宣传。只需设置 \setlength{\textwidth}{0.1cm}
即可尝试。
我有同样的问题。我使用 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
请注意,这使用了来自 latex3 的 expl3 包。
它使 -
成为向前扫描的活动字符,以查看其后是否有更多破折号。如果是这样,它保持为 -
,以确保 --
和 ---
继续工作。如果不是,它将成为 hyphenat 中的 \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
/futurelet
上似乎出现了一些错误
由于 Latex 认为多学科是具有首选连字符的单个词,因此您可以指出这是两个单独的词,例如:multi-\hspace{0pt}学科就足以解决这个问题。
我在这里回答了类似的问题:LaTeX breaking up too many words
我说:
您应该在序言中的某处设置断字惩罚:
\hyphenpenalty=750
750 的值适合我在信纸(8.5x11 英寸)上使用 12 pt 字体进行两列布局的需要。调整值以满足您的需要。数字越大,出现的断字越少。您可能还想看看 hyphenatpackage,它提供的不仅仅是断字惩罚
为了避免在已经连字符的单词中出现连字符,我将不间断空格 ~
与向后空格 \!
结合使用。例如,命令
3~\!\!\!\!-~\!\!\!D
在文本中使用,抑制单词 3-D 中的断字。可能不是最好的解决方案,但它对我有用!
\mbox{3-D}
。
Package hyperref Warning: Token not allowed in a PDF string
。在那里,另一个建议的解决方案 (\def\hyph{-\penalty0\hskip0pt\relax}
) 有效。\texorpdfstring
修复(它为进入章节标题的字符串提供条件编译)。我将使用隐藏在语义宏中(这里可能是\multidisciplinary
)。是的,它并不完美。